Jsf 基于所选项目显示特定的模型特性

Jsf 基于所选项目显示特定的模型特性,jsf,jsf-2,el,Jsf,Jsf 2,El,我有这个模型: public class Rent { private Integer priceDay; private Integer priceWeek; private Integer priceMonth; // ... } 我想根据下拉列表中选择的价格类型显示所需条款的价格,可以是“天”、“周”和“月”。目前,我已经解决了如下问题: <h:selectOneMenu value="#{bean.priceType}"> <

我有这个模型:

public class Rent {

    private Integer priceDay;
    private Integer priceWeek;
    private Integer priceMonth;

    // ...
}
我想根据下拉列表中选择的价格类型显示所需条款的价格,可以是“天”、“周”和“月”。目前,我已经解决了如下问题:

<h:selectOneMenu value="#{bean.priceType}">
    <f:selectItem itemValue="" itemLabel="Price" />
    <f:selectItem itemValue="day" />
    <f:selectItem itemValue="week" />
    <f:selectItem itemValue="month" />
    <f:ajax listener="#{bean.changePrice}" render="price" />
</h:selectOneMenu>
<h:outputText id="price" value="#{bean.price}" />

但是,我觉得这很笨拙,应该有一种更简单、更优雅的方法来实现这一点,而不需要控制器中的整个if-else块和模型属性的副本。这可能吗?

您可以使用EL中的大括号符号
[]
通过动态属性名称引用bean属性

这应该做到:

<h:selectOneMenu binding="#{priceType}">
    <f:selectItem itemValue="#{null}" itemLabel="Price" />
    <f:selectItem itemValue="priceDay" itemLabel="day" />
    <f:selectItem itemValue="priceWeek" itemLabel="week" />
    <f:selectItem itemValue="priceMonth" itemLabel="month" />
    <f:ajax render="price" />
</h:selectOneMenu>
<h:panelGroup id="price">
    <h:outputText value="#{bean.rent[priceType.value]}" rendered="#{not empty priceType.value}" />
</h:panelGroup>

这样,您就可以摆脱bean中的
priceType
price
属性和
changePrice()
方法



与具体问题无关,按值比较字符串(和一般对象)不应使用
compareTo()
方法,而应使用
equals()
方法。

EL在webserver中运行,而不是在webbrowser中运行。也许你脑子里有JavaScript?实际上我在考虑JSF,但到目前为止还没有任何进展=]当前的方法到底有多“不雅”?我必须在
bean
中创建
属性
,只是为了表示bean中已经存在的东西,比如:
bean.priceDay
bean.priceWeek
bean.priceMonth
。我只想根据所选的
价格
在这些
价格之间切换。我想他想说的是,如果我错了,请纠正我,因为他已经在BeanModel对象中拥有了值,他不太乐意在managedBean中创建另一个属性来持有相同的值。
<h:selectOneMenu binding="#{priceType}">
    <f:selectItem itemValue="#{null}" itemLabel="Price" />
    <f:selectItem itemValue="priceDay" itemLabel="day" />
    <f:selectItem itemValue="priceWeek" itemLabel="week" />
    <f:selectItem itemValue="priceMonth" itemLabel="month" />
    <f:ajax render="price" />
</h:selectOneMenu>
<h:panelGroup id="price">
    <h:outputText value="#{bean.rent[priceType.value]}" rendered="#{not empty priceType.value}" />
</h:panelGroup>