簡體   English   中英

將 SiteMesh 與 RequestDispatcher 的 forward() 一起使用

[英]Using SiteMesh with RequestDispatcher's 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>

如果我手動將 go 到http://example.com/my-webapp/jsp/main.jsp ,則此裝飾器有效。 但是,在某些地方,servlet 不是重定向到 jsp,而是執行轉發

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

This means that the URL remains at something like http://example.com/my-webapp/servlet/MyServlet instead of the jsp file and is therefore not being decorated, I presume since it doesn't match the pattern in decorators.xml .

我不能做<pattern>/*</pattern>因為還有其他 jsps 不需要被layout-main.jsp 我不能執行<pattern>/servlet/MyServlet*</pattern>因為MyServlet有時可能會轉發到main.jsp ,在其他時候可能會轉發到error.jsp

有沒有辦法在不對 servlets 的工作方式進行廣泛更改的情況下解決這個問題? 由於它是一個遺留應用程序,我沒有太多的自由來改變事情,所以我希望有一些配置方面的東西可以解決這個問題。

SiteMesh 的文檔真的不是很好。 我大部分時間都在使用發行版附帶的示例應用程序。 我真的很喜歡 SiteMesh,並希望我能在這種情況下讓它工作。

我的理解是 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 路徑。 任何一個都應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM