Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 根据SelectItem信息更改HtmlSelectOneMenu显示值_Jsf 2 - Fatal编程技术网

Jsf 2 根据SelectItem信息更改HtmlSelectOneMenu显示值

Jsf 2 根据SelectItem信息更改HtmlSelectOneMenu显示值,jsf-2,Jsf 2,您好,我在动态显示HtmlSelectOneMenu的值时遇到问题。下面是一个描述我的问题的小应用程序 在我的后台bean中有一个汽车列表list carList=new ArrayList() 汽车是一个抽象类,Toyota和Ford扩展了Car 现在,我需要根据类类型在SelectOne菜单中显示不同的消息。如果是丰田,那么我会展示其他东西。也许代码更清楚地说明了这个故事 支持Bean: @ManagedBean(name="myBean") @SessionScoped public cl

您好,我在动态显示HtmlSelectOneMenu的值时遇到问题。下面是一个描述我的问题的小应用程序

在我的后台bean中有一个汽车列表
list carList=new ArrayList()

汽车是一个抽象类,
Toyota
Ford
扩展了
Car

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

支持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...
}
我正在考虑使用一个阶段侦听器来更改显示,因为我读到一些帖子说,更改getter和setter并将业务逻辑放入其中是不好的。我也不想将这些汽车包装在其他对象中,并使用
itemlab
itemValue

但是当我调试它时,我发现当执行到达前阶段之前,hsom
hsom
null
,但在代码的其余部分它不是null

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

为类添加一个不同的属性(比如
description
)。根据您的喜好实施它,并在
selectItems
标签中引用它。V.g

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

或者,用返回
列表的方法替换
myBean.carList
,并根据需要创建
selectItems


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

您好,谢谢您的回答。问题是,在我的实际应用程序中,这些类是给我的,我无法更改它们。我还考虑过将它们转换为其他jsf友好的对象,如u所述,但在我的实际案例中,这种转换非常重要,将来列表可能会变得非常大。保持配置文件逻辑自由听起来不错。非常感谢“经验法则”XD将其转换(或复制)为另一个对象,构建包装器怎么样?包装器不复制值,而是引用原始对象,并且可以在其自己的.hischuan中添加一些属性。我想我将只使用包装器来省去麻烦:-)非常感谢XD如果包装器仅用于选择,可能值得直接使用OK。事实证明,phaselistener和managedbean是不同的东西……如果我要在渲染之前更改组件的值,我应该改为使用
标记。
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.
    }

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