sendRedirect方法用于生成302响应码和Location响应头,从而通知客户端去从新访问Location响应头中指定的URL。html
RedirectServlet.javajava
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RedirectServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); // 一、写入到输出缓冲区中的内容尚未被真正传送到客户端,sendRedirect方法就能够被正确执行 // 而且将输出缓冲区中原来或调用方法后写入的内容都清空,因此下面两条打印语句都不会显示 out.println("before sendRedirect"); response.sendRedirect(request.getContextPath() + "/test.html"); // 与上面语句效果同样 //response.sendRedirect("../test.html"); // 相对URL以“/”开头,则相对于Tomcat的虚拟根目录,而不是相对于当前Web应用程序的根目录(虚拟目录) // 访问报404,URL是localhost:8888/test.html //response.sendRedirect("/test.html"); out.println("after sendRedirect"); } }
在浏览器输入http://localhost:8888/testSendRedirect/servlet/RedirectServlet地址,页面显示为:web
注意,此时的URL是test.hmtl自己的路径,而不是RedirectServlet的路径浏览器
Web浏览器——————发出HTTP请求(到)——————Web容器;缓存
Web浏览器 Web容器————首次访问,容器建立目标servlet————servlet(servlet1)服务器
web容器建立请求对象和响应对象ide
web容器调用servlet1的service方法并将请求对象和响应对象传递给该方法spa
servlet1对象的service方法从请求对象中读取请求信息,这时也能够在响应对象中写入部分响应头和响应体数据code
service方法向web容器发出forward命令表示要跳转到servlet2,web容器清空当前所写入的响应体内容,并调整请求头中的信息htm
web容器根据forward命令调用servlet2对象,若是初次访问则加载建立servlet2对象
web容器调用servlet2的service方法,并将请求对象和响应对象传递给该方法。注意,这里传递的仍是调用servlet1时所建立的request和response对象
servlet2对象的service方法从请求对象中读取请求信息,并向响应对象中写入响应头和响应体信息
servlet2的service方法执行完毕后返回
servlet1的service方法继续执行调用forward方法的语句后面的代码,执行完毕后返回
web容器从响应对象中读取响应信息
web容器将响应信息发送给浏览器处理和显示,一次请求响应过程彻底结束,request和response变成垃圾,等待垃圾回收器回收
Web浏览器——————发出HTTP请求(到)——————Web容器;
Web浏览器 Web容器————首次访问,容器建立目标servlet————servlet(servlet1)
web容器建立请求对象和响应对象
web容器调用servlet1的service方法并将请求对象和响应对象传递给该方法
servlet1对象的service方法从请求对象中读取请求信息,并将包含重定向的响应头信息写入到响应对象中。
service方法执行完毕后返回
web容器从响应对象中读取响应信息
web容器把包含重定向的响应信息发送给浏览器。一次请求响应过程彻底结束,request和response变成垃圾,等待垃圾回收器将其完全从内存中清除。
web浏览器根据上次返回的重定向URL发出新的HTTP请求,这个请求甚至能够指向另一个站点,web浏览器又开始一次全新的请求响应过程。
若是请求资源为servlet并首次访问,web容器则加载和建立该servlet对象。
web容器建立请求对象和响应对象
web容器调用servlet2的service方法并将请求对象和响应对象传递给该方法
servlet2对象的service方法从请求对象中读取请求信息,并向响应消息对象中写入响应头和响应体消息
service方法执行完毕后返回
web容器从响应对象中读取响应信息
web容器将响应信息发送给浏览器处理和显示,新的请求响应过程彻底结束,request和response变成垃圾,等待垃圾回收器回收
forward方法只能将请求转发给同一个web应用中的组件;而sendRedirect方法不只能够重定向到当前应用程序中的其余资源,还能够是同一个站点上的其余资源,甚至是使用绝对URL重定向到其余站点的资源。若是传递给sendRedirect方法的相对URL以“/”开头,它是相对于整个web站点的根目录(若是不指定则是以当前页面为相对路径);建立RequestDispatcher对象时指定的相对UR必须以“/”开头(不这样则报错),它是相对于当前web应用程序的根目录。
调用sendRedirect方法重定向的访问过程结束后,浏览器由初始的URL变为重定向目标的URL;而调用forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL。
sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去从新发出对另一个URL的访问请求。forward方法在服务器端内部将请求转发给另一个资源,浏览器只知道发出了请求并获得了响应结果,并不知道在服务器程序内部发生了转发行为。
forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
不管forward方法仍是sendRedirect方法,在调用它们以前,都不能有内容已经被实际输出到了客户端。若是缓存区中已经有了一些内容,这些内容将被清除掉。