赞
踩
简介:
request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 这个是在服务端运行的,对浏览器来说是透明的。
response.sendRedirect()是重新定向,前后页面不是一个request。而这个是在浏览器端运行的。
如何选择?(详解:http://www.uml.org.cn/j2ee/j2ee009.htm)
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。
具体详解:
- 一、请求转发与响应重定向的种类
-
- 有两种方式获得Servlet转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()方法获得,
- 一种是通过ServletContext的getRequestDispatcher()方法获得。
-
- Servlet重定向的方法只有一种:HttpServletResponse的sendRedirect()方法。
- 这三个方法的参数都是一个URL形式的字符串,但在使用相对路径或绝对路径上有所区别。
-
- 二、请求转发与响应重定向中路径参数区别
-
-
- 假设通过http://localhost/myApp/cool/bar.do请求到达该方法所属的Servlet。
-
- 1、响应重定向 ◆ HttpServletResponse.sendRedirect(String)
-
- 参数可以指定为相对路径、绝对路径或其它Web应用。
-
- i:相对路径:response.sendRedirect("foo/stuff.do"),容器相对于原来请求URL的目录加参数来生成完整的URL——http://localhost/myApp/cool/foo/stuff.do。
-
- ii:绝对路径:response.sendRedirect("/foo/stuff.do"),容器相对于Web应用本身加参数建立完整的URL,这是因为 重定向response.sendRedirect("")是服务器向客户端发送一个请求头信息,由客户端再请求一次服务器,请求是在服务器外进行的,即完整的url是——http://localhost/foo/stuff.do。
-
- iii:其它Web应用:response.sendRedirect("http://www.xxx.com")容器直接定向到该URL。
-
- 2、请求转发 ◆HttpServletRequest.getRequestDispatcher(String)
-
- 参数可以指定为相对路径或绝对路径。
-
- i:相对路径情况下生成的完整URL与重定向方法相同。
-
- ii:绝对路径与Servlet重定向不同,容器将相对于Web应用的根目录加参数生成完整的URL(即“/”根路径就是相对于虚拟路径)这是因为转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序
-
- 即:
- request.getRequestDispatcher("/foo/stuff.do")生成的URL是http://localhost/myApp/foo/stuff.do。
-
- 3、 ◆ServletContext.getRequestDispatcher(String)
-
- 参数只能指定为绝对路径,生成的完整URL与HttpServletRequest.getRequestDispatcher(String)相同。
-
- 综上所述:这里最最关键的要能清楚发出请求目的资源的请求是在服务器内部还是服务器外部:内部时,“/”就是项目的虚拟目录;外部时,“/”就是代表主机的根目录
遇到的举例:项目中文件的路径图如下:
- eg1:
-
- jsp界面(通过这个a标签调用下方servlet代码):<li><a href="${pageContext.request.contextPath }/jsp/user.do?method=query">用户管理</a></li>
-
- servlet代码:req.getRequestDispatcher("jsp/userlist.jsp").forward(req,resp);
-
- 实际运行后:404报错,提示文件[/jsp/jsp/userlist.jsp] 未找到,因为会在jsp文件路径下去找jsp/userlist.jsp,故报错404
-
- eg2:
-
- jsp界面:<li><a href="${pageContext.request.contextPath }/jsp/user.do?method=query">用户管理</a></li>
-
- servlet代码:req.getRequestDispatcher("/jsp/userlist.jsp").forward(req,resp);
-
- 实际运行是ok的,因为是"/"在RequestDispatcher中代表当前项目的路径
-
- eg3:
-
- jsp界面:<li><a href="${pageContext.request.contextPath }/jsp/user.do?method=query">用户管理</a></li>
-
- servlet代码:req.getRequestDispatcher("userlist.jsp").forward(req,resp);
-
- 实际运行是ok的,因为之前的路径已经在jsp文件路径下
-
- eg4:
-
- jsp界面:<li><a href="${pageContext.request.contextPath }/jsp/user.do?method=query">用户管理</a></li>
-
- servlet代码:req.getRequestDispatcher(req.getContextPath()+"/jsp/userlist.jsp").forward(req,resp);
-
- 实际运行报错404,提示/smbms/jsp/userlist.jsp未找到,因为"/"在RequestDispatcher中代表的是当前项目,所以实际路径多了一个"/smbms",req.getContextPath()方法就是得到当前项目:/smbms
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。