5

Tomcat 5 をコンテナーとして使用して、SiteMeshをレガシー アプリケーションに統合しようとしています。main.jspシンプルなデコレータで飾っています。

ではdecorators.xml、デコレータを 1 つだけ定義しました。

<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ます。ただし、サーブレットが jsp へのリダイレクトを行う代わりにforwardを行う場所がいくつかあります。

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

これは、URL がhttp://example.com/my-webapp/servlet/MyServletjsp ファイルではなく のようなものにとどまり、装飾されていないことを意味しdecorators.xmlます。

<pattern>/*</pattern>で装飾する必要のない他のjspがあるため、できませんlayout-main.jsp。場合によっては転送される可能性がある<pattern>/servlet/MyServlet*</pattern>ため、できません。MyServletmain.jsperror.jsp

サーブレットの動作を大幅に変更せずに、これを回避する方法はありますか? これはレガシーアプリなので、変更する自由があまりないので、これを修正する構成上の何かを望んでいます.

SiteMesh のドキュメントは、実際にはそれほど優れていません。私はディストリビューションに付属しているサンプル アプリケーションに基づいて作業を進めてきました。私は SiteMesh が本当に好きで、この場合でも動作することを望んでいます。

4

1 に答える 1

9

私の理解では、SiteMeshはサーブレットフィルターとしてアプリケーションに統合されています。デフォルトでは、サーブレットフィルタは、元の着信要求(この場合はサーブレットへの要求)に対してのみ呼び出されます。後続の転送またはインクルード要求はフィルターを通過しないため、sitemeshを通過しません。

ただし、次のようなものを使用して、フォワードで呼び出されるようにフィルターを指示できます。

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

これは、FORWARDリクエストでのみ動作するようにコンテナに指示します。他のオプションはINCLUDEとREQUESTで、いくつかの要素を持つことができます。

したがって、オプションは、フィルタ構成を変更してFORWARDを指定するか、フィルタマッピングをJSPパスではなくサーブレットパスに一致するように変更することです。どちらかが機能するはずです。

于 2009-06-12T13:18:13.297 に答える