RequestDispatcherのforward()でSiteMeshを使用する
質問
SiteMesh を、Tomcat 5をコンテナとして使用するレガシーアプリケーションに統合しようとしています。シンプルなデコレータで装飾している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がjspファイルではなくhttp://example.com/my-webapp/servlet/MyServlet
のようなもののままであり、したがって装飾されていないことを意味します。<pattern>/*</pattern>
のパターンと一致しないため、推測します。
layout-main.jsp
で装飾する必要のない他のjspがあるため、<pattern>/servlet/MyServlet*</pattern>
を実行できません。 MyServlet
は時々error.jsp
に転送される可能性があり、場合によっては<=>に転送される可能性があるため、<=>を実行できません。
サーブレットの動作方法を大幅に変更せずにこれを回避する方法はありますか?それはレガシーアプリなので、物事を変更する自由があまりないので、これを修正するような設定上の何かを望んでいます。
SiteMeshのドキュメントは、それほど素晴らしいものではありません。私は、ディストリビューションに付属しているサンプルアプリケーションを中心に取り組んできました。私はSiteMeshが本当に好きで、このケースで動作させることができることを望んでいます。
解決
私の理解では、SiteMeshはサーブレットフィルターとしてアプリケーションに統合されています。デフォルトでは、サーブレットフィルターは元の着信要求(この場合、サーブレットへの要求)に対してのみ呼び出されます。後続の転送要求または組み込み要求はフィルターを介して渡されないため、sitemeshを介して渡されません。
ただし、次のような方法を使用して、前方にフィルタを呼び出すように指示できます。
<filter-mapping>
<filter-name>sitemesh</filter-name>
<servlet-name>MyServlet</servlet-name>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
FORWARDリクエストでのみ動作するようにコンテナに指示します。他のオプションはINCLUDEとREQUESTで、いくつかの要素を持つことができます。
したがって、オプションは、フィルタ構成を変更してFORWARDを指定するか、JSPパスではなくサーブレットパスに一致するようにフィルタマッピングを変更することです。どちらかが動作するはずです。