1

我有一个多语言网站,其内容由 ResourceBundles 管理。如何使用 JSF 导航插入到使用段落内容的网站部分的链接。

示例 1:所需的 HTML 输出

<p>Simply <a href="contact.xhtml">contact us</a> to find out more.</p>

示例 2:实现上述目的的简单 facelt

<p>Simply <h:link outcome="contact" value="contact us"/> to find out more.</p>

期望的结果:相同但使用 ResourceBundle

小面

<p>
    <h:outputText value="${template['paragraph']}">
        <f:param>
            <h:link outcome="contact" value="${template['contactUs']}"/>
        </f:param>
    </h:outputText>
</p>

资源包

paragraph=Simply {0} to find out more.
contactUs=contact us
4

1 回答 1

6

问题不完全是 JSF 导航规则,而是您不能使用<f:param>将 JSF 组件指定为捆绑参数,更不用说普通的普通 HTML 子项了。另外,请注意您不能使用<f:param>in <h:outputText>,而只能使用 in <h:outputFormat>

<f:param value>无论如何,为了实现功能要求,您必须像自己一样以转义的方式写下 HTML 。

<h:outputFormat value="#{template['paragraph']}" escape="false">
    <f:param value="&lt;a href='#{request.contextPath}/contact.xhtml'&gt;#{template['contactUs']}&lt;/a&gt;" />
</h:outputFormat>

或者,如果您想像对其属性ViewHandler#getBookmarkableURL()一样使用 JSF,<h:link>outcome

<h:outputFormat value="#{template['paragraph']}" escape="false">
    <f:param value="&lt;a href='#{facesContext.application.viewHandler.getBookmarkableURL(facesContext, '/contact', null, false)}'&gt;#{template['contactUs']}&lt;/a&gt;" />
</h:outputFormat>

由于您不是第一个偶然发现此问题的人,而且变通办法也很尴尬,因此 JSF 实用程序库OmniFaces最近更新了其<o:param>组件,支持在未指定值时将子项编码为参数值。从 OmniFaces 1.5 开始,您应该可以按如下方式使用它:

<h:outputFormat value="#{template['paragraph']}" escape="false">
    <o:param><h:link outcome="contact" value="#{template['contactUs']}" /></o:param>
</h:outputFormat>
于 2013-03-23T19:57:17.310 回答