1

入力テキストとラジオボタンのセットを持つフォームがあります。ラジオ ボタンをクリックすると、値変更リスナーが呼び出されます。値変更リスナー内で、ユーザーが入力テキスト フィールドに入力した値を出力しています。しかし、ユーザーが入力している新しい値ではなく、常にテキスト フィールドの古い値を取得します。ValueChangeListener が Validation サイクルに含まれることを理解しています。しかし、入力フィールドの新しい値にアクセスする必要がある場合、どうすればよいでしょうか? 注:マネージド Bean はリクエスト スコープです。スコープをセッションに変更すると、正常に動作します。これについての説明は大歓迎です。JSP のコードは次のとおりです。

<h:form>
Enter name:<h:inputText value="#{employee.empId}"></h:inputText>
Choose option: <h:selectOneRadio onclick="this.form.submit()" 
            valueChangeListener="#{employee.check}" >
<f:selectItem itemLabel="one" itemValue="one"/>
<f:selectItem itemLabel="two" itemValue="two"/>
</h:selectOneRadio>
</h:form>
4

1 に答える 1

2

問題の説明(古い値はリクエストスコープでのみ使用可能で、セッションスコープで「機能」します)は、プロパティから取得するのではなく、プロパティに直接アクセスする場合と一致しますValueChangeEvent。これは確かに正しくありません。

ValueChangeEvent古い値と新しい値を返すためのゲッターを提供します。プロパティに直接アクセスする代わりに、これを使用する必要があります。

public void check(ValueChangeEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();
    // ...
}

更新:コメントによると、実際には入力フィールドの値に関心があります。これは、値変更リスナーが実行される検証フェーズの後のモデル値の更新フェーズでのみ設定されます。

従来のJSF1.2を使用しているため、JSF2 ajaxの素晴らしさを使用できない場合、これを解決する方法の1つは、値変更イベントを手動でキューに入れてアクション呼び出しフェーズに入れ、送信された入力テキストを取得できるようにすることです。価値。

public void check(ValueChangeEvent event) {
    if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
        return;
    }

    System.out.println(empId); // It's available in here.
}    
于 2012-11-05T11:39:30.167 に答える