您好我有一个关于动态显示 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 并将业务逻辑放入其中是不好的。我也不想将这些汽车包裹在其他物体中并使用itemLabel
and itemValue
。
但是当我调试它时,我发现这hsom
是null
执行到达的时候,beforePhase
但在代码的其余部分它不为空。
所以我的问题是:为此使用相位监听器是一种好方法吗?为什么组件对象在中为空beforePhase
?