我正在尝试使用Tomcat 5作为容器将SiteMesh集成到旧版应用程序中。我main.jsp正在用一个简单的装饰器进行装饰。
main.jsp
在中decorators.xml,我只定义了一个装饰器:
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,而是进行转发:
http://example.com/my- webapp/jsp/main.jsp
getServletContext().getRequestDispatcher("/jsp/main.jsp").forward(request, response);
这意味着该URL保留在类似http://example.com/my- webapp/servlet/MyServlet而不是jsp文件的位置,因此未修饰,因为它与中的模式不匹配,所以我想decorators.xml。
http://example.com/my- webapp/servlet/MyServlet
我不能这样做,<pattern>/*</pattern>因为还有其他不需要用修饰的jsps layout- main.jsp。我不能这样做,<pattern>/servlet/MyServlet*</pattern>因为MyServlet可能main.jsp有时甚至error.jsp在其他时间转发。
<pattern>/*</pattern>
layout- main.jsp
<pattern>/servlet/MyServlet*</pattern>
MyServlet
error.jsp
有没有一种方法可以解决此问题,而无需对Servlet的工作方式进行广泛的更改?由于它是旧版应用程序,因此我没有太大的自由来进行更改,因此我希望在配置方面有所帮助,以解决此问题。
SiteMesh的文档确实不是很好。我主要是在与发行版一起提供的示例应用程序上工作。我真的很喜欢SiteMesh,希望在这种情况下可以使用它。
我的理解是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路径。任一个应该起作用。