3

Wicket 1.4 アプリでは、いくつかの静的な CSS および JS リソースが[project root]/WebContent/cssおよび[project root]/WebContent/jsそれぞれの下にあります。

ここに画像の説明を入力

私の Wicket HTML ファイルは、src/resources/fi/company/product/pages対応する Java クラスとともに にありsrc/main/fi/company/product/pagesます。(結果の WAR ファイルでは、HTML とプロパティ ファイルはもちろん Java クラスと同じ場所にあります。)

HTML ファイルには、次のようなリソースへの参照が含まれています。

<head>
    <link rel="stylesheet" type="text/css" href="css/main.css"/>
    <script type="text/javascript" src="js/calendar.js"></script>
</head>

これはどこでも問題なく動作します (または、最近までそう考えていました)。注意: 私の Java コードは、これらのリソースをまったく参照していません。

レンダリングされたページのソース (URL は eghttp://localhost:8080/report/42.4またはhttp://localhost:8080/?wicket:interface=:6::::) を見ると、リソース参照は次のように表示されます。

<link rel="stylesheet" type="text/css" href="../css/main.css"/> 

ただし、アプリが (Tomcat) root 以外の場所にデプロイされると、ブックマークできないページでリソースが壊れることに気付きました。

つまり、URLが例えば

http://localhost:8080/foobar/?wicket:interface=:2::::

およびページが参照する

<link rel="stylesheet" type="text/css" href="../css/main.css"/>

...ブラウザは無効な URL でリソースをフェッチしようとします

http://localhost:8080/css/main.css

では、デプロイ パスに関係なく、これらの静的リソースを機能させる最も簡単な (ハックではない) 方法は何ですか?

ブックマーク可能なページのみを使用するように切り替えることもできますが (ページのコンストラクターを変更する必要があります)、それは必要ではないと思います...


編集:この回答でアドバイスされているように<wicket:link>、を使用するだけで(ほとんどの場所で)CSSリソースが機能しているように見えます:

<head>
    <wicket:link>
    <link rel="stylesheet" type="text/css" href="css/main.css"/>
    </wicket:link>
</head>

ただし、次のような URL を持つページでは CSS 参照が壊れています。http://localhost:8080/foobar/report/42.9

Wicket は "css/main.css" パスで奇妙なことをしようとしています:

ERROR org.apache.wicket.RequestCycle - Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
    at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:212)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:89)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:305)

編集2<wicket:link> :これらのリソースファイルは「クラスパスリソース」ではないため、実際にここで正しい解決策があるかどうかはわかりません。私の質問は、Web コンテキスト リソースを使用しながら(つまり、これらのクラス パス リソースを作成せずに)、これを機能させることができるかということです。

4

1 に答える 1

1

そうです、私はそれを解決しました、そしてその解決策は非常に驚くべきものであることがわかりました。

以前に書いた:

不思議なことに、何も変更しないと、問題を再現できなくなったようです...

私は1つの小さな変更を加えたので(重要ではないと思ったので)、それは完全には真実ではありませんでしWebContent/index.jspた。私たちのプロジェクトでは目的のない残骸であったファイルを削除しました。

これで修正できる可能性があることに気づいたら、さらにテストを行いました。実際、次のようになりました。

静的リソースが期待どおりに機能するためには、ルートWebコンテンツディレクトリ(つまり、CSSおよびJSリソースディレクトリの親)にまたはファイルがないようにする必要がありindex.htmlindex.jsp../ます。これは、場合によっては参照を壊すためです。

これはおそらくWicket固有ではありませんが、Tomcat固有である可能性があります。誰かがもっと知っている場合は、遠慮なくチャイムを鳴らしてください。この質問が他の誰かに役立つかどうかは疑問ですが、それでもうまくいきました。

于 2012-06-12T12:59:01.620 に答える