根据SelectItem信息更改HtmlSelectOneMenu显示值

时间:2012-12-21 09:43:51

标签: jsf-2

您好我有关于动态显示HtmlSelectOneMenu值的问题。下面是一个描述我的问题的小应用程序。

我的支持bean中有一个汽车列表List<Car> carList = new ArrayList<Car>()

Car是一个抽象类,ToyotaFord扩展Car

现在我需要根据类类型在selectonemenu中显示不同的消息。如果是丰田那么我会展示别的东西。也许更清楚的代码来讲述故事。

支持Bean:

@ManagedBean(name="myBean")
@SessionScoped
public class MyCarBackingBean implements PhaseListener {

    private List<Car> carList = new ArrayList<Car>();
    private HtmlSelectOneMenu hsom;
    Car myCar;

    @PostConstruct
    public void init() {
        carList.add(new Ford());
        carList.add(new Toyota());
    }


    @Override
    public void beforePhase(PhaseEvent event) {
    //hsom becomes null here. Im pretty sure the setHsom was called before and the variable was set.
    if(hsom != null) {
        switch((Integer)hsom.getValue()){
            case 1: hsom.setValue("This is a Ford car"); break;
            case 2: hsom.setValue("This is a Toyota car"); 
        }
    }


    //The rest of the world...
}

我将selectonemenu绑定到我页面中的组件:

<h:form>
    <h:selectOneMenu binding="#{myBean.hsom}">
       <f:selectItems value="#{myBean.carList}" var="car" itemValue="#{car.id}" itemLabel="#{car.id}" />
       </h:selectOneMenu>
    <h:commandButton value="Submit" action="#{myBean.mySubmit()}"/>
</h:form>

最后是模型类:

public abstract class Car {

    protected int id;
    //Getters and Setters

}

public class Toyota extends Car {

    public Toyota(){
        this.id = 2; //in case of ford car, id is 1.
    }

}

我正在考虑使用阶段监听器来改变显示,因为我读了一些帖子说改变getter和setter并将业务逻辑放在其中是不好的。我也不想将这些汽车包裹在其他物体中并使用itemLabelitemValue

但是当我调试它时,我发现当执行到达hsomnullbeforePhase但在代码的其余部分它不为空。

所以我的问题是:这是一个使用阶段监听器的好方法吗?为什么组件对象在beforePhase

中为空

1 个答案:

答案 0 :(得分:2)

为您的班级添加其他属性(例如description)。根据需要实现它,并在selectItems标记中引用它。 V.g。

<f:selectItems value="#{myBean.carList}" var="car" itemValue="#{car.id}" itemLabel="#{car.description}" />

或者,使用返回myBean.carList的方法替换List<SelectItem>,然后根据需要创建selectItems

根据经验,尽量将.xhtml保持为“无逻辑”。