たとえば、テキスト フィールドと複数選択フィールドを含むフォームがあります。
<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 でない場合はそれを表示し、それ以外の場合はモデル値を表示します。」
text3
null ではなく空の文字列として送信されるため、これはテキスト フィールドに対しては正常に機能します。
問題は、複数選択から選択されたオプションがゼロであることは、送信された値がnullであること、ローカルコピー(最初の送信であるため推測)がnullであることを意味するため、モデル値(「a」が選択されている)が表示されることです.
私はそれを望んでいません。
検証応答をレンダリングするときに、送信された null 値を JSF に強制的に使用させるにはどうすればよいですか?
前もってありがとう
Antares42