Какой 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
с контекстным путем /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 вы действительно хотите использовать везде в своем веб-приложении, не беспокоясь о проблемах обслуживания при смене домена или перемещении файлов на сервере. Остается только динамичность пути контекста. Вы, наверное, уже знаете, что это значение не контролируется изнутри веб-приложения. Вы действительно хотели бы избежать жесткого кодирования. Однако вы можете легко позволить 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" />
Смотрите также:
- Рекомендуется ли использовать тег
html? - Каковы те URL, которые начинаются с // - которые вы можете увидеть в Google+ html source?
- JSF Facelets: иногда я вижу URL-адрес.jsf, а иногда и.xhtml. Зачем?
- Неявные объекты в EL
- Как ориентироваться в JSF? Как сделать так, чтобы URL отражал текущую страницу (а не предыдущую)