天天看点

请求转发和重定向路径问题RequestDispatcherRedirect

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。