【问题标题】:jQuery validation engine in Struts 2 not workingStruts 2 中的 jQuery 验证引擎不工作
【发布时间】:2013-09-09 06:21:11
【问题描述】:

我的Eclipse Dynamic Web Project结构如下:

网页内容:

  • CSS
    • (使用各种 css 文件)
  • JavaScript
    • (JS 文件)
  • 页数
    • Page1.jsp
    • Page2.jsp
  • 元信息
  • WEB-INF
    • web.xml

我在page1.jsp 中使用jQuery 验证引擎进行前端和Ajax 验证,Ajax 部分调用一个动作类,然后验证数据。

page1.jsp:

<script>
    $(document).ready (function ()
    {
        $("#subform").validationEngine('attach', {
            autoHidePrompt : true , 
            autoHideDelay : 5000,
            ajaxFormValidation : true,
            ajaxFormValidationURL : 'ajaxVal/FormVal',
            ajaxFormValidationMethod : 'post',
            onBeforeAjaxFormValidation : function (form, options) {
                console.log ("before ajax validation in function");
                form.validationEngine ('hideAll');
                $('#txtlname').validationEngine ('showPrompt', 'Validating your name please wait', 'load', true);
                return true;
            },
            onAjaxFormComplete : function (status, form, json, option) {
                console.log ("ajax validation done");
                console.log ("status: " + status);
                console.log ("data returned " + json);
                console.log ("checking status now");
                if (status) {
                    console.log ("status good, detaching now");
                    form.validationEngine ('hideAll');
                    form.validationEngine ('detach');
                    form.submit ();
                }
            }
        }); 
    });
</script>


<title>Form Validation test</title>
</head>

<body>

<div>                           
    <form id = "subform" action = "submitForm" method = "post">         <br><br><br>
        First Name: <input id = "txtfname" name = "txtfname" type = "text" class = "validate[required]" 
            placeholder = "enter emp name" />
        Last name: <input id = "txtlname" name = "txtlname" type = "text" placeholder = "enter emp lname" 
                class = "validate[required, ajax[ajaxStrutsCall]]" />
        Age: <input id = "txtage" name = "txtage" type = "text" placeholder = "enter age"  />           
        <input id ="cmdsubmit" type = "submit" name = "cmdsubmit" value = "click here" />
    </form>
</div>
    
</body>

"last name"输入标签的class属性中的Ajax调用在jquery.validationEngine-en.js是:

"ajaxStrutsCall": {
                "url": "ajaxVal/LnameVal",
                "alertTextOk": "Your last name seems ok",
                "alertText": "Bad Last name",
                "alertTextLoad": "Validating, please wait"
            },

我的struts.xml

<struts>
<constant name = "struts.devMode" value = "true" />

<package name = "strutsaction" extends = "struts-default">
    <action name = "submitForm" class = "validation.action.JqueryAction" method = "execute">
        <result name = "success">/Pages/page2.jsp</result>
    </action>       
</package>


<package name = "ajaxAction" namespace = "/ajaxVal" extends = "json-default">

    <action name = "LnameVal" class = "validation.struts.AjaxStrutsAction" method = "execute">
        <result name = "success" type = "json" />
    </action>
    
    <action name = "FormVal" class = "ajax.form.validator.FormValidation" method = "execute">
        <result name = "success" type = "json" />
    </action>
    
</package>

现在,当page1.jsppage2.jsp 位于一个文件夹中时,即在WebContent 中,所有代码都可以正常运行,只要我将它们添加到Pages/ 文件夹中,Ajax验证调用不会发生,即使对下一页的操作发生了。

我认为这是因为 URL 不匹配,当我尝试访问我的 tomcat 服务器中的 struts 类时,因为以下 URL 有效:

http://localhost:8080/AjaxTest/ajaxVal/LnameVal

然而,这并没有:

http://localhost:8080/AjaxTest/Pages/ajaxVal/LnameVal 

我什至将struts.xml 中的ajaxAction 包中的命名空间更改为/Pages/ajaxVal,但没有骰子。

【问题讨论】:

    标签: java ajax jsp struts2 jquery-validation-engine


    【解决方案1】:

    要提交到action,需要把action URL。使用 Struts 标签需要 taglib 定义

    <%@ taglib prefix="s" uri="/struts-tags" %>
    

    将表单标签改为

    <form id="subform" action="<s:url action='submitForm'/>" method="POST">
    

    您应该编写相同的代码来获取验证 URL 的 url

    ajaxFormValidationURL : '<s:url namespace="/ajaxVal" action="FormVal"/>',
    

    记住始终使用 URL 标记来呈现 URL。

    【讨论】:

    • 嗨,这只是我不明白的事情,struts 动作类(在表单提交上调用)运行良好(一旦我删除了 ajax 验证器,当然,否则表单不会提交),只有 ajaxFormValidationURL来自 jquery.validationEngine-en.js 的 ajax 调用不起作用
    • 谢谢,这完美!但是姓氏文本字段也使用来自ajax[ajaxStrutsCall] 的ajax 验证,这从包含url 的jquery.validationEngine-en.js 文件中调用规则,我不能在那里使用struts 标记:/(请参阅我的问题编辑)
    • 我也不明白为什么会发生这种情况,我不需要为表单中映射的action 属性使用 url 标记,但其余部分我会这样做。当我在 struts.xml 中指定类时,我不应该能够从任何我想调用的地方调用它吗?
    • 因为js不是可编译的代码,最后一个问题不清楚,“从任何地方”是什么意思?
    • 我的最后两个问题是无关的,1)我如何设置jquery.validationEngine-en.js中的url? 2)strutsaction包中的struts动作submitForm可以通过page1中的形式调用,无论page1是在pages/文件夹还是WebContent文件夹,为什么ajax的url不一样?
    【解决方案2】:

    您正在使用相对 URL 进行验证操作:

    ajaxFormValidationURL : 'ajaxVal/FormVal'
    

    您应该使用&lt;s:url&gt; 标签或将路径设为绝对路径。它一直有效,直到你移动它提供了最大的线索;当您开始四处移动时,相对 URL 本质上是脆弱的。

    IMO 手工编码 URL 有点脆弱,这也是原因之一。

    无关,但我可能会将 "valaction" 包命名空间设置为 "/"

    【讨论】:

    • 我试过 但它在萤火虫中给了我这个错误: SyntaxError: invalid regular expression flag a ajaxFormValidationURL : /AjaxTest/ajaxVal/ FormVal.action
    • “valaction”包的名称不正确,对此我很抱歉,我对其进行了编辑,它实际上是在提交时调用的 struts 动作类,实际上工作正常。此外,即使我使用&lt;s:url&gt;,我也无法在jquery.validationEngine-en.js 中使用。
    • 另外,我从来没有在我的 struts 包中使用过命名空间(编辑后,valactionstrutsaction)有什么特别的优势吗?没有它似乎也能正常工作
    • 对不起,我的错,&lt;s:url namespace ='/ajaxVal' action = 'FormVal' /&gt; 正在为表单验证工作,我忘了添加引号,愚蠢的错误。但另一个问题,对于 jquery.validationEngine-en.js 仍然存在
    • @doggkilla 当然,因为 JS 文件通常不会被 JSP 处理。你需要在你的 JSP 和你的 JS 之间建立一座桥梁,或者通过提供一种机制来从 HTML DOM 中检索一个值(例如,在隐藏的 DOM 对象中隐藏一个值,使用 data- 属性等)或者访问在您的 JSP 页面中创建的 JS 值等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2017-12-16
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多