有没有一种方便的方法在JSF中创建带样式的格式化输出?

时间:2018-06-12 09:49:12

标签: jsf

我有一个JSF基础Web应用程序,我使用h:outputFormatf:param在本地化字符串文字中注入参数值。

这是我的JSF:

<h:outputFormat value="#{msg['camelComplaint']}">
    <f:param value="#{crusadeBean.camelCount}" />
</h:outputFormat>

这是我的留言:

camelComplaint=Sallah, I said no camels. That's {0} camels. Can't you count? 

这是生成的输出:

Sallah, I said no camels. That's 5 camels. Can't you count?

这一切都很好并且符合预期。但是,我想强调注入的参数值。也就是说,我想创建以下输出:

Sallah, I said no camels. That's <span class="ui-highlight">5</span> camels. Can't you count?

是否有方便的方式来设置各个参数的样式?

这是我到目前为止所尝试的:

  1. 将字符串文字拆分为多个部分并使用多个h:outputText

    <h:outputText value="#{msg['camelComplaint.part0']} " />
    <h:outputText value="#{crusadeBean.camelCount}" styleClass="ui-highlight" />
    <h:outputText value=" #{msg['camelComplaint.part1']}" />
    

    使用:

    camelComplaint.part0=Sallah, I said no camels. That's
    camelComplaint.part1=camels. Can't you count? 
    

    虽然这会创建所需的输出,但如果需要在本地化中切换某些参数的顺序,则会失败。它还需要部分文字(参数值周围的空格)在JSF中,并且可以说是一个相当难看的解决方案。

  2. 将原始HTML添加到参数值:

    <h:outputFormat value="#{msg['camelComplaint']}" escape="false">
        <f:param value="&lt;span class=&quot;ui-highlight&quot;&gt;#{crusadeBean.camelCount}&lt;/span&gt;" />
    </h:outputFormat>
    

    这再次创建了所需的输出,但取决于escape="false"的用法。这意味着如果参数值包含某些字符(例如<>)或者完全是危险的,如果参数值是用户生成的内容(因为它允许代码),此解决方案可能会中断注射)。代码也不太可读。

  3. 将原始HTML添加到字符串文字:

    <h:outputFormat value="#{msg['camelComplaint']}" escape="false">
        <f:param value="#{crusadeBean.camelCount}" />
    </h:outputFormat>
    

    使用:

    camelComplaint=Sallah, I said no camels. That's <span style="ui-highlight">{0}</span> camels. Can't you count? 
    

    这再次创建了所需的输出,但也取决于escape="false"的用法,因此遇到与先前解决方案相同的问题。此外,它将部分布局移动到本地化。

1 个答案:

答案 0 :(得分:2)

令人惊讶的OmniFaces在这里得到了拯救(就像许多其他地方一样)。它f:param替换value,也接受内容子项,旁边使用camelComplaint=Sallah, I said no camels. That's {0} camels. Can't you count? 属性。假设您的原始本地化:

o:param

使用原始代码,解决方案2和使用<h:outputFormat value="#{msg['camelComplaint']}" escape="false"> <o:param> <span class="ui-highlight"> <h:outputText value="#{crusadeBean.camelCount}" /> </span> </o:param> </h:outputFormat> 的混合,以下内容将起作用

styleClass

如果你只是需要一种风格,你可以,正如你自己正确地纠正我一样,在h:outputText上使用<h:outputFormat value="#{msg['camelComplaint']}" escape="false"> <o:param> <h:outputText value="#{crusadeBean.camelCount}" styleClass="ui-highlight" /> </o:param> </h:outputFormat>

escape="false"

outputText没有<my:localizationHighlightFormat message="#{msg['camelComplaint']}" value="#{msg['camelComplaint']}" /> 因此它将逃脱所有事情! outputFormat没有,所以我假设它接受普通的html并将其渲染为

你可以轻松地将它包装在复合组件中并执行

for(int a = 0; a <= presList.size()-1; a++)