5

我正在尝试将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);

这意味着 URL 保留在类似于http://example.com/my-webapp/servlet/MyServlet而不是 jsp 文件的位置,因此没有被修饰,我想是因为它与decorators.xml.

我不能做 a<pattern>/*</pattern>因为还有其他 jsps 不需要用layout-main.jsp. 我不能这样做,<pattern>/servlet/MyServlet*</pattern>因为有时MyServlet可能会转发到其他时间。main.jsperror.jsp

有没有办法在不对 servlet 的工作方式进行广泛更改的情况下解决这个问题?由于它是一个遗留应用程序,我没有太多的自由来改变事情,所以我希望有一些配置方面的东西可以解决这个问题。

SiteMesh 的文档真的不是很好。我大部分时间都在使用发行版附带的示例应用程序。我真的很喜欢 SiteMesh,并希望我能在这种情况下让它工作。

4

1 回答 1

9

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

但是,您可以使用以下方式指示在转发时调用过滤器:

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

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

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

于 2009-06-12T13:18:13.297 回答