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。