Servlet中的Forward与Redirect
程序员文章站
2022-06-10 11:23:52
...
http://blog.csdn.net/christymomo/article/details/5418968
在Servlet(JSP)中Forward与Redirect 的区别:
- forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
- forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
- 基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。
- sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下找 url:http://10.1.18.8:8081/login.jsp。而forward不能这样处理相对路径。
Servlet中的Forward与Redirect:
需要用到的类与方法有
- ServletRequest.getRequestDispatcher(String)
- RequestDispatcher.forward(request, response)
- HttpServletResponse.sendRedirect(String)
Forward:
RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp"); dispatcher .forward(request, response);
request.getNamedDispatche("ServletName").forward(request, response)
页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。跳转后浏览器地址栏不会变化。使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
Redirect:
response.sendRedirect("/index.jsp"); response.sendRedirect("http://www.google.com");
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中。跳转后浏览器地址栏变化。这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
JSP中的forward跟redirect:
Redirect:
response.sendRedirect();
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client. at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558) ...
跳转后浏览器地址栏变化。如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
Forward:
<jsp:forward page="" />
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed. at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134) at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101) at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836) ...
跳转后浏览器地址栏不变,但是只能跳到当前主机下。此语句后面的语句执行完成后才会跳转
上一篇: 一个简单的ajax
推荐阅读
-
Android中Service与Activity之间通信的几种方式
-
java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法示例
-
iOS中.a和.framework静态库的创建与.bundle资源包的使用详解
-
浅谈django中的认证与登录
-
ASP.NET中readonly与const的区别详解
-
iOS中Label实现显示不同颜色与字体的方法
-
在Framework 4.0中:找出新增的方法与新增的类(二)
-
VS2010中lib与dll文件的生成与使用方法
-
在Framework 4.0中:找出新增的方法与新增的类(一)
-
C#中is与As运算符号的使用详解