Какой URL использовать для ссылки / перехода на другие страницы JSF

Я не совсем понимаю, как связывать файлы в проекте Java Server Faces, когда некоторые файлы находятся в подпапках. (Я собирался прикрепить скриншоты, чтобы вы могли видеть представление проекта Nebeans и представление файлов примера, который я пытаюсь... но мне пока не разрешено добавлять изображения).

В моем примере проекта у меня есть файлы с именами "index.xhtml" и "Calculate/ Calculate.xhtml". У меня также есть файл с именем "template.xhtml", который используется обоими. Вопрос в том, какой формат URL использовать в шаблоне, который будет работать для обоих файлов.

В прямом html я бы просто использовал что-то вроде следующего, чтобы предоставить ссылку на домашнюю страницу, которая будет работать из любого места:

<a href="/index.html">Home</a>

Но я не могу понять, что считается корневой папкой для приложения JSF, и следует ли использовать структуру папок "представление проекта" или структуру папок "список файлов".

1 ответ

Решение

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

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

Учитывая веб-приложение, которое настроено с FacesServlet шаблон сопоставления URL *.xhtmlи развернут в localhost:8080 с контекстным путем /contextURL-адрес /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 вы действительно хотите использовать везде в своем веб-приложении, не беспокоясь о проблемах обслуживания при смене домена или перемещении файлов на сервере. Остается только динамичность пути контекста. Вы, наверное, уже знаете, что это значение не контролируется изнутри веб-приложения. Вы действительно хотели бы избежать жесткого кодирования. Однако вы можете легко позволить 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" />

Смотрите также:

Другие вопросы по тегам