web-dev-qa-db-ja.com

ベース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>

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

66
Valter Silva

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" />のように解決できます。

140
BalusC

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}" />
1
JET