2

更新:もう一度更新しました。この例を作成できるようになったので、以前の分析は間違っていたと思います。複合コンポーネントと 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 の正規表現に変更しましたが、それでも同じ動作が得られます。問題を説明する画像を投稿しました。画像の上部は、フォームの初期状態を示しています。次に、中央の部分は、「名」、「姓」、および「電子メール」フィールドを変更したことを示しています。下の部分は、保存ボタンをクリックした後の結果を示しています。ご覧のとおり、電子メール フィールドは元に戻されています。それだけでなく、名と姓のフィールドも元に戻されます。

問題は 3 つのステップで示されます。

4

2 に答える 2

4

混乱が起こっています。値は、送信された値が空の場合(つまり、ユーザーが初期値を削除したか、何も入力しなかった場合) にのみ初期値に戻されます。実際には何も入力されていないため、テキスト全体を再入力する必要があるという問題がこれにどのように関連しているかはわかりません。

送信された値が空またはの場合null、JSF はモデル値を再表示します。それ以外の場合は、送信された値を期待どおりに再表示します。これは JSF 仕様で指定されています。自分で確認するには、たとえば追加します

<f:validateRegex pattern="([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" />

メール入力欄へ。空でない (!) 送信された値は、無効な電子メール形式の場合に保持されることがわかります。


更新:更新によると、入力コンポーネントが実際にレンダリングされていることがわかりました<cc:insertChildren>。この動作は実際には Mojarra のバグです。1991年号を参照してください。問題のチケットに記載されているように、回避策は、<cc:insertChildren />内部に a<h:panelGroup>または を配置すること<ui:fragment>です。

<cc:implementation>
    <ui:fragment>        
       <cc:insertChildren/>        
    </ui:fragment>
</cc:implementation>

MyFaces 2.1.1 にはこのバグはなく、問題なく動作します。

于 2011-09-05T16:33:03.247 に答える
0

その中に入力コンポーネントの送信された値をクリアするコードがあるかもしれませんpanelGroup(たとえば、panelGroup特定idの 、またはフォーム内の panelGroups を検索するより一般的な分析を行うコード)。

setSubmittedValue呼び出しのプロジェクト ソース コードを全文検索してみてください。

于 2011-09-06T11:37:59.330 に答える