更新:もう一度更新しました。この例を作成できるようになったので、以前の分析は間違っていたと思います。複合コンポーネントと insertChildren タグに関連しているようです。
これが私のフェイスレットです:
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:form="http://java.sun.com/jsf/composite/composite/form"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head></h:head>
<h:body>
<h:form>
<form:workspace>
<h:inputText id="email" value="#{user.email}" size="45"
required="true" requiredMessage="Required">
<f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />
</h:inputText>
<h:message for="email" />
<br />
<h:commandButton action="#{user.update}" value="Update"/>
</form:workspace>
</h:form>
</h:body>
</html>
form:workspace 複合コンポーネントは次のように定義されます。
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
</cc:interface>
<cc:implementation>
<cc:insertChildren/>
</cc:implementation>
</html>
この#{user}
変数は、email と呼ばれるフィールドと getter および setter だけを持つ単純な Bean を参照します。update メソッドは何もしません。
私が得る動作は以下のとおりです。無効な値を入力すると、Bean に格納されている値に戻されます。form:workspace コンポーネントによるラッピングを削除すると、期待どおりに動作します - 値は元に戻されません。JSFバグ?
多数の入力コンポーネントを含む JSF フォームがあります。これらのいくつかには、バリデーターが添付されています。たとえば、単純なものは必須の電子メール アドレスです。
<h:inputText id="email" value="#{profile.user.email}" size="45"
required="true" requiredMessage="Required">
現在、無効なフィールドは送信された値を保持する必要があるという要件を受け取りました。これにより、ユーザーは単純なスペルミスのために多くのテキストを再入力する必要がなくなります。これは私には非常に合理的であり、これが検証のデフォルトの動作であるとさえ思っていました。しかし、そうではないようです-値は以前の値に戻されます(まだ有効だったとき)。
問題は、動作がどうあるべきかについての参照さえ見つからないことです。検証後に表示されるのは UIInput のローカル値であることをどこかで読みました。UIInput のコードを調べると、検証が失敗した場合、ローカル値が意図的に設定されていないことがわかります。しかし、これは完全な真実ではないようです。なぜなら、検証に失敗したものだけでなく、すべての入力フィールドが元に戻されるからです! したがって、モデルから値を再度取得するように見えます。
いずれにしても、この動作を回避する方法はありますか?
JSF 2.0.4-b09 を使用しています。明らかな何かが欠けているように感じます。
編集: 電子メールバリデーターを以下に投稿された BalusC の正規表現に変更しましたが、それでも同じ動作が得られます。問題を説明する画像を投稿しました。画像の上部は、フォームの初期状態を示しています。次に、中央の部分は、「名」、「姓」、および「電子メール」フィールドを変更したことを示しています。下の部分は、保存ボタンをクリックした後の結果を示しています。ご覧のとおり、電子メール フィールドは元に戻されています。それだけでなく、名と姓のフィールドも元に戻されます。