私はこの構造を持っています:
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アドレスに基づいて解決されます。つまり、それらを呼び出す必要があるのはウェブブラウザではなく、ウェブサーバーです。
痛みを和らげる方法はいくつかあります。
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は、outcome
のコンテキストルートに関連するビューIDを取得できる<h:link>
を提供し、コンテキストパスとFacesServlet
マッピングを自動的に追加します。
<li><h:link value="Home" outcome="index" /></li>
<li><h:link value="About us" outcome="about_us" /></li>
HTMLは <base>
タグを提供し、ドキュメント内のすべての相対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>
(注:これにはEL 2.2が必要です。それ以外の場合は、JSTL fn:substring()
を使用することをお勧めします。 この答え )
これは、生成されたHTMLのようになります
<base href="http://example.com/webname/" />
<base>
タグには注意点があることに注意してください。これは、<a href="#top">
のようなページ内のすべてのジャンプアンカーも同様に作成します。 <base> htmlタグを使用することをお勧めしますか? JSFでは、<a href="#{request.requestURI}#top">top</a>
または<h:link value="top" fragment="top" />
のように解決できます。
<c:set var="baseURL" value="${pageContext.request.requestURL.substring(0, pageContext.request.requestURL.length() - pageContext.request.requestURI.length())}${pageContext.request.contextPath}/" />
<head>
<base href="${baseURL}" />