如何获得基本URL?

时间:2011-07-29 19:49:09

标签: java jsf jsf-2

我有这个结构:

WebContent
    resources
        components
            top.xhtml

    company
        about_us.xhtml

    index.xhtml

top.xhtml是一个组件,也在index.xthmlabout_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>

但我认为根本不是'优雅'。有什么想法吗?

2 个答案:

答案 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)

JSTL 1.2变体杠杆来自BalusC回答

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