【问题标题】:How get the base URL via context path in JSF?如何通过 JSF 中的上下文路径获取基本 URL?
【发布时间】:2011-10-16 05:40:10
【问题描述】:

我有这个结构:

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>

但我认为一点也不“优雅”。有什么想法吗?

【问题讨论】:

    标签: jsf base-url contextpath


    【解决方案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>
    

    如有必要,您可以使用&lt;c:set&gt; 标签使其更短。将它放在主模板中的某个位置,它将可供所有页面使用:

    <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 提供了&lt;h:link&gt;,它可以获取相对于outcome 中上下文根的视图ID,它会自动附加上下文路径和FacesServlet 映射:

    <li><h:link value="Home" outcome="index" /></li>
    <li><h:link value="About us" outcome="about_us" /></li>
    

    HTML 提供了&lt;base&gt; 标记,它使文档中的所有相对URL 都相对于这个基础。你可以利用它。放在&lt;h:head&gt;.

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

    请注意&lt;base&gt; 标记有一个警告:它使页面中的所有跳转锚点都像&lt;a href="#top"&gt; 相对于它!另请参阅 Is it recommended to use the <base> html tag? 在 JSF 中,您可以像 &lt;a href="#{request.requestURI}#top"&gt;top&lt;/a&gt;&lt;h:link value="top" fragment="top" /&gt; 一样解决它。

    【讨论】:

    • 非常感谢,我是你的忠实粉丝 =) 我希望成为一名出色的开发人员,因为你是伙伴,谢谢。
    • 不错的解决方案,不知道这是可能的!感谢分享!
    • @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}" />
    

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 2012-12-24
      • 2014-06-03
      • 2011-07-15
      • 1970-01-01
      • 2019-08-08
      • 2016-04-08
      相关资源
      最近更新 更多