Include 方法
RequestDispatcher 接口的 include 方法可以随时被调用。Include 方法的目标 servlet 能够访问请求对象的各个方法(all aspects),但是使用响应对象的方法会受到更多限制。
它只能把信息写到响应对象的 ServletOutputStream 或 Writer 中,或提交在最后写保留在响应缓冲区中的内容,或通过显式地调用ServletResponse 接口的 flushBuffer 方法。它不能设置响应头部信息或调用任何影响响应头部信息的方法,HttpServletRequest.getSession() 和 HttpServletRequest.getSession(boolean) 方法除外。任何试图设置头部信息必须被忽略,任何调用 HttpServletRequest.getSession() 和HttpServletRequest.getSession(boolean) 方法将需要添加一个Cookie 响应头部信息,如果响应已经提交,必须抛出一个IllegalStateException 异常。
如果默认的 servlet 是 RequestDispatch.include() 的目标servlet,而且请求的资源不存在,那么默认的 servlet 必须抛出FileNotFoundException 异常。如果这个异常没有被捕获和处理,以及响应还未提交,则响应状态码必须被设置为 500。
内置请求参数
除了用 getNamedDispatcher 方法获得的 servlets 外,被别的servlet使用RequestDispatcher的include方法调用过的servlet,有权访问调用者的 servlet 的路径。
以下的请求属性必须被设置:
javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string
这些属性可以通过包含的 servlet 的请求对象的 getAttribute 方法访问,它们的值必须分别与被包含 servlet 的请求 URI、上下文路径、servlet 路径、路径信息、查询字符串相等。如果随后的请求包含这些属性,那么这些属性会被后面包含的属性值替换。
如果包含的 servlet 通过 getNamedDispatcher 方法获得,那么这些属性不能被设置。