2009-03-06 13 views
5

私はコンテナとしてTomcat 5を使用して従来のアプリケーションにSiteMeshを統合しようとしています。私は簡単なデコレータで飾っているmain.jspを持っています。私は手動でhttp://example.com/my-webapp/jsp/main.jspに行けばRequestDispatcherのforward()でSiteMeshを使用

<decorators defaultdir="/decorators"> 
    <decorator name="layout-main" page="layout-main.jsp"> 
    <pattern>/jsp/main.jsp</pattern> 
    </decorator> 
</decorators> 

このデコレータは動作します:decorators.xml

は、私はちょうど定義された1つのデコレータを持っています。

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

これは、URLの代わりにJSPファイルのhttp://example.com/my-webapp/servlet/MyServletのようなものに留まり、したがって、ではないことを意味します。ただし、サーブレットは、代わりにJSPにリダイレクトを行うので、forwardを行い、いくつかの場所があります私はそれがdecorators.xmlのパターンと一致しないので、私は推測します。

で装飾する必要のない他のjspがあるため、<pattern>/*</pattern>はできません。 MyServletmain.jspに転送されることがあり、それ以外の場合はerror.jspに転送される可能性があるため、<pattern>/servlet/MyServlet*</pattern>を送信できません。

サーブレットの動作を大幅に変更することなくこれを回避する方法はありますか?それはレガシーなアプリケーションなので、私は物事を変える自由がそれほどないので、これを修正する設定上の賢明なことを望んでいる。

SiteMeshのドキュメントは実際にはそれほど大きくありません。私は、配布に付属しているサンプルアプリケーションのほとんどを取り組んできました。私はSiteMeshが本当に好きです。この場合、私はそれを動作させることを望んでいます。

答えて

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パスではなくサーブレットパスに合わせてフィルタマッピングを変更するかのいずれかを選択できます。いずれかがうまくいくはずです。

+1

これは、転送されたリクエストにフィルタを適用して、転送されたJSPページにサイトメッシュデコレータを適用して機能しました。ありがとう! –

+1

スカフマンに感謝します。これは私にとって大きな助けになりました! –

+1

私はこれらの新しいディレクティブを見たことがありますが、それらのディレクティブはまだ必要ありませんでした。素晴らしいアドバイス。 –

関連する問題