Рассмотрим следующую строку:
ab
Образец (ab.*)
вернет совпадение для группы захвата с результатом ab
Пока шаблон (ab.+)
не будет соответствовать и ничего не возвращать.
Но если вы измените строку на следующую, она вернет aba
для шаблона (ab.+)
aba
Прежде всего, 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.
//
, относится к текущей схеме. <a href="//localhost:8080/context/calculate/calculate.xhtml">link</a>
/
, относится к домену. <a href="/context/calculate/calculate.xhtml">link</a>
/
, относительно пути. <a href="calculate/calculate.xhtml">link</a>
И когда вы в настоящее время находитесь в http://localhost:8080/context/calculate/calculate.xhtml
и хотите установить ссылку на http://localhost:8080/context/index.xhtml
, применяются те же правила:
//
, относится к текущей схеме. <a href="//localhost:8080/context/index.xhtml">link</a>
/
, относится к домену. <a href="/context/index.xhtml">link</a>
/
, относительно пути. <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" />
href="#{request.contextPath}/index.xhtml"
, прежде чем не понял, что он делает, и я предполагаю, что в то время что-то было не так. В любом случае, теперь он работает, спасибо. – Ant Waters 7 June 2015 в 08:32<h:link>
и#{request.contextPath}
(хотя последнее больше Servlet + EL, чем специфическое JSF). – BalusC 8 June 2015 в 04:46