我有一个多语言网站,内容由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相同
的facelet
<p>
<h:outputText value="${template['paragraph']}">
<f:param>
<h:link outcome="contact" value="${template['contactUs']}"/>
</f:param>
</h:outputText>
</p>
的ResourceBundle
paragraph=Simply {0} to find out more.
contactUs=contact us
答案 0 :(得分:5)
问题不完全是JSF导航规则,但是你不能使用<f:param>
将JSF组件指定为bundle参数,更不用说普通的vanilla HTML子节点了。另请注意,您不能在<f:param>
中使用<h:outputText>
,而只能在<h:outputFormat>
中使用。{/ p>
无论如何,为了达到功能要求,你必须自己写下转义为<f:param value>
的HTML。
<h:outputFormat value="#{template['paragraph']}" escape="false">
<f:param value="<a href='#{request.contextPath}/contact.xhtml'>#{template['contactUs']}</a>" />
</h:outputFormat>
或者,如果您想像ViewHandler#getBookmarkableURL()
那样使用JSF <h:link>
正在为其outcome
属性执行,
<h:outputFormat value="#{template['paragraph']}" escape="false">
<f:param value="<a href='#{facesContext.application.viewHandler.getBookmarkableURL(facesContext, '/contact', null, false)}'>#{template['contactUs']}</a>" />
</h:outputFormat>
由于您不是第一个偶然发现这一点并且变通方法很尴尬的人,因此JSF实用程序库OmniFaces最近更新了其<o:param>
组件,并支持将子代码编码为param值值已指定。从OmniFaces 1.5开始,您应该可以按如下方式使用它:
<h:outputFormat value="#{template['paragraph']}" escape="false">
<o:param><h:link outcome="contact" value="#{template['contactUs']}" /></o:param>
</h:outputFormat>