天天看點

請求轉發和重定向路徑問題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。