gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:28 29 4
gpt4 key购买 nike

我正在尝试整合 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 中的模式不匹配.

我做不到 <pattern>/*</pattern>因为还有其他的jsp不需要layout-main.jsp修饰.我做不到 <pattern>/servlet/MyServlet*</pattern>因为MyServlet可以转发到main.jsp有时也许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 路径。任何一个都应该工作。

关于java - 将 SiteMesh 与 RequestDispatcher 的 forward() 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619699/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com