将SiteMesh与RequestDispatcher的forward()一起使用

时间:2009-03-06 17:28:47

标签: java jsp sitemesh forward

我正在尝试将SiteMesh集成到使用Tomcat 5作为我的容器的遗留应用程序中。我有一个main.jsp,我正在用一个简单的装饰器进行装饰。

decorators.xml中,我刚刚定义了一个装饰器:

<decorators defaultdir="/decorators">
  <decorator name="layout-main" page="layout-main.jsp">
    <pattern>/jsp/main.jsp</pattern>
  </decorator>
</decorators>

如果我手动转到http://example.com/my-webapp/jsp/main.jsp,这个装饰工作。但是,有一些地方,servlet(而不是重定向到jsp)会执行forward

getServletContext().getRequestDispatcher("/jsp/main.jsp").forward(request, response);

这意味着网址仍然是http://example.com/my-webapp/servlet/MyServlet而不是jsp文件,因此没有被装饰,我认为因为它与decorators.xml中的模式不匹配。

我无法执行<pattern>/*</pattern>,因为还有其他jsps不需要由layout-main.jsp修饰。我无法执行<pattern>/servlet/MyServlet*</pattern>,因为MyServlet有时可能转发到main.jsp,有时也可转发error.jsp

如果没有对servlet如何工作的广泛更改,有没有办法解决这个问题?由于它是一个遗留的应用程序,我没有那么多的自由来改变事物,所以我希望有一些配置方面可以解决这个问题。

SiteMesh的文档确实不是很好。我一直在为分发附带的示例应用程序工作。我非常喜欢SiteMesh,我希望能在这种情况下让它工作。

1 个答案:

答案 0 :(得分:9)

我的理解是SiteMesh作为Servlet过滤器集成到应用程序中。默认情况下,仅针对原始传入请求(在您的情况下,对servlet的请求)调用servlet过滤器。后续转发或包含请求不会通过过滤器传递,因此不会通过sitemesh传递。

但是,您可以使用以下内容指示过滤器被调用:

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <servlet-name>MyServlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

指示容器仅对FORWARD请求进行操作。其他选项包括INCLUDE和REQUEST,你可以有几个元素。

因此,您可以选择更改过滤器配置以指定FORWARD,或者更改过滤器映射以匹配servlet路径,而不是JSP路径。任何一个都应该工作。