Jsf 2 根据SelectItem信息更改HtmlSelectOneMenu显示值
您好,我在动态显示HtmlSelectOneMenu的值时遇到问题。下面是一个描述我的问题的小应用程序 在我的后台bean中有一个汽车列表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
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
但是当我调试它时,我发现当执行到达前阶段之前,hsomhsom
是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}" />