java请求重定向与请求转发##
请求的转发和重定向的本质区别:
在于我们当使用转发时,jsp容器将使用一个内部方法来调用我们想要转发的页面,新的页面处理另一个请求,全过程只有一个url 而在此过程中Web浏览器是不清楚这个重新调用的过程。
而重定向是一个页面通知浏览器发送一个新的页面请求,所以Web浏览器是发送了2次请求,浏览器中的url是会发生改变的,会变成新的URL。
重定向
–
例子中重定向的过程:
点击 Redirect 进行重定向
- RedirectServlet 类(执行重定向到 testServlet类)
package com.atigu.javaweb;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("RedirectServlet's doGet");
request.setAttribute("name", "xyzmn");
System.out.println("RedirectServlet's name: " + request.getAttribute("name"));
//执行请求的重定向, 直接调用 response.sendRedirect(path) 方法,
//path 为要重定向的地址
String path = "testServlet";
response.sendRedirect(path);
}
}
- testservlet (重定向到的servlet)
package com.atigu.javaweb;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet's doGet 方法. ");
System.out.println("TestServlet's name: " + request.getAttribute("name"));
}
}
response.sendRedirect()方法是重定向的核心方法
转发
- ForwardServlet
package com.atigu.javaweb;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ForwardServlet's doGet");
request.setAttribute("name", "abcde");
System.out.println("ForwardServlet's name: " + request.getAttribute("name"));
//请求的转发.
//1. 调用 HttpServletRequest 的 getRequestDispatcher() 方法获取 RequestDispatcher 对象
//调用 getRequestDispatcher() 需要传入要转发的地址
String path = "testServlet";
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/" + path);
//2. 调用 HttpServletRequest 的 forward(request, response) 进行请求的转发.
requestDispatcher.forward(request, response);
}
}
RequestDispatcher 实例对象是由Servlet对象创建的,它用于包装一个要被其他资源调用的资源,其接口中定义了两个方法(forward, include)。这两个方法接受的两个参数传递给当前Servlet 的service方法的ServiceRequest 和Servletresponse对象,
显示页面
<body>
<a href="loginServlet">Test</a>
<br><br>
<a href="forwardServlet">Forward</a>
<br><br>
<a href="redirectServlet">Redirect</a>
</body>
请求转发流程总结:
-
在请求转发中,Web 浏览器发出HTTP请求到Web容器中,Web容器首次访问,容器才创建目标Servlet , Web 容器创建请求和响应对象(request、response)
-
web容器调用Servlet的Service(ServletRequest req,ServletResponse res) 方法, 根据Servlet 写入响应信息,发出forward命令到Web容器中。
-
Web容器初次访问创建的Servlet2,并调用Servlet2的service方法返回Web容器的响应
-
然后Servet1 service 方法返回到Web容器中
-
读取响应信息,发出http响应。
-
请求重定向
关键在于其Web容器子啊读取Servlet响应信息后。
发送HTTP响应给浏览器
然后Web浏览器重新发送包含重定向HTTP信息
总结具体区别点:
①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址
②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.
③. 请求的转发: 只能转发给当前 WEB 应用的的资源
请求的重定向: 可以重定向到任何资源.
④. 请求的转发: / 代表的是当前 WEB 应用的根目录
请求的重定向: / 代表的是当前 WEB 站点的根目录.