小编典典

将SiteMesh与RequestDispatcher的forward()结合使用

jsp

我正在尝试使用Tomcat
5作为容器将SiteMesh集成到旧版应用程序中。我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,而是进行转发

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

这意味着该URL保留在类似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,希望在这种情况下可以使用它。


阅读 328

收藏
2020-06-08

共1个答案

小编典典

我的理解是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路径。任一个应该起作用。

2020-06-08