Servlet跳转页面
servlet跳转页面的方法:
跳转分为两部分,一部分发生在servlet,另一部分发生在JSP,JSP就是servlet,但是两者还是有部分差异。
一、Servlet:(跳转发生在doGet,doPost等方法里)
(1)response.sendRedirect("/index.jsp");页面的路径是相对路径。
sendRedirect可以将页面跳转到任何页面,不一定局限于web应用中,如:response.sendRedirect(“http://www.baidu.com”);
跳转后浏览器地址发生变化,只能在url总带parameter或者放在session中,无法使用request.setAttribute来传递值。
(2)forward方式
request.getRequestDispatcher("/index.jsp").forward(request,response);页面的路径是对路径。
forward方式只能跳转到本web应用中的页面上。跳转后地址栏不会发生变化。使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
二、JSP:
(1)response.sendRedirect();
和servlet的response.sendRedirect()方式一样,
跳转后浏览器地址栏会变化,如果要跳转到不同主机下,跳转后,此语句后面的语句,如同新开了线程,但是对response的 操作已经没有意义了;如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
(2)response.setHeader(“Location”,"");
跳转后浏览器地址栏发生变化,此语句后面的语句执行完成后才能发生调转
(3)<jsp:forward page=""/>
跳转后浏览器地址栏不变,但是只能跳转到当前主机下,此语句后面的执行语句执行完成后才会跳转。
三、请求转发 RequestDispatcher.forward方法和响应(重定向)转发 HttpServletResponse.sendRedirect方法的总结比较:
-
RequestDispatcher.forward方法只能将请求转发给同一个web应用中的组件,而HttpServletResponse.sendRedirect方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给HttpServletResponse.sendRedirect方法的相对URL以"/“开头,它是相对于整个web站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以”/"开头,它是相对于当前web应用程序的根目录。
-
调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址重定向为目标URL;而调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
-
HttpServletResponse.sendRedirect方法对浏览器请求直接作出响应,响应的结果就是告诉浏览器重新发出对另一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部发生了转发行为。
-
RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个web应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法。不同web应用程序之间的重定向,特别是要重定向到另一个web站点上的资源情况,都应该使用HttpServletResponse.sendRedirect方法。
-
无论哪种方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区已 经有了一些内容,这些内容将从缓冲区中清除。
重定向和请求转发有一个重要的不同:
- 当使用请求转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。