0

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

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

Car 是一个抽象类,Toyota并且可以Ford扩展Car

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

支持豆:

@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 并将业务逻辑放入其中是不好的。我也不想将这些汽车包裹在其他物体中并使用itemLabeland itemValue

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

所以我的问题是:为此使用相位监听器是一种好方法吗?为什么组件对象在中为空beforePhase

4

1 回答 1

2

description向您的班级添加不同的属性(例如)。随心所欲地实现它,并在selectItems标签中引用它。Vg

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

或者,替换myBean.carList为返回 a 的方法List<SelectItem>,并selectItems根据需要创建 。

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

于 2012-12-21T09:49:11.813 回答