请求转发和重定向的区别
1. 请求转发:
代码:
request.getRequestDispatcher("×××.jsp").forward(request,response);
过程:
1. 客户端发送请求到服务器,Servlet做业务逻辑处理;
2. Servlet 调用forward()方法,服务器Servlet把目标资源返回给客户端浏览器。
2. 重定向
代码:
response.sendRedirect("×××.jsp");
过程:
1. 客户端发送请求,Servlet做出业务逻辑处理;
2. Servlet调用response.sendRedirect()方法,把要访问的目标资源作为response响应头信息发给客户端浏览器。
3. 客户端浏览器重新访问服务器资源xxx.jsp,服务器再次对客户端浏览器做出响应。
3. 二者存在的路径问题
- 使用相对路径在重定向和转发中没有区别
- 二者若使用绝对路径时,根/路径代表了不同含义
重定向response.sendRedirect(“URL”)是服务器向客户端发送一个请求头信息,由客户端再请求一次服务器。" / “ 指的Tomcat的根目录,写绝对路径应该写成" /项目名称/资源名" 。如"/WebModule/login.jsp"。
转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序。绝对路径写法就是"/login.jsp"或"/servlet/LoginServlet"。
4. 二者的区别
请求转发:
a.jsp-----请求1------>servlet.java-----请求1------>c.jsp
跳转到c.jsp后,浏览器的地址为访问servlet.java的地址,刷新时依旧是该地址,因此又向c.jsp再次发送请求,导致重复提交请求。它是一次请求,且RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法;地址栏可以携带作用域的值,即可通过request.getAttribute()传递数据;转发只能转发到本项目下的路径。
重定向:
a.jsp-----请求1---->servlet.java
servlet.java----发送新的url----->a.jsp
a.jsp------请求2---->servlet.java----->c.jsp
跳转到c.jsp后,浏览器的地址为访问c.jsp的地址,刷新时依旧是该地址,因此不会再次发送请求,从而不会导致重复提交请求。它是两次请求,且sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。它不能携带request作用域的值,故它的请求全部是get请求,若要传递request作用域的值,则将作用域的值存储在session中,后面从session中取出值;重定向可以跳转到本项目外;增删改完成后的跳转都用重定向,若用请求转发会出现表单重复提交的问题。
说明:本文图片出自 https://blog.csdn.net/qq_34111779/article/details/78164027