JSF. Связывание страницы с другой [дубликат]

Рассмотрим следующую строку:

ab

Образец (ab.*) вернет совпадение для группы захвата с результатом ab

Пока шаблон (ab.+) не будет соответствовать и ничего не возвращать.

Но если вы измените строку на следующую, она вернет aba для шаблона (ab.+)

aba
5
задан BalusC 1 April 2016 в 07:55
поделиться

1 ответ

Прежде всего, JSF является генератором кода HTML. Поэтому в JSF это не так, как в «простом» HTML. Вы должны просто не смотреть на структуру файловой системы в проекте webapp при создании ссылок в HTML. Вы должны посмотреть на общедоступную структуру URL этих ресурсов. Это именно веб-браузер, которому приходится вызывать и загружать эти ресурсы, а не веб-сервер. Веб-браузер абсолютно ничего не знает о структуре файловой системы на веб-сервере. Это не относится к проектам JSF. Это относится ко всем веб-проектам.

Относительные URL-адреса не относятся к их местоположению в структуре файловой системы в проекте webapp. Они относятся к URL-адресу запроса открытого HTML-документа, точно такого, который вы видите в адресной строке браузера. Следует отметить, что, когда в документе HTML присутствует элемент <base>, все относительные URL-адреса в документе HTML, начиная с /, будут относиться к нему.

Учитывая настройку webapp, которая настроена с FacesServlet отображением шаблона URL-адреса *.xhtml и развертывается до localhost:8080 с контуром пути /context, URL-адрес файла /index.xhtml в корневом каталоге проекта будет следующим:

http://localhost:8080/context/index.xhtml
----   -------------- ------- -----------
  |           |          |         `-- resource
  |           |          `-- path (can be multiple folders)
  |           `-- domain (and port)
  `-- scheme

Когда вы в настоящее время находитесь в http://localhost:8080/context/index.xhtml, и хотите создать ссылку на http://localhost:8080/context/calculate/calculate.xhtml, то все приведенные ниже пути в конечном итоге указывают на точно такой же абсолютный URL.

  • Относительный URL, начинающийся с //, относится к текущей схеме.
    <a href="//localhost:8080/context/calculate/calculate.xhtml">link</a>
    
  • Относительный URL, начинающийся с /, относится к домену.
    <a href="/context/calculate/calculate.xhtml">link</a>
    
  • Относительный URL-адрес , а не , начиная с /, относительно пути.
    <a href="calculate/calculate.xhtml">link</a>
    

И когда вы в настоящее время находитесь в http://localhost:8080/context/calculate/calculate.xhtml и хотите установить ссылку на http://localhost:8080/context/index.xhtml, применяются те же правила:

  • Относительный URL, начинающийся с //, относится к текущей схеме.
    <a href="//localhost:8080/context/index.xhtml">link</a>
    
  • Относительный URL, начинающийся с /, относится к домену.
    <a href="/context/index.xhtml">link</a>
    
  • Относительный URL-адрес , а не , начиная с /, относительно пути.
    <a href="../index.xhtml">link</a>
    

Как вы, вероятно, понимаете, относительный URL, начинающийся с /, не зависит от текущего пути и домена. Итак, это URL-адрес, который вы действительно хотите использовать повсюду в своем веб-приложении, не беспокоясь о проблемах обслуживания при изменении домена или перемещении файлов на сервере. Остается только динамичность контекстного пути. Вероятно, вы уже знаете, что это значение не контролируется внутри webapp. Вы действительно хотели бы избежать его жесткого кодирования. Однако вы можете легко позволить JSF распечатать его программно с небольшой помощью EL. Это просто доступно HttpServletRequest#getContextPath() , а HttpServletRequest находится в EL, доступном как неявный объект #{request}.

<a href="#{request.contextPath}/index.xhtml">link</a>
<a href="#{request.contextPath}/calculate/calculate.xhtml">link</a>

Достаточно утомительно повторять это каждый раз. К счастью, JSF предлагает компонент <h:link> для самой цели генерации элемента HTML <a> с текущим контуром контекста автоматически.

<h:link value="link" outcome="index.xhtml" />
<h:link value="link" outcome="calculate/calculate.xhtml" />

Обратите внимание, что outcome должен представлять идентификатор вида JSF, который не обязательно совпадает с URL-адресом (он будет, когда вы нажмете FacesServlet на *.xhtml). Вы можете даже опустить расширение файла здесь, JSF автоматически обнаружит его как часть механизма «неявной навигации».

<h:link value="link" outcome="index" />
<h:link value="link" outcome="calculate/calculate" />

См. Также:

18
ответ дан Community 15 August 2018 в 16:28
поделиться
  • 1
    Отличный ответ, спасибо! Я не мог найти достойного описания всего этого. Если есть краткий ресурс документации, который я пропускаю, сообщите мне. Я работаю над Учебным пособием по Java EE 7: Том 1: Основные понятия (Java Series) , но они пока не охватывают его, и ни один из их примеров не имеет xhtml-файлов в подпапках. Я действительно пытался href="#{request.contextPath}/index.xhtml", прежде чем не понял, что он делает, и я предполагаю, что в то время что-то было не так. В любом случае, теперь он работает, спасибо. – Ant Waters 7 June 2015 в 08:32
  • 2
    Пожалуйста. Это не совсем JSF. Это просто HTTP и HTML. Знание HTTP и HTML действительно является предварительным условием перед погружением в JSF. Изучение JSF находится в этом конкретном случае, зная цель <h:link> и #{request.contextPath} (хотя последнее больше Servlet + EL, чем специфическое JSF). – BalusC 8 June 2015 в 04:46
Другие вопросы по тегам:

Похожие вопросы: