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 コンテキスト リソースを使用しながら(つまり、これらのクラス パス リソースを作成せずに)、これを機能させることができるかということです。