JavaWeb(7)之请求转发与重定向

JavaWeb(7)之请求转发与重定向

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

请求转发

现有如下两个 Servlet:

// /test1
package com.zze.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TestServlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet1");
        request.getRequestDispatcher("/test2").forward(request,response);
    }
}
// /test2
package com.zze.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TestServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet2");
        response.getWriter().write("from TestServlet2");
    }
}

访问 localhost:8080/test1,输出结果:

from TestServlet1
from TestServlet2

image.png

重定向

// /test1
package com.zze.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TestServlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet1");
        response.sendRedirect("/test2");
        /*
        相当于:
        response.setStatus(302);
        response.setHeader("Location","/test2");
        */
    }
}
// /test2
package com.zze.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TestServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet2");
        response.getWriter().write("from TestServlet2");
    }
}

访问 localhost:8080/test1,输出结果:

from TestServlet1
from TestServlet2

image.png

总结

  1. 地址栏:重定向显示的是最后显示的资源地址;而请求转发显示的是最初请求的那个地址。
  2. 请求次数:重定向最少有两次请求,服务器在接收到请求后,会通过返回状态码 302 告知浏览器需要重定向,通过响应头中的 Location 告知浏览器重定向位置;而请求转发只有一次,因为服务器内部帮客户端执行了后续的工作。
  3. 跳转路径:重定向可以跳转到任意路径,不是自己的工程路径也可以跳转;请求转发只能在当前项目路径中跳转。
  4. request 对象:因为重定向就是发起一个新的请求,所以 request 就是一个新的 request 对象,无法使用上一次的 request 对象;而请求转发本质上还是同一次请求,所以可以正常使用初始请求对象。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/javaweb7.html

Buy me a cup of coffee ☕.