3

私はこの小さなフォームを持っており、JSF検証でのajaxの使用を理解しようとしています。これがフォームです。(バッキングBeanは、firstNameとlastNameの2つの変数を持つ単純なBeanです。)

<h:form>
    <h:outputLabel for="firstName" value="First Name: " />
    <h:inputText id="firstName" value="#{userBean.firstName}">
        <f:validateLength minimum="5" />
        <f:ajax event="keyup" render="firstNameMsg" />
    </h:inputText>
    <h:message id="firstNameMsg" for="firstName" style="color: red" />
    <br />
    <h:outputLabel for="lastName" value="Last Name: " />
    <h:inputText id="lastName" value="#{userBean.lastName}">
        <f:validateLength minimum="5" />
        <f:ajax event="keyup" render="lastNameMsg" />
    </h:inputText>
    <h:message id="lastNameMsg" for="lastName" style="color: red" />
    <br />
    <h:commandButton value="Submit">
        <f:ajax execute="firstName lastName" render=":greeting" />
    </h:commandButton>
    <br />
</h:form>
<h:outputText id="greeting" value="#{userBean.greeting}" />

ボタンにajaxをアタッチして、送信時に出力テキストタグを名と姓でレンダリングします。これは問題ありません。私の質問は、2つのフィールドを検証するために、タグと一緒f:ajaxタグを使用する必要があるのはなぜですか?私の理解では、ajaxはレンダリング応答フェーズまでのすべてのライフサイクルフェーズを実行します。つまり、検証が含まれます。検証フェーズでは、ajaxリクエストからのものか、通常の送信/アクションリクエストからのものかに関係なく、メッセージを含むページが再レンダリングされませんか?入力フィールドに添付されているajaxタグを削除すると、検証メッセージは表示されませんが、ajaxを完全に削除し、commandButtonsアクションイベントを使用して通常の送信を使用すると表示されます。f:validateLength

4

1 に答える 1

7

これは、通常のリクエスト処理では、サーバーに値を送信する唯一の方法(クライアント側のスクリプト処理なし)は、フォーム全体を送信することであるためです。これは、すべてを削除したときに発生します<f:ajax>。入力フィールドに入力するだけでは、サーバー(この場合は検証メッセージ)から応答を受け取ることはできません。

<f:ajax>コンポーネントからfirstNameを削除し、lastName最後の1つだけをそのままにしておくと、<h:commandButton>実行され、それらのフィールドに対してサーバー側の検証が実行されますが、結果としてコンポーネントのみがレンダリングされます。これを修正するには、これに追加できます。firstNamelastName:greeting<h:commandButton>

<f:ajax execute="firstName lastName" render=":greeting firstNameMsg lastNameMsg"/>

ただし、これらのメッセージは、入力フィールドにキーを入力したときではなく、フォームを送信したときにのみ表示されるようになりました。

要約を得るには、AJAXを使用して、リクエストの送信後にレンダリングする必要のあるコンポーネント(およびそのすべての子)を正確に指定する必要があります。

ちなみに、入力フィールドにユーザーが入力したキーごとにサーバーリクエストを送信することはお勧めできません。これを行うにはJavaScriptまたは他のクライアント側テクノロジーを使用する方が適切であり、サーバーでは最終的な値全体のみを検証します。

于 2013-01-23T11:07:45.577 に答える