1

Struts2 AJAX 検証を機能させるために数日間試みてきましたが、最後の 1 つの問題を解決できません。struts2jquery プラグインを使用して、フォームを非同期的に送信しています。

  <div id="result"></div>
    <s:form action="RegisterUser" theme="xhtml" method="post">
        <s:textfield key="firstname" label="First name" size="35"
            required="true" />
        <s:textfield key="lastname" label="Last name" size="35"
            required="true" />
        <s:textfield key="address" label="Address" size="35"
            required="true" />
        <s:textfield key="phone" label="Phone number" size="35" />
        <s:textfield key="username" label="Username" size="35"
            required="true" />
        <s:password key="password" label="Password" size="35"
            required="true" />
        <s:textfield key="email" label="E-mail address" size="35"
            required="true" />
        <sj:submit key="Inregistrare" targets="result" align="right"
            button="true" validate="true" onSuccessTopics="notifyRegistration" />
    </s:form>

必要なスクリプトを含めました。

  <script type="text/javascript" src="./js/registerScript.js"></script>
 <!-- This files are needed for AJAX Validation of XHTML Forms -->
 <script src="${pageContext.request.contextPath}/struts/utils.js" type="text/javascript"></script>
 <script src="${pageContext.request.contextPath}/struts/xhtml/validation.js"
type="text/javascript"></script>

およびタグ:

<sj:head jqueryui="true" />

onSuccess ハンドラー:

$(document).ready(function(){
$.subscribe('notifyRegistration', function(event,data) {
    var registrationStatus = event.originalEvent.data.registrationStatus;
    if(registrationStatus == 'SUCCESS'){
        alert('Contul dumneavoastra a fost creat cu success!');
        window.location.href = "./index.html";      
    } else {
        alert('Contul dumneavoastra nu a putut fi creat. Va rugam incercati din nou.');
    }
});
});

私の構成は次のようになります。

 <action name="RegisterUser" class="actions.Register" method="execute">
        <interceptor-ref name="jsonValidationWorkflowStack"/>
        <result name="input">/pages/Register.jsp</result>
        <result type="json"/>
 </action>

そして、私のアクション クラスの execute メソッド:

public String execute() throws Exception {

    if (isInvalid(getUsername()) || isInvalid(getPassword())
            || isInvalid(getEmail())) {
        registrationStatus = REGISTRATION_ERROR;
    }

    if (registerUser()) {
        registrationStatus = REGISTRATION_SUCCESS;
        return SUCCESS;
    }else {     
        registrationStatus = REGISTRATION_ERROR;
    }
    return SUCCESS;
}

このregisterUser()メソッドは、データベースへの実際の挿入を行います。検証 XML は と呼ばれRegister-Validation.xmlます。検証は正常に機能します。一部のフィールドが入力されていない場合、ページを更新せずにエラー ラベルが表示されます。私の問題は、アクションがSUCCESSorを返す場合ERRORでも、ブラウザが別のページ ../Register.action に送り返した JSON を表示することです。onSuccessハンドラーに入らない理由がわかりません。私は他のフォームで AJAX を正常に使用しました。ここでの唯一の違いは、検証 xml とjsonValidationWorkflowStackインターセプターを使用することです。これはなぜですか? また、リダイレクトされないようにするにはどうすればよいですか? onSuccessリクエストがハンドラーに届かないのはなぜですか?

4

1 に答える 1

0

Action に registrationStatus のゲッターはありますか?

alert(event.originalEvent.data.registrationStatus);その値が何であるかを確認するためだけに、notifyRegistrationコールバック関数にを入れます。

ちなみに混んでるらしい

Struts2-jQuery プラグイン Struts2 XHTML テーマによる AJAX フォーム検証

Struts2-jQuery プラグイン: onSuccessTopic で JSON Result を処理するリモート リンク

私の知る限り(ただし、この特定の種類の検証を使用したことはありません)、検証はexecute()ではなく、validate()またはXMLを介して、または注釈を使用して処理する必要があります。Struts2-jQuery Plugin ショーケースの例ではアノテーションを使用していますが、簡単に XML に変換してショーケースを試すことができます。

例に従って、javascript 関数も onSuccessTopic も使用する必要はまったくありません。

ショーケースでも実行できますForms -> Forms with Validation(ただし、ショーケースのコードにはいくつかの部分が欠けているように見えるため、コードのドキュメントに固執します...たとえば、「テスト」パスワードに対する検証)。

于 2013-01-16T10:42:35.317 に答える