数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证,服务器端数据验证主要特点:
·数据提交后在服务器端验证
·防止绕过客户端验证提交的非法数据
·可以在服务器端处理数据前保证数据的合法性
Struts2中有两种实现服务器端验证的方式。采用手工编写代码实现、基于XML配置方式实现。本文主要介绍基于XML配置方式实现。
在实际开发中,很多验证是相同的,对于这些许重复实现的验证,完全可以统一实现,struts2的验证框架就实现了这一功能。使用验证框架时,所有的验证规则是写在配置文件中,便于开发与维护,所以这里详细介绍一下验证框架。
1、jsp代码编写
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 加载struts2标签库 --> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="<%=basePath%>"> <s:head/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册</title> </head> <body> <form action="register" method="post"> <table> <tr> <td>邮箱:</td> <td><input type="text" name="email"/></td> <!-- 使用<s:fielderror/>标签输入相应的字段错误信息 --> <td><s:fielderror > <s:param>email</s:param> </s:fielderror></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> <td><s:fielderror> <s:param>password</s:param> </s:fielderror> </tr> <tr> <td>重复密码:</td><td> <input type="password" name="repassword"/></td> <td><s:fielderror> <s:param>repassword</s:param> </s:fielderror></td> </tr> <tr> <td>电话:</td> <td><input type="text" name="phone"/></td> <td><s:fielderror> <s:param>phone</s:param> </s:fielderror></td> </tr> <tr> <td><input type="submit" value="提交"/></td> <td></td> <td></td> </tr> </table> </form> </body> </html>
2、编写Action类和struts.xml配置文件
package struts.org; import com.opensymphony.xwork2.ActionSupport; public class RegisterAction extends ActionSupport{ //需要校验的字段必需在类中提供相应的字段和相应的get,set方法 private String email; private String password; private String repassword; private String phone; public String execute() throws Exception { System.err.println(111); return SUCCESS; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRepassword() { return repassword; } public void setRepassword(String repassword) { this.repassword = repassword; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.encoding" value="UTF-8" /> <constant name="struts.devMode" value="true"></constant> <!-- <constant name="struts.ui.theme" value="simple"></constant> --> <package name="/" extends="struts-default"> <action name="register" class="struts.org.RegisterAction"> <result name="success">success.jsp</result> <!-- 校验失败后,struts2会把页面转到名为"input"的页面中 --> <result name="input">register.jsp</result> </action> </package> </struts>
3、编写
validation配置文件
配置文件的命名必须为Xxx-yyy-validation.xml,Xxx为对应的action类名,yyy为配置文件中action元素的name属性值,这个文件只要与对应action类放在同一目录下就会被自动识别,这里命名为RegisterAction-register-validation.xml。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators> <!-- name值为需要被校验的字段,这里对email字段进行校验 --> <field name="email"> <!-- type值为校验器名,requiredstring:非空字符串校验器 --> <field-validator type="requiredstring" short-circuit="true"> <message>${getText("email.not.empty")}</message> </field-validator> <!-- 一个字段可以配置多个校验器,email:校验邮箱格式 --> <field-validator type="email"> <message>${getText("email.form.error")}</message> </field-validator> </field> <field name="password"> <field-validator type="requiredstring" short-circuit="true"> <message>${getText("pass.not.empty")}</message> </field-validator> <!-- stringlength:字符串长度校验 --> <field-validator type="stringlength"> <!-- 为校验器指定参数实现不同的校验规则,minlength:最少长度 --> <param name="minLength">6</param> <message>${getText("pass.min.lenght")}</message> </field-validator> </field> <!-- 校验两次密码是否一致,使用 fieldexpression 校验器。expression参数指定判断用的表达式--> <field name="repassword"> <field-validator type="fieldexpression"> <!-- 表达式要写在 <![CDATA[]]> 内 --> <param name="expression"><![CDATA[repassword==password]]></param> <message>${getText("repass.not.same")}</message> </field-validator> </field> <!-- 校验电话格式,使用regex正则表达示校验,regexExpression参数指定正则表达式 --> <field name="phone"> <field-validator type="regex"> <!-- 注意!2.3.15后的版本使用 regexExpression 参数 2.3.15之前的版本为expression<span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;"> <span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;">--> <param name="regexExpression"><![CDATA[/d{11}]]></param> <message>${getText("tel.form.error")}</message> </field-validator> </field> </validators>
实现效果:
另外可以使用Dojo插件实现类似于Ajax提交校验的效果
1、首先引入struts2-dojo-plugin-2.3.15.3.jar包
2、修改jsp页面(此处我使用的是另一个新的jsp)
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 加载struts2标签库 --> <%@ taglib uri="/struts-tags" prefix="s"%> <%@ taglib prefix="sx" uri="/struts-dojo-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="<%=basePath%>"> <sx:head/> <s:head/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册</title> </head> <body> <s:form action="register" method="post" validate="false"> <table> <tr> <td>邮箱</td> <td><s:textfield name="email"></s:textfield></td> <td><s:fielderror fieldName="email" cssStyle="color:blue"></s:fielderror> </td> </tr> <tr> <td>手机</td> <td> <s:textfield name="phone"></s:textfield> </td> <td> <s:fielderror fieldName="phone"></s:fielderror> </td> </tr> <tr> <td colspan="3"> <sx:submit validate="true"/> </td> </tr> </table> </s:form> </body> </html>
重要的是添加<sx:head/>和<sx:submit validate=”true”/>部分
实现效果:
struts客户端校验很简单,在要提交的表单<s:form>上加上validate=”true”属性即可实现。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 加载struts2标签库 --> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="<%=basePath%>"> <s:head/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册</title> </head> <body> <s:form action="register" method="post" validate="true"> <s:textfield label="邮箱" name="email"></s:textfield> <s:textfield label="电话" name="phone"></s:textfield> <s:submit ></s:submit> </s:form> </body> </html>
不过需要注意两点:
1、不能配置<constant name=”struts.ui.theme” value=”simple”></constant>;
2、form标签必须使用struts的标签,即<s:form></s:form>和<s:textfield></s:textfield>等;
3、不能直接访问jsp页面,否则会出现如下错误,需要经过action进入jsp。
如果不想使用通过action进入jsp的方法,那么还有另一个解决办法:
<s:form action="register.action" method="post" validate="true">
即在action属性值后面加.action
实现效果:
资源下载
struts2.3.15.3.all包下载包含了struts2-dojo-plugin-2.3.15.3.jar包
参考资料:
struts2 form标签加上validate=”true”就出错的解决办法
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11186.html