嗨我有一個關於動態顯示HtmlSelectOneMenu值的問題。下面是一個描述我的問題的小應用程序。根據SelectItem信息更改HtmlSelectOneMenu顯示值
我在我的支持bean中有一個汽車列表List<Car> carList = new ArrayList<Car>()
。
汽車是抽象類和Toyota
和Ford
延伸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.
}
}
而且我思考使用階段偵聽器來改變顯示,因爲我讀了一些帖子,說改變gette是不好的rs和setter並將商業邏輯放在其中。我也不想將這些汽車包裹在其他物體中,並使用itemLabel
和itemValue
。
但是當我調試它時,我發現hsom
是null
當執行到達beforePhase
但它在代碼的其餘部分不爲空。
所以我的問題是:這是一個很好的方式來使用階段偵聽器嗎?爲什麼在beforePhase
中的組件對象爲空?
OK的結果是,phaselistener和managedbean是不同的東西......如果我要在渲染之前更改組件的值,我應該使用''標籤。 –