如何通过 JSF 中的上下文路径获取基本 URL?
Posted
技术标签:
【中文标题】如何通过 JSF 中的上下文路径获取基本 URL?【英文标题】:How get the base URL via context path in JSF? 【发布时间】:2011-10-16 05:40:10 【问题描述】:我有这个结构:
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>
但我认为一点也不“优雅”。有什么想法吗?
【问题讨论】:
【参考方案1】:不会根据服务器端的文件结构解析 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="#rootindex.xhtml">Home</a></li>
<li><a href="#rootabout_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 中结束,类似于 as
<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" />
一样解决它。
【讨论】:
非常感谢,我是你的忠实粉丝 =) 我希望成为一名出色的开发人员,因为你是伙伴,谢谢。 不错的解决方案,不知道这是可能的!感谢分享! @balusC 是的,ui:param 方法不适用于 myfaces。 @Aklin:我修复了答案,谢谢,我不知道这是特定于 Mojarra 的,实际上我也从未见过关于此的 Mojarra 问题报告。 @Aklin:也许这又是另一个 MyFaces 的事情了。尝试添加scope="request"
。【参考方案2】:
利用 BalusC 答案的 JSTL 1.2 变体
<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" />
【讨论】:
以上是关于如何通过 JSF 中的上下文路径获取基本 URL?的主要内容,如果未能解决你的问题,请参考以下文章
JSF 2 - 如何使用 JSF EL 从 web.xml 获取上下文参数值?