4

私は、ルート コンテキスト ("/") の下で設計され、常に動作する Web アプリケーションを持っています。したがって、すべてcssjsおよびリンクは/(たとえば/css/style.css) で始まります。ここで、この Web アプリケーションを別のコンテキスト (たとえば/app1) に移動する必要があります。itemを使用server.xmlして、構成ファイルを変更し、新しいコンテキストで Web アプリケーションを起動するのは簡単です。しかし、すべてのリンクが正しくないため、Web ページは壊れています。新しいルート コンテキストではなく、古いルート コンテキストを指します。app1[Context path=""]/css/style.cssapp1環境。「コンテキスト」変数を前に付けて各リンクを修正せずに、この問題を修正する魔法の方法はありますか? 使用サーバー - Tomcat 5。アプリケーションは Java で作成され、JSP、Struts2、Spring、および UrlRewrite フィルターを使用します。さらに興味深いのは、理論的な議論が行われているような問題と戦った実際の経験を聞くことです。ありがとうございました。

app1PS UrlRewrite フィルターはコンテキスト内でのみ機能するため、どのように役立つかわかりません。そのため、のようなリンクへのリクエストは/css/style.css渡されません。

4

2 に答える 2

3

URL 書き換えを使用して ROOT をアプリケーションにリダイレクトすると、ROOT にアプリケーションを配置できなくなるのではないでしょうか? もしそうなら、コンテキストを切り替えることによって何が得られますか?

${pagecontext.request.contextpath}/css/style.cssリソースをリンクする一般的な方法は、「コンテキスト」変数を追加してリンクを絶対にするか、単に相対リンクにすることだと思います。css/style.css

コードを変更できない特定の理由がない限り、リンクを検索/置換して処理を完了します。検索する式は、/css、/images、/javascript など、3 つまたは 4 つ以下にする必要があります。

于 2010-01-14T16:59:47.140 に答える
2

必要に応じてセッション情報を URL に追加できるようにするためだけでなく、コンテキスト パスを追加できるようにするためにも、常に URL の書き換えによって URL を作成する必要があります。すべての URL をアプリケーションの先頭から絶対パスとして作成し、必要に応じて、url-rewriting がコンテキスト パスを先頭に追加して処理できるようにする必要があります。

<c:url value="/css/site.css"/>

Cookie が有効になっていない場合は、jsp ファイルにレンダリングされ/&lt;context-path&gt;/css/site.cssます。/&lt;context-path&gt;/css/site.css;jsessionid=134345434543c:url タグを使用して URL を変数にレンダリングし、その変数をドキュメント全体で複数回使用することもできます。var="x"タグに属性を追加するだけで${x}、URL がドキュメントに表示されます。出力のレンダリングに jsp を使用していない場合は、ビュー レイヤーに適したメカニズムを見つける必要がありますが、すべてのビュー レイヤーに 1 つのメカニズムがあります。URL を Java コードでレンダリングしている場合は、c:url タグのソース コードを参照するだけで、その方法がわかります。

1 つの厄介な点は、CSS ファイル (および js ファイル) が処理されないことです。そのため、css および js ファイルの URL は相対パスである必要があります。そうしないと、コンテキスト パスを変更するたびに壊れてしまいます。ライブラリのメンテナーはライブラリをインストールするパスがわからないため、ほとんどのjsはすでに相対パスを使用しています。一方、CSS 背景画像は、多くの場合、絶対 URL として指定されます。これは、同じ CSS ファイルが、ファイル階層の異なるレベルで html ファイルに含まれる可能性があるためです。相対 URL が常に機能するように適切なシンボリック リンクを作成するか、JSP を介して問題のある CSS ファイルを提供し、URL を適切に書き換えることができるようにする以外に、私が認識している簡単な修正方法はありません。URL の置換を実行できるフィルタまたは apache モジュールがおそらくあると思いますが、

于 2010-07-27T19:16:40.073 に答える