RequestDispatcher
forward
1. 如果 Forward URL 中有參數, 並且與 request 對象中現有的參數同名, 則 getParameter 方法返回 Forward URL中的參數
2. 在 Forward 之前, 容器應讀取 POST Form Data 中的參數
3. 如果 Forward URL 中帶有 jsessionid 參數, 則容器將其當做 URL 的一部分, 而不做 SessionId
4. 在 forward 方法調用之前, 容器先清除輸出緩存, 如果數據已發送到浏覽器, 則拋出 IllegalStateException
5. 在 forward 方法返回之前, 容器應將所有數據發送到浏覽器, 並關閉輸出流, 這就意味著 forward 方法調用後, 所有使用輸出流輸出的數據都將忽略
6. 在 forward 之前, 容器應根據 Forward URL 重設 request 以下屬性: ServletPath, RequestURI, QueryString, PathInfo. RequestURL 不變, 如果是用 getNameDispatcher 得到的, 就不需要重設
7. Forward 請求時, 應當處理 welcome files
8. Forward 時, 不做 Filting
9. request 和 response 參數可以是容器的實現類, 也可以 ServletRequestWrapper 和 ServletResponseWrapper 或其子類
include
1. 如果 Include URL 中有參數, 並且與 request 對象中現有的參數同名, 則 getParameter 方法返回 Include URL中的參數
2. 在 Include 之前, 容器應讀取 POST Form Data 中的參數
3. 如果 Include URL 中帶有 jsessionid 參數, 則容器將其當做 URL 的一部分, 而不做 SessionId
4. 在被包含的 Servlet 中, 只通過輸出流輸出內容, 不能設響應頭, 所有的設置都被忽略, 但不拋異常
5. 在 include 之前, 容器不重設 request 各種屬性, 但將被包含 ContextPath, ServletPath, PathInfo, QueryString, RequestURI 放到 request 的 attribute 中 (如果是使用 getNameDispather 則不設)
javax.servlet.include.context_path = ContextPath
javax.servlet.include.servlet_path = ServletPath
javax.servlet.include.path_info = PathInfo
javax.servlet.include.query_string = QueryString
javax.servlet.include.request_uri = RequestURI
6. Include 時, 不做 Filting
7. Include 請求時, 應當不處理 welcome files
8. request 和 response 參數可以是容器的實現類, 也可以 ServletRequestWrapper 和 ServletResponseWrapper 或其子類
通過 ServletContext 得到的 RequestDispatcher, 其 URL 是相對於 ContextPath 的
通過 ServletRequest 得到的 RequestDispatcher, 其 URL 是相對於最初請求的 ServletPath (如果是一串的 forward , 最好處理請求的 Servlet 的 Path)
調用 getNameDispatcher 如果 Servlet 不存在, 則返回 null