我目前有以下JSF:
<p:outputLabel value="#{msg['label.address.province']}"
rendered="#{address.country ne CountryEnum.UNITED_STATES.country}"/>
<p:outputLabel value="#{msg['label.address.province']}"
rendered="#{address.country eq CountryEnum.UNITED_STATES.country}"/>
我的属性文件包含
label.address.province=Province
label.address.state=State
这很好用,当国家是“美国”时,我的标签输出“州”,而对于任何其他国家,它输出“省”。
我想做的是尝试摆脱两个标签条目,只使用一个,在messages.properties中使用一个choiceformat。我的第一次尝试看起来像:
<h:outputFormat value="#{msg['label.address.province.choice']}">
<f:param value="#{address.country.id}"/>
</h:outputFormat>
和
label.address.province.choice={0, choice, 1#Province|2#State|3#Province}
编辑地址时效果很好。但是在添加新地址时,根据我的业务规则,所有字段都是空白的。这意味着 address.country 为空,这意味着我的选择格式产生“空”作为输出。
然后我想使用omnifaces:
<h:outputFormat value="#{msg['label.address.province.choice']}">
<f:param value="#{o.coalesce(address.country.id, '1')}"/>
</h:outputFormat>
但这也会产生空值。address 是我的托管 bean, country 是我自己的简单 javabean 类, id 是 type 的属性java.io.Serializable
。
我知道“address.country.id”是由 EL 评估的,当它遇到 null 并且不会抛出 NPE 时,它会“很好地”停止。但是,是不是因为 coalesce 不做这种相同类型的行为,而我传入的必须是非 EL 表达式?抱歉,我刚刚开始我的 JSF 冒险,所以我可能没有使用正确的词。
我也愿意采取完全不同的方法,这仍然会将我的 outputLabels 减少为某种类型的单个标签。
我正在使用 Mojarra 2.1.21、Primefaces 3.5、Omnifaces 1.4.1、Java 7、Tomcat 7