こんにちは私は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.
}
}
そして、フェーズリスナーを使用して表示を変更することを考えています。ゲッターとセッターを変更してビジネスロジックを配置するのは悪いことだという投稿をいくつか読んでいます。itemLabel
また、それらの車を他のオブジェクトでラップして、とを利用したくありませんitemValue
。
しかし、デバッグしてhsom
いるnull
ときに、実行が到達したときであることがわかりましたbeforePhase
が、コードの残りの部分ではnullではありません。
だから私の質問は:これにフェーズリスナーを使用するのは良い方法ですか?そして、なぜコンポーネントオブジェクトがnullなのbeforePhase
ですか?