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" />
.