全部博文(2065)
分类: Java
2010-03-21 13:17:20
JSP里面的forward与sendRedirect区别
[整理人:遥方 整理时间:
很容易搞混淆现在整理一下,以备后用!
1.RequestDispatcher.forward()
是在服务器端起作用,当使用forward()时,Servletengine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递.
心得:可以这样来理解forward的作用其实相当于是一个中介。客户端将数据提交到A(可以为servlets也可以为jsp 然后它不做任何处理(也可以做相关的业务处理)再直接从服务器端将请求转丢给其他的下一个servlets或jsp处理)在另外一个JSP页面还可以接收到相关的客户端来的参数然后进行相关的运算处理。当然不一定是JSP也可以是HTML。而且forward到的另外一个地址只是能相对的地址不可以写绝对地址。如:
rd = sc.getRequestDispatcher(""); //IllegalArgumentException 抛这个异常信息出来. 不可以重定向到一个绝对地址值的!
rd.forward(request, response);
示例:
Index.jsp代码如下:
name:
pass:
我们的UsersServlets代码如下:
response.setContentType("text/html;
charset=utf-8");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/regsave.jsp");
//直接就将其转向到另外一个JSP页面处理
rd.forward(request, response);
regsave.jsp代码:
你提交的用户名:<%=request.getParameter("user")%>//直接获取客户端参数了
但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过
response.setAttribute("name",name)来传至下一个页面.重定向后浏览器地址栏URL不变.
这个你看:重定向后的URL地址:
而不是并没有发生变化的
因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到 一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。[是的甚至可以发送给另外一个HTML页面中去]
注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个异常.
注意:因为URL值并没有变化所以如果此时你再点页面刷新操作的话就会出现重复提交了。
2. response.sendRedirect()
是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,且在浏览器地址栏上会出现重定向页面的URL.
总结:
1、
浏览器端即客户端做重定向处理
2、
可带参数
3、
可写绝对路径而且浏览器的URL也会切换过来
用官方话来讲:
这个方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect
("")也可以使用相对的URL。如果location以"/"开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现
三、如何选择?
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRedirect ()方法。