servlet 2.4 RequestDispatcher 的一些要点
通过 RequestDispatcher 的 forward() 方法可以将请求转给其它 servlet 处理.
我们在这个 servlet 里可以得到 requestURI, contextPath, servletPath, pathInfo, queryString 等(通过getRequestURI(), getContextPath(), getServletPath(), getPathInfo(), and getQueryString()等方法), 但这些信息可都是当前这个 servlet 的(即在forward()方法中的servlet), 如果我们想得到最原始的 servlet(即调用了 forward() 方法的 servlet) 信息怎么办?
没关系, 在 servlet 2.4 spec 中已经考虑到了这点, 可通过读取 request 的 attribute 获得:
- javax.servlet.forward.request_uri
- javax.servlet.forward.context_path
- javax.servlet.forward.servlet_path
- javax.servlet.forward.path_info
- javax.servlet.forward.query_string
Important: 此方法不适用通过 getNamedDispatcher() 进行 forward 的情况
有人也许会问, 如果是 include() 呢?
在被 included 的 servlet 中, 我们通过 getRequestURI(), getContextPath(), getServletPath(), getPathInfo(), and getQueryString()等方法得到的是原先 servlet 的信息. 因为请求的 path 没有改变. 但还有办法得到被 included 的 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
通过在被 included 的 servlet 中, 读取 request 的这些属性即可得到被 inclued 的 servlet 的信息.
还有一个问题特别需要注意,那就是 filter 究竟是否适用于被 dispatched 的 servlet 或者 error-page 定义的 page 呢?
servlet spec 2.4 对此做了明确的回答:
可以在部署描述符中指定这几种情况 (REQUEST, FORWARD, INCLUDE, and ERROR).
例子:(该 filter 只适用于直接 request 的和被 forward 的)
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<url-pattern>/products/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
默认情况是, 如果不指定 filter 的 dispatcher, 该默认值是 REQUEST.
Categorized in: Java · Tagged with: Java


(
on 2009/02/25 at 15:32
· Permalink
[...] 可参考另一篇文章《servlet 2.4 RequestDispatcher 的一些要点》 [...]