73

私はこの構造を持っています:

WebContent
    resources
        components
            top.xhtml

    company
        about_us.xhtml

    index.xhtml

top.xhtmlindex.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>

しかし、私はまったく「エレガント」ではないと思います。何か案は?

4

2 に答える 2

156

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 をこのベースに対して相対的にするタグを提供します。あなたはそれを利用することができます。に入れ<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 タグの使用は推奨されていますか?も参照してください。<a href="#{request.requestURI}#top">top</a>JSFでは、またはのように解決できます<h:link value="top" fragment="top" />

于 2011-07-29T20:00:23.693 に答える
1

BalusCの回答から活用されたJSTL 1.2のバリエーション

<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}" />
于 2015-06-17T04:41:27.697 に答える