我有这个结构:
WebContent
resources
components
top.xhtml
company
about_us.xhtml
index.xhtml
top.xhtml
是一个组件,也在index.xthml
和about_us.xhtml
中使用。
top.xhtml
<ul>
<li><a href="index.xhtml">Home</a></li>
<li><a href="company/about_us.xhtml">About us</a></li>
...
</ul>
所以我的问题是,当前页面为index.xhtml
时,组件会正确生成URL,但当前页面为about_us.xhtml
时,会生成错误的URL。我不能使用相对路径,因为它也会生成错误的URL。我认为这是因为该组件基于*.xhtml
页面的当前路径。
我能找到的唯一解决方案是:
<ul>
<li><a href="${pageContext.request.contextPath}/webname/index.xhtml">Home</a></li>
<li><a href="${pageContext.request.contextPath}/webname/about_us.xhtml">About us</a></li>
...
</ul>
但我认为根本不是'优雅'。有什么想法吗?
答案 0 :(得分:139)
未根据服务器端的文件结构解析URL。根据相关资源的真实公共网址解析URL。这就是webbrowser必须调用它们,而不是网络服务器。
有几种方法可以缓解疼痛:
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
中的上下文根的视图ID,它将自动附加上下文路径和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()
,另见this answer)
这应该在生成的HTML中结束,如
<base href="http://example.com/webname/" />
请注意,<base>
标记有一个警告:它会使页面中的所有跳跃锚点(如<a href="#top">
)相对于它!另请参阅Is it recommended to use the <base> html tag?在JSF中,您可以像<a href="#{request.requestURI}#top">top</a>
或<h:link value="top" fragment="top" />
一样解决此问题。
答案 1 :(得分:1)
<c:set var="baseURL" value="${pageContext.request.requestURL.substring(0, pageContext.request.requestURL.length() - pageContext.request.requestURI.length())}${pageContext.request.contextPath}/" />
<head>
<base href="${baseURL}" />