Как получить базовый URL? - PullRequest
66 голосов
/ 29 июля 2011

У меня есть такая структура:

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>

Но я думаю, что нет 'элегантныйЕсть идеи?

Ответы [ 2 ]

139 голосов
/ 30 июля 2011

URL-адреса не разрешаются в зависимости от структуры файла на стороне сервера.URL разрешаются на основе реальных общедоступных веб-адресов рассматриваемых ресурсов.Именно веб-браузер должен их вызывать, а не веб-сервер.

Есть несколько способов смягчить боль:

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>, который может принимать идентификатор представления относительно корня контекста в 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"> относительно этого тоже!См. Также Рекомендуется ли использовать тег html? В JSF вы можете решить его как <a href="#{request.requestURI}#top">top</a> или <h:link value="top" fragment="top" />.

1 голос
/ 17 июня 2015

Вариант JSTL 1.2 с использованием ответа BalusC

<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}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...