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