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 获得:

Important: 此方法不适用通过 getNamedDispatcher() 进行 forward 的情况

有人也许会问, 如果是 include() 呢?

在被 included 的 servlet 中, 我们通过 getRequestURI(), getContextPath(), getServletPath(), getPathInfo(), and getQueryString()等方法得到的是原先 servlet 的信息. 因为请求的 path 没有改变. 但还有办法得到被 included 的 servlet 的信息吗?

答案是:有

通过在被 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.

By javafuns on December 14, 2008 at 22:03 · Views: 1,180 · Permalink
Categorized in: Java · Tagged with: 
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

One Response

Subscribe to comments via RSS

  1. [...] 可参考另一篇文章《servlet 2.4 RequestDispatcher 的一些要点》 [...]

Subscribe to comments via RSS

Leave a Reply


  • Highest Rated

  • My PicasaPhotos

    facebook7.JPG

    IMG_0661.JPG

    IMG_0591.JPG

  • RSS My del.icio.us

  • My RSS