0

我有这个模型:

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}" />

public void changePrice(){
    if (priceType.compareTo("day") == 0) {
        price = rent.getPriceDay();
    } else if (priceType.compareTo("week") == 0) {
        price = rent.getPriceWeek();
    } else if (priceType.compareTo("month") == 0) {
        price = rent.getPriceMonth();
    }
}

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

4

1 回答 1

2

您可以在 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 中priceTypeprice属性和changePrice()方法。


与具体问题无关,按值比较字符串(和一般对象)不应该通过compareTo()方法来完成,而是通过equals()

于 2013-05-08T11:59:49.350 回答