2

ajaxフォームの検証に問題があります。私は struts-core 2.3.1.2、struts-jquery-plugin 3.3.0、および struts-json-plugin を使用しています。

この問題は、ajax フォームが ajax リクエストによって送信され、検証が失敗した場合に発生します。その場合、フォーム全体が結果要素に配置されます。したがって、ajax sumbit ボタンで ajax 検証を有効にすることができます。 http://code.google.com/p/struts2-jquery/wiki/検証

古い情報もあります: http://struts.apache.org/2.2.3.1/docs/ajax-validation.html

しかし、インターセプター「jsonValidationWorkflowStack」は、投稿に書かれているように struts-default.xml にありません: jsonValidationWorkflowStack は Struts 2.3.1 で削除されたようです

struts-plugin.xml の struts-json-plugin にソースされます。これを直接使用する方法はわかりませんが、struts.xml で独自のスタックを構築します。

<!-- Sample JSON validation stack  -->
<interceptor-stack name="jsonValidationWorkflowStack">
            <interceptor-ref name="basicStack"/>
            <interceptor-ref name="validation">
                <param name="excludeMethods">input,back,cancel</param>
            </interceptor-ref>
            <interceptor-ref name="jsonValidation"/>
            <interceptor-ref name="workflow"/>
        </interceptor-stack> 
    </interceptors>
<action name="updateMySettings" method="execute" class="de.ra.daod.actions.MyAppSettingAction">
        <interceptor-ref name="jsonValidationWorkflowStack"/>
                    <!-- This is not beauty within ajax -->
        <result name="input">/WEB-INF/jsp/mysetting_ajax.jsp</result>
        <result name="success" type="stream">
            <param name="contentType">text/html</param>
            <param name="inputName">inputStream</param>
        </result>
    </action>

そして私のフォームは次のようになります:

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

<s:form id="form" action="private/updateMySettings" theme="xhtml">
                <s:textfield id="screenRes" key="appSetting.screenResolution" label="Screen resolution" required="true" />
<s:select key="appSetting.screenDepth" label="Color depth" list="#{'8':'8','16':'16','24':'24'}" required="true" />
<sj:submit value="Update Settings" targets="status" validate="true"/>
            </s:form>

残念ながら、検証が失敗したかどうかにかかわらず、JavaScript エラーが発生します。

Uncaught TypeError: Object #<Object> has no method 'indexOf'
f.extend.ajax  jquery-1.7.1.min.js:4
b.fn.ajaxSubmit
a.struts2_jquery.validateForm  jquery.struts2-3.3.0.min.js:18
a.subscribeHandler.h.beforeSubmit  jquery.struts2-3.3.0.min.js:18
b.fn.ajaxSubmit
a.subscribeHandler.e  jquery.struts2-3.3.0.min.js:18
e.extend.each  jquery-1.7.1.min.js:2
a.subscribeHandler.e  jquery.struts2-3.3.0.min.js:18
f.event.dispatch  jquery-1.7.1.min.js:3
f.event.add.h.handle.i  jquery-1.7.1.min.js:3
f.event.trigger  jquery-1.7.1.min.js:3
f.fn.extend.trigger  jquery-1.7.1.min.js:3
e.extend.each  jquery-1.7.1.min.js:2
e.fn.e.each  jquery-1.7.1.min.js:2
f.fn.extend.trigger  jquery-1.7.1.min.js:3
d.fn.extend.publish  jquery.subscribe.min.js:16
e.extend.each  jquery-1.7.1.min.js:2
d.fn.extend.publish  jquery.subscribe.min.js:16
(anonymous function)  jquery.struts2-3.3.0.min.js:18
f.event.dispatch  jquery-1.7.1.min.js:3
f.event.add.h.handle.i  jquery-1.7.1.min.js:3

応答からのjsonオブジェクトを処理できないようで、古い指示に従った理由がわかりません。この関数がjsonオブジェクトで使用されている場合、struts/utils.jsのStrutsUtils.getValidationErrors関数が原因だと思いますが、よくわかりません。誰でも助けることができますか?

4

2 に答える 2

1

ストリームの結果と ajax はうまく連携していないと思います。ターゲット属性を削除するだけです。–ジョゲプ

AJAXの趣旨は新しいページをロードするのではなく、現在のページに何でもロードするため、AJAX送信ボタンを使用するため、私はあなたに同意しません。ページ自体をリロードせずに、アクションのユーザーに通知します。回避策は、javascript を使用して status div 要素の内容をクリアすることです。struts2-jquery-plugin で自動化できると思います。これは、タブ付きペインに埋め込まれた私のフォームです。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>

<s:if test="appSetting != null">
<h3>Application settings</h3>
<div id="status" class="welcome"></div> 
<table>
    <tr>
        <td>
            <s:form id="form" action="updateMySettings" theme="xhtml">
                <s:textfield id="screenRes" key="appSetting.screenResolution"
                    label="Screen resolution" required="true" />
                <s:select key="appSetting.screenDepth" label="Color depth"
                    list="#{'8':'8','16':'16','24':'24'}" required="true" />
                <sj:submit id="updateSetting" value="Update Settings" targets="status" validate="true" />
            </s:form>
        </td>
        <td valign="top">
            <button id="fullScreen">Use full screen</button>
            <button id="fullBrowser">Use full browser</button>
        </td>
    </tr>
</table>
<script>
$("#fullScreen").click(function() {
    scr_width = Math.max(screen.width,screen.height);
    scr_height = Math.min(screen.width,screen.height);
    $("#screenRes").val(scr_width + 'x' + scr_height);
});
$("#fullBrowser").click(function() {
    brw_width = Math.max(window.innerWidth, window.innerHeight);
    brw_height = Math.min(window.innerWidth, window.innerHeight);
    $("#screenRes").val(brw_width + 'x' + brw_height);
});
$("#updateSetting").click(function() {
    $("#status").empty();
})
</script>
</s:if>
<s:else>
<p>No settings available.</p>
</s:else>

それは非常にうまく機能します。

于 2012-07-04T07:10:49.567 に答える
0

あなたは解決済みのStruts2 Issueに足を踏み入れています。最新バージョンの 2.3.3 または 2.3.4 にアップグレードすると、問題は解決するはずです。

于 2012-06-18T18:10:48.030 に答える