0

こんにちは私は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ですか?

4

1 に答える 1

2

クラスに別の属性(たとえば)を追加descriptionします。好きなように実装し、selectItemsタグで参照してください。Vg

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

myBean.carListまたは、を返すメソッドに置き換えて、必要に応じList<SelectItem>てを作成selectItemsします。

経験則として、.xhtmlを可能な限り「ロジックフリー」に保つようにしてください。

于 2012-12-21T09:49:11.813 に答える