1

たとえば、テキスト フィールドと複数選択フィールドを含むフォームがあります。

<h:form id="form2">
    <h:messages for="text3" />
    <h:inputText id="text3" value="#{danielBean.text3}" required="true"/>
    <br/>

    <h:messages for="select1" />
    <h:selectManyMenu id="select1" value="#{danielBean.selStrings}"
        style="height:8em;" required="true"/>
        <f:selectItems value="#{danielBean.allStrings}" var="_item" itemLabel="#{_item} (length #{_item.length()})" />
    <br/>
    <p:commandButton
        value="Submit"
        action="#{danielBean.save()}"
        update=":form2"
    >
</h:form>

送信時に両方が検証され、検証が成功すると、バッキング Bean 内の関連する変数が更新されます。けっこうだ。

この問題は、(複数選択の) 検証が成功しない場合に発生します。私の Bean では、(特にList<String>sallStringsとの場合selStrings)...

@PostConstruct
public void init() {
    text3 = "";

    allStrings.clear();
    allStrings.add("This");
    allStrings.add("is");
    allStrings.add("a");
    allStrings.add("test");

    selStrings.clear();
    selStrings.add("a");
}

...複数選択で事前に選択されたオプションが 1 つになるようにします。ユーザーがそのオプションの選択を解除した場合 (つまり、オプションが選択されていない場合)、検証は - もちろん - 失敗し、エラー メッセージが表示されます...

...しかし、複数選択は空にはなりません。Bean のコンテンツ、つまり「a」が選択された内容が表示されます。これはユーザーを混乱させます。「入力が必要です」というエラー メッセージが表示され、入力済みのフィールドが表示されます。

これは JSF のライフサイクルの機能のようです。BalusC によるこの記事を参照してください。

「JSF が入力コンポーネントをレンダリングするとき、最初に送信された値が null でないかどうかをテストしてから表示し、ローカル値が null でない場合はそれを表示し、それ以外の場合はモデル値を表示します。」

text3null ではなく空の文字列として送信されるため、これはテキスト フィールドに対しては正常に機能します。

問題は、複数選択から選択されたオプションがゼロであることは、送信された値がnullであること、ローカルコピー(最初の送信であるため推測)がnullであることを意味するため、モデル値(「a」が選択されている)が表示されることです.

私はそれを望んでいません。

検証応答をレンダリングするときに、送信された null 値を JSF に強制的に使用させるにはどうすればよいですか?

前もってありがとう
Antares42

4

1 に答える 1