struts2+jquery+ajax表单验证
jopen
11年前
一、常见问题:
1.提示json-default包不存在或拦截器jsonValidationWorkflowStack不存在?
解决:struts2-json-plugin-xxx.jar
2.每验证一次,错误信息就累加一次,出现重复?
解决:如果你整合了spring,请将相应bean的singleton设为false(spring中的bean默认为单例模式,导致前次验证产生的错误信息一直存在)
二、Demo1:使用xhtml主题的表单验证
1.struts.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="admin" extends="json-default" namespace="/admin"> <action name="login" class="com.wogu.jwa.actions.IndexAction"> <result>/WEB-INF/views/login.jsp</result> </action> <action name="dologin" class="com.wogu.jwa.actions.LoginAction"> <result>/admin/index</result> <result name="input">/WEB-INF/views/login.jsp</result> <interceptor-ref name="jsonValidationWorkflowStack"/> </action> </package> </struts>
2./WEB-INF/views/login.jsp
<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html> <html> <head> <title>struts2+jquery+Ajax表单验证 - WoguAdmin - power by wogu</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!--加入/struts即请求的静态资源--> <script type="text/javascript" src="${pageContext.request.contextPath}/struts/jwa/js/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/struts/jwa/js/jquery.form.js"></script> <script language="JavaScript" src="${pageContext.request.contextPath}/struts/utils.js" type="text/javascript"></script> <script language="JavaScript" src="${pageContext.request.contextPath}/struts/xhtml/validation.js" type="text/javascript"></script> <s:head theme="xhtml" /> </head> <body> <s:form id="myform" theme="xhtml" namespace="/admin" action="dologin" method="post"> <s:textfield name="username" label="用户名"/> <s:textfield name="password" label="密 码"/> <s:submit value=" 登录 "/> <s:reset value=" 清除 "/> <!--只验证,Action类不会被执行到--> <s:hidden name="struts.validateOnly" value="true"/> <!--必须加入--> <s:hidden name="struts.enableJSONValidation" value="true"/> </s:form> </body> </html> <script type="text/javascript"> jQuery('#myform').ajaxForm({ 'success' : function(errorsObject) { StrutsUtils.clearValidationErrors(myform); if(errorsObject.fieldErrors) { StrutsUtils.showValidationErrors(myform, errorsObject); return false; } //validate success } }); </script>
3.com.wogu.jwa.actions.LoginAction
package com.wogu.jwa.actions; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
4.com/wogu/jwa/actions/LoginAction-validation.xml
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators> <field name="username"> <field-validator type="requiredstring"> <message>You must enter a name</message> </field-validator> </field> <field name="password"> <field-validator type="requiredstring"> <message>You must enter a password</message> </field-validator> </field> </validators>
5.访问127.0.0.1:8080/admin/login
三、demo2:灵活的表单验证
1.创建自定义主题classpath/template/jwa
1-1.classpath/template/jwa/theme.properties
parent = simple
1-2.classpath/template/jwa/form-close.ftl
<#if parameters.validate == true> <input type="hidden" name="struts.enableJSONValidation" value="true"/> </#if> <#if parameters.dynamicAttributes.validateOnly?default("false") == "true"> <input type="hidden" name="struts.validateOnly" value="true"/> </#if> <#include "/${parameters.templateDir}/simple/form-close.ftl" /> <#if parameters.validate == true> <script type="text/javascript" src="${base}/struts/jwa/js/jquery.form.js"></script> <script type="text/javascript" src="${base}/struts/jwa/js/validation.js"></script> <script type="text/javascript"> $(document).ready(function() { jQuery('#${parameters.id}').ajaxForm({ 'success' : function(data, status, xhr, form) { if(hasValidationErrors(data)) { showValidationErrors(data, form); } else { location.href = form.attr('forward'); } } }); }); </script> </#if>1-3.classpath/template/jwa/js/validation.js
function hasValidationErrors(data) { if(data.errors || data.fieldErrors) return true; else return false; } function showValidationErrors(data, form) { var formid = form.attr('id'); var actionErrorWrap = $('#'+form.attr('actionErrorId')); var actionErrorWrapExist = actionErrorWrap.length > 0; if(actionErrorWrapExist) { actionErrorWrap.html(''); } if(data.errors) { for(var i in data.errors) { if(!actionErrorWrapExist) alert(data.errors[i]); else actionErrorWrap.append('<p>'+data.errors[i]+'</p>'); } } if(data.fieldErrors) { for(var i in data.fieldErrors) { var error = data.fieldErrors[i].toString(); var field = $('#'+formid+'_'+i); var fieldErrorWrap = $('#'+field.attr('fieldErrorId')); if(fieldErrorWrap.length > 0) { fieldErrorWrap.html(error); } else if(actionErrorWrapExist) { actionErrorWrap.append('<p>'+error+'</p>'); } else { alert(error); } } } }
2.创建com.wogu.jwa.AjaxAction
package com.wogu.jwa; import java.util.*; import com.opensymphony.xwork2.ActionSupport; public class AjaxAction extends ActionSupport { public static final String AJAX = "ajax"; private Map<String, Object> ajaxErrors = new HashMap<String, Object>(); public Map<String, Object> getAjaxErrors() { Collection<String> errors = getActionErrors(); if(errors.size() > 0) { ajaxErrors.put("errors", errors); } Map<String, List<String>> fieldErrors = getFieldErrors(); if(fieldErrors.size() > 0) { ajaxErrors.put("fieldErrors", fieldErrors); } return ajaxErrors; } }
3.struts.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="admin" extends="json-default" namespace="/admin"> <action name="login" class="indexAction"> <result>/WEB-INF/views/login.jsp</result> </action> <action name="dologin" class="loginAction"> <result name="ajax" type="json"> <param name="root">ajaxErrors</param> </result> <result name="input">/WEB-INF/views/login.jsp</result> <interceptor-ref name="jsonValidationWorkflowStack"/> </action> </package> </struts>
4./WEB-INF/views/login.jsp
<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html> <html> <head> <title>struts+jquery+Ajax表单验证 - power by wogu</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link href="favicon.ico" rel="shortcut icon"> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/struts/jwa/css/style.css"> <script type="text/javascript" src="${pageContext.request.contextPath}/struts/jwa/js/jquery-1.7.1.min.js"></script> </head> <body> <s:form id="myform" theme="jwa" validate="true" actionErrorId="tip" namespace="/admin" action="dologin" method="post" forward="${pageContext.request.contextPath}/admin/index"> <div id="main"> <div id="login_box"> <ul> <li>用户名:<s:textfield name="username"/></li> <li>密 码:<s:textfield name="password"/></li> <li style="padding-left:48px;"> <s:submit value=" 登录 " cssClass="btn"/> <s:reset value=" 清除 " cssClass="btn"/> </li> <li style="padding-left:48px;"><a href="#"><img src="${pageContext.request.contextPath}/struts/jwa/images/top_qq_login1.gif" border="0" style="vertical-align:middle;"/></a></li> </ul> <div id="tip" style="color:#ffffff;line-height:20px;padding-top:20px;"/> </div> </div> </s:form> </body> </html>
5.com.wogu.jwa.actions.LoginAction
package com.wogu.jwa.actions; import com.wogu.jwa.AjaxAction; import com.opensymphony.xwork2.ActionContext; public class LoginAction extends AjaxAction { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute() { if(username.equals("test") && password.equals("123456")) { ActionContext.getContext().getSession().put("userid", "1"); } else { addActionError(getText("loginAction.user_or_password.error")); } return AJAX; } }