页面转发的区别:
在Servlet中两种实现:
forward方式:
request.getRequestDispatcher(“/somePage.jsp”).forward(request, response);
redirect方式:
response.sendRedirect(“/somePage.jsp”);
forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;
redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的来往。当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。
forward 会将 request state , bean 等等信息带往下一个 jsp;
redirect 是送到 client 端后再一次 request , 所以资料不被保留。
使用 forward 你就可以用 getAttribute() 来取得前一个 jsp 所放入的 bean 等等资料。
forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,它不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取。
redirect是完全的跳转,浏览器将会得到跳转的地址, 并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,forward更加高效,在forward可以满足需要时,尽量使用RequestDispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRedirect()方法。
forward与include共享Request范围内的对象,而redirect则不行,即:如果一个java bean被声明为request范围的话,则被forward到的资源也可以访问这个java bean,而redriect则不行。
forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: res.sendRedriect(“http://www.baidu.com“);
forward:一般用于用户登录的时候,根据角色转发到相应的模块。
redirect:一般用于用户注销登录时返回主页面或跳转到其它的网站等。
从效率来说:
forward:高 redirect:低
例子:
<jsp:forward page="/servlet/login">
<jsp:param name="username" value="jsmith" />
</jsp:forward>
描述
<jsp:forward>
标签从一个jsp文件向另一个文件传递一个包含用户请求的request对象.<jsp:forward>
标签以下的代码,将不能执行.
你能够向目标文件传送参数和值,在这个例子中我们传递的参数名为username,值为jsmith,如果你使用了<jsp:param>
标签的话,目标文件必须是一个动态的文件,能够处理参数.
如果你使用了非缓冲输出的话,那么使用<jsp:forward>
时就要小心。
如果在你使用<jsp:forward>
之前,jsp文件已经有了数据,那么文件执行就会出错.
总结:
- Redirect等于客户端向服务器发出两次request,同时也接受到两次response;Forward却只是一次request一次response。相比之下,Forward性能更高。
- Forward能够存储request Scope的Attribute而Redirect却不行。
- Forward的同时URL并不会变。
- Forward需要在Servlet中需要通过一个Dispatcher来实现。
- Redirect能够防止某些情况下客户端Refresh造成的一些未知后果(例如连续删除)。