どのようにJSFのコンテキストパスを介してベースURLを取得するには?
質問
このような構造になっています。
WebContent
resources
components
top.xhtml
company
about_us.xhtml
index.xhtml
top.xhtml
はコンポーネントで
index.xthml
と
about_us.xhtml
もあります。
top.xhtml
<ul>
<li><a href="index.xhtml">Home</a></li>
<li><a href="company/about_us.xhtml">About us</a></li>
...
</ul>
そこで問題なのは、現在のページが
index.xhtml
の場合、コンポーネントは正しく URL を生成しますが、現在のページが
about_us.xhtml
の場合は、間違った URL を生成してしまいます。相対パスも間違ったURLを生成してしまいそうで使えません。私は、このコンポーネントが、現在のパスの
*.xhtml
ページの現在のパスに基づいているからだと思います。
私が見つけられた唯一の解決策は
<ul>
<li><a href="${pageContext.request.contextPath}/webname/index.xhtml">Home</a></li>
<li><a href="${pageContext.request.contextPath}/webname/about_us.xhtml">About us</a></li>
...
</ul>
しかし、私はそれが全く "エレガント "ではないと思います。何かアイデアはありますか?
どのように解決するのですか?
URL は、サーバー側でファイル構造に基づいて解決されません。URL は、問題のあるリソースの実際のパブリック Web アドレスに基づいて解決されます。つまり、Web サーバーではなく、Web ブラウザーがそれらを呼び出す必要があるのです。
痛みを和らげる方法がいくつかあります。
JSF ELは
${pageContext.request}
の風味で
#{request}
:
<li><a href="#{request.contextPath}/index.xhtml">Home</a></li>
<li><a href="#{request.contextPath}/about_us.xhtml">About us</a></li>
必要であれば
<c:set>
タグを使えば、もっと短くできます。これをマスターテンプレートのどこかに設置すると、すべてのページで利用できるようになります。
<c:set var="root" value="#{request.contextPath}/" />
...
<li><a href="#{root}index.xhtml">Home</a></li>
<li><a href="#{root}about_us.xhtml">About us</a></li>
JSF 2.xでは
<h:link>
で、コンテキストルートからの相対的なビュー ID を取ることができます。
outcome
で、これはコンテキストのパスを追加し
FacesServlet
のマッピングが自動的に追加されます。
<li><h:link value="Home" outcome="index" /></li>
<li><h:link value="About us" outcome="about_us" /></li>
HTMLでは
<base>
タグがあり、ドキュメント内のすべての相対 URL をこのベースからの相対 URL にします。これを利用するとよいでしょう。これを
<h:head>
.
<base href="#{request.requestURL.substring(0, request.requestURL.length() - request.requestURI.length())}#{request.contextPath}/" />
...
<li><a href="index.xhtml">Home</a></li>
<li><a href="about_us.xhtml">About us</a></li>
(注意:これはEL2.2を必要とします。そうでない場合はJSTLを使用した方がよいでしょう。
fn:substring()
も参照してください。
この答え
)
これは、生成されたHTMLの中で次のようなものになるはずです。
<base href="http://example.com/webname/" />
なお
<base>
タグには注意点があります。それは、ページ内のすべてのジャンプ・アンカーを
<a href="#top">
のようなページ内のすべてのジャンプアンカーを相対的なものとしてしまうのです! また
html タグは <base> を使用することが推奨されていますか?
JSFでは、次のように解決できます。
<a href="#{request.requestURI}#top">top</a>
または
<h:link value="top" fragment="top" />
.
関連
-
[解決済み] p:dashboardが終了してもソート順を維持する。
-
[解決済み] htmlの<base>タグの推奨事項を教えてください。
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
-
[解決済み】JSFリソースライブラリは何のためにあり、どのように使用すべきですか?
-
[解決済み】Laravel: ベースURLの取得
-
[解決済み] Java EE / JSF で j_security_check を使用してユーザー認証を行う。
-
[解決済み] h:commandLinkの代わりにh:outputLinkを使うべきですか?
-
[解決済み] dataTableやui:repeatのコマンドリンクに選択した行を渡すにはどうしたらいいですか?
-
[解決済み] /page.xhtmlのパースでエラーが発生しました。Error Traced[line: 42] 実体 "nbsp "が参照されたが、宣言されていない。
-
[解決済み] FaceletsのEL boolean式で&&を使うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] javax.faces.application.ViewExpiredException: ビューを復元できませんでした
-
[解決済み] JSF 2.2でターゲットが到達できない、識別子がヌルに解決される [重複] 。
-
[解決済み] java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config [duplicate].
-
[解決済み] htmlの<base>タグの推奨事項を教えてください。
-
[解決済み】JSFリソースライブラリは何のためにあり、どのように使用すべきですか?
-
[解決済み】PrimeFacesのprocess/updateとJSFのf:ajax execute/renderの属性を理解する。
-
[解決済み] divタグをレンダリングできるjsfコンポーネントは何ですか?
-
[解決済み] JSF2におけるfaces-config.xmlの用途は何ですか?
-
[解決済み] JSFのページで、改行されないスペース文字を挿入するには?
-
[解決済み] JSPに転送するServletを呼び出すと、ブラウザがCSS、画像、リンクなどの相対的なリソースにアクセス/検索できない