RequestDispatcher
RequestDispatcher只有两个方法:forward()和include()。这两个方法都取请求和响应对象为参数(接收转发请求的组件需要这些对象来完成任务)。在这两个方法中,forward()是目前最常用的。一般不太可能从控制器servlet调用include方法;不过,在后台,JSP可能在<jsp:include>标准动作中调用include方法。有下面两种办法得到RequestDispatcher:
从ServletRequest得到RequestDispatcher
RequestDispatcher view =request.getRequestDispatcher(“result.jsp”);
这是相对路径,因为最前面没有斜线("/")。在这种情况下,容器会请求所在的逻辑位置查找"result.jsp"
若这条语句所在的servlet的url是http://localhost:端口号/a/b/c。
转发给的路径实际上是:http://localhost:端口号/a/b/result.jsp。
那绝对路径呢?如果路径最前面有一个斜线("/"),容器就会把这看作是"要从这个Web应用的根开始。注意web应用名是根,之后的路径就是斜线以后的内容。
RequestDispatcher view=getServletContext().getRequestDispatcher("/result.jsp");
转发给的路径实际上是:http://localhost:端口号/web应用名/result.jsp
从ServletRequest得到RequestDispatcher
RequestDispatcher view=getServletContext().getRequestDispatcher("/result.jsp");
ServletContext的getRequestDispatcher()方法的参数必须使用斜线。
也就是说必须使用绝对路径指定资源的路径。
Redirect
重定向是通过响应来完成的,相对路径与上面一样。
若之前response所在servlet的url为http://localhost:端口号/a/b/c。
response.sendRedirect("/ss/s");
之后重定向的url为http://localhost:端口号/ss/s。
(浏览器地址栏会显示)
为什么相同的绝对路径,请求转发和重定向会不一样呢?
原因就是可以重定向到容器的任一个web应用的url
而请求转发只能到当前web应用下的url。