一. 请求转发和重定向
(1)请求转发:
request.getRequestDispatcher(URL地址).forward(request, response)
处理流程:
客户端发送请求,Servlet做出业务逻辑处理。
Servlet调用forword()方法,服务器Servlet把目标资源返回给客户端浏览器。
2)重定向:
response.sendRedirect(URL地址)
处理流程:
客户端发送请求,Servlet做出业务逻辑处理。
Servlet调用response.sendReadirect()方法,把要访问的目标资源作为response响应头信息发给客户端浏览器。
客户端浏览器重新访问服务器资源xxx.jsp,服务器再次对客户端浏览器做出响应。
重定向
以上两种情况,你都需要考虑Servlet处理完后,数据如何在jsp页面上呈现。图例是请求、响应的流程,没有标明数据如何处理、展现。
JavaWeb 重定向与请求转发的区别和执行流程(图解分析)
https://blog.csdn.net/u010452388/article/details/80398929?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
重定向和请求转发的区别:
重定向:response.sendRedirect("list.do");
- 地址上显示的是最后的那个资源的路径地址
- 请求次数至少有两次,服务器在第一次请求后,会返回一个地址,浏览器可以根据这个地址,执行第二次访问
- 可以跳转至仁义路径,不是自己的工程也可以跳
- 效率低一些
请求转发: request.getRequestDispatcher("../login.jsp");
- 地址上显示的是请求Servlet的地址
- 请求次数只有一次
- 只能跳转到自己的工程
- 效率更高
最根本的如果跳转到的是资源文件比如jsp文件,那么就用重定向((request.getRequestDispatcher("路径"))。如果是跳转到Servlet地址,那么要用的请求转发response.sendRediect)。
1、response.sendRedirect(url)
是指请求重定向,原来页面的参数在这里是得不到的,即用request.getParameter("param")返回的是null
2、forward请求转发,指将原页面的request,response对象传入新的页面,因此这新旧页面拥有相同的 request,response对象。这样request.getParameter("param")就可以得到相应的值
3、区分ServletContext.getRequestDispatcher与 ServletRequest.getRequestDispatcher
ServletContext.getRequestDispatcher 路径必须是相对上下文的绝对路径
ServletRequest.getRequestDispatcher 可以是相对也可以是绝对
4、注意的一点是:使用forward转发后在浏览器上看到的地址栏显示的是转发前的还不是转发后的。如由test.jsp向good.jsp转发了,那么地址栏显示的是test.jsp.这是因为forward是在服务器端进行的,浏览器根本不知道,而重定向是在客户端进行的,所以使用response.sentRedirect("red.jsp")会直接定向到red.jsp。由此想到index.jsp如果请求的是servlet那么在servlet中进行forawrd转发到另一个red.jsp页面,但当查看结果时,在地址栏显示的将只是servlet的名称而不是red.jsp,如果你想知道最终看到的页面的名称那只有查代码了。
reference it:
服务器端进行转向的4种方法:
ServletContext的getRequestDispatcher()
ServletContext的getNamedDispatcher()
ServletRequest的getRequestDispatcher()
ServletResponse的sendRedirect()进行转向。
1.2.3 => forward() 4. sendRedirect()
使用forward方法,因为这些这样比较高效。只有在forward方法不能使用时(比如要转向到一个非本web应用),再使用ServletResponse的sendRedirect()方法。
与 sendRedirect 方法的比较
虽然 与 sendRedirect 方法,都可以将浏览器浏览的网页,重导至另一个网页,但是两者在原理上是不太相同。
a. : 动作是利用伺服端,将资料输出至缓冲区的机制,在前一个网页尚未输出到客户端前,取消资料的输出,然后输出另一个网页的资料,达到重导浏览器的效果。
优点: 两网页间可以分享 request 对象内的变量。
b. sendRedirect : 动作是透过 HTTP 协议的 Header , 对浏览器下达重导指令,因此,不牵涉到服务器端缓冲区的问题。
不过由于 sendRedirect 方法作用于客户端,所以重导前后网页无法分享存在于 request 对象内的变量。
Solution: response.sendRedirect(“sendRedirect.htm?name=sparkwu&E-Mail=spark.wu@cobra-tech.com”)