Struts2的数据校验属于服务器端校验,Struts2 支持校验方式 :
- 手动校验(代码校验) :在服务器端通过编写java代码,完成数据校验
- 自动校验(配置校验) :XML配置校验(主流) 和 注解配置校验
1、手动校验
1)Struts2的手动校验步骤:
- 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法;
- 要继承ActionSupport类或者实现Validateable接口;
- 重写Validateable接口的validate()方法,需要通过addFieldError(fieldName, errorMessage)方法来添加校验提示,fieldName为错误提示字段,errorMessage为错误提示信息,在jsp页面需要通过Struts2的<s:fielderror/>标签来提示添加的信息,该标签有个name属性,值为addFieldError方法中的fieldName,当添加了校验信息,Struts2框架会返回到name值为"input"的<result/>设置的视图中;
2)下面我们通过一个例子来演示手动校验功能:
Action类:
1 public class ValidateAction extends ActionSupport { 2 private String name; 3 4 @Override 5 public void validate() { 6 if (name == null || "".equals(name)) { 7 this.addFieldError("name", "姓名不能为空"); 8 } 9 }10 11 @Override12 public String execute() throws Exception {13 return SUCCESS;14 }15 16 public String getName() {17 return name;18 }19 20 public void setName(String name) {21 this.name = name;22 }23 }
struts.xml配置文件:
1 <struts> 2 <constant name="struts.devMode" value="true" /> 3 4 <package name="default" namespace="/" extends="struts-default"> 5 <action name="validateAction" class="com.sunny.action.ValidateAction"> 6 <result>/success.jsp</result> 7 <!--Struts2的校验信息会返回到name值为input的视图中--> 8 <result name="input">/input.jsp</result> 9 </action>10 </package>11 12 </struts>
jsp页面:
1 <body>2 <s:fielderror name="name"/>3 <form action="${pageContext.servletContext.contextPath}/validateAction.action">4 姓名:<input type="text" name="name"><br>5 <input type="submit" value="提交">6 </form>7 </body>
当第一次加载jsp页面时不会显示校验信息:
当在表单中不添加任何信息直接点击提交按钮时会显示设置的校验信息:
2、自动校验(XML配置文件方式)
1)XML配置文件方式数据校验步骤:
- 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法;
- 创建一个XML格式验证文件,文件的命名方式:ActionClassName-validation.xml,ActionClassName指的是Action类的名称,该文件需要和Action类放在同一目录下;
- XML格式验证文件的内容格式:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE validators PUBLIC 3 "-//Apache Struts//XWork Validator 1.0.3//EN" 4 "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> 5 <!--validators根元素--> 6 <validators> 7 <!--field:指定action中要校验的属性 8 name:指定将被验证的表单字段的名字 9 -->10 <field name="name">11 <!--field-validator:指定验证规则12 type:指定验证规则的名称13 -->14 <field-validator type="requiredstring">15 <!--param:向验证器传递的参数,name值为校验器的参数名 -->16 <param name="trim">true</param>17 <!--message:验证失败时,提示的错误信息18 里面的文本:错误提示信息,<![CDATA[]]>:保证按原文输出19 -->20 <message>用户名不能为空</message>21 </field-validator>22 </field>23 </validators>
Struts2的内置校验器规则在路径:xwork-core-x.x.x.jar中com.opensymphony.xwork2.validator.validators包的default.xml文件:
1 <validators> 2 <!--validator:声明验证规则 3 name:验证规则的名称 4 class:验证规则对应的类的完整路径 5 --> 6 <!--required:必填校验器,要求被校验的属性值不能为null--> 7 <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> 8 <!--requiredstring:必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格 9 参数trim:该参数为可选参数,用于指定是否在校验之前对字符串进行整理。10 -->11 <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>12 <!--int:整数校验器,要求field的整数值必须在指定范围内13 参数min:指定字段值的最小值,该参数为可选14 参数max:指定字段值的最大值,该参数为可选15 -->16 <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>17 <!--long:整数校验器,要求field的整数值必须在指定范围内18 参数min:指定字段值的最小值,该参数为可选19 参数max:指定字段值的最大值,该参数为可选20 -->21 <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>22 <!--short:整数校验器,要求field的整数值必须在指定范围内23 参数min:指定字段值的最小值,该参数为可选24 参数max:指定字段值的最大值,该参数为可选 25 -->26 <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>27 <!--double:双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内28 参数minInclusive:指定字段数值所接受的最小值,该参数为可选29 参数maxInclusive:指定字段数值所接受的最大值,该参数为可选30 参数minExclusive:指定字段数值被排除的最小值,该参数为可选31 参数maxExclusive:指定字段数值被排除的最大值,该参数为可选32 -->33 <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>34 <!--date:日期校验器,要求field的日期值必须在指定范围内35 参数min:指定字段日期值的最小值,该参数为可选36 参数max:指定字段日期值的最大值,该参数为可选37 -->38 <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>39 <!--expression:表达式校验器,它是一个非字段校验器,当参数expression计算的值为true时,校验通过,否则返回提示.40 参数expression:该参数为一个逻辑表达式,该参数使用OGNL表达式,并基于值栈计算,返回一个Boolean类型值。 41 -->42 <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>43 <!--fieldexpression:字段表达式校验器,当参数expression计算的值为true时,校验通过,否则返回提示.44 参数expression:该参数为一个逻辑表达式,该参数使用OGNL表达式,并基于值栈计算,返回一个Boolean类型值.45 -->46 <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>47 <!--email:邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址-->48 <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>49 <!--url:网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址-->50 <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>51 <!--visitor复合类型校验器,该校验器用来校验Action中定义的复合类型属性,支持简单的复合类型或数组类型或集合类型.52 参数context:校验器引用的上下文,可以随意取,可选参数53 参数appendPrefix:是否为字段校验信息加前缀(message中设置的值),可选参数54 -->55 <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>56 <!--conversion:类型转换校验器,该校验器检查是否存在转换异常57 参数repopulateField:指定当类型转换失败后返回input页面时,类型转换失败的表单是否保留原来的错误输入,true为保留,false为不保留.58 -->59 <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>60 <!--stringlength:字符串长度校验器,用于检验字段中字符串长度是否在指定的范围61 参数trim:该参数为可选参数,用于指定是否在校验之前对字符串进行整理。62 参数maxLength:用于指定最大字符串长度,该参数为可选63 参数minLength:用于指定最小字符串长度,该参数为可选64 -->65 <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>66 <!--regex:正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式.67 参数expression:指定正则表达式68 参数caseSensitive:指定进行正则表达式匹配时,是否区分大小写,默认值为true,为可选参数.69 -->70 <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>71 <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>72 </validators>
- XML格式验证文件的内容格式:
2)下面我们通过一个例子来演示XML配置文件方式数据校验功能:
Action类:
1 public class ValidateAction extends ActionSupport { 2 private String name; 3 4 @Override 5 public String execute() throws Exception { 6 return SUCCESS; 7 } 8 9 public String getName() {10 return name;11 }12 13 public void setName(String name) {14 this.name = name;15 }16 }
struts2配置文件:
1 <struts> 2 <constant name="struts.devMode" value="true" /> 3 4 <package name="default" namespace="/" extends="struts-default"> 5 <action name="validateAction" class="com.sunny.action.ValidateAction"> 6 <result>/success.jsp</result> 7 <!--Struts2的校验信息会返回到name值为input的视图中--> 8 <result name="input">/input.jsp</result> 9 </action>10 </package>11 12 </struts>
在Action类相同目录下新建XML格式验证文件:ValidateAction-validation.xml:
1 <validators>2 <field name="name">3 <field-validator type="requiredstring">4 <param name="trim">true</param>5 <message>姓名不能为空</message>6 </field-validator>7 </field>8 </validators>
jsp页面:
1 <body>2 <s:fielderror name="name"/>3 <form action="${pageContext.servletContext.contextPath}/validateAction.action">4 姓名:<input type="text" name="name"><br>5 <input type="submit" value="提交">6 </form>7 </body>
当第一次加载jsp页面时不会显示校验信息:
当在表单中不添加任何信息直接点击提交按钮时会显示设置的校验信息:
如果要对指定方法进行验证的话,XML验证文件的命名方式:ActionClassName-ActionName-validation.xml,ActionName对应的是struts.xml文件对应的action标签的name属性的值。
3)visitor验证规则示例
vsitor校验器主要用于校验Action里的复合类型、数组类型或者集合类型,如一个Action里面包含了Person类型的属性,需要验证Person类型的name属性不能为空。
1)新建Person类:
1 public class Person { 2 private String name; 3 4 public String getName() { 5 return name; 6 } 7 8 public void setName(String name) { 9 this.name = name;10 }11 12 }
2)新建Action类:
1 public class ValidateAction extends ActionSupport { 2 private Person person; 3 4 @Override 5 public String execute() throws Exception { 6 return SUCCESS; 7 } 8 9 public Person getPerson() {10 return person;11 }12 13 public void setPerson(Person person) {14 this.person = person;15 }16 17 }
3)新建visitor验证规则文件,该文件需要和Action类在同一目录下,命名规则和上面讲的一样ActionClassName-validation.xml,这里为ValidateAction-validation.xml:
1 <validators> 2 <field name="person"> 3 <field-validator type="visitor"> 4 <param name="context">test</param> 5 <param name="appendPrefix">true</param> 6 <!--指定校验失败的提示信息前缀--> 7 <message>错误:</message> 8 </field-validator> 9 </field>10 </validators>
4)新建Person类的name属性验证规则文件,该文件需要和Person类在同一目录下,命名规则为ClassName-context值-validation.xml,ClassName为要验证的类,context值为<param name="context">test</param>中的内容,-validation为固定内容,这里的文件名为Person-test-validation.xml:
1 <validators>2 <field name="name">3 <field-validator type="requiredstring">4 <param name="trim">true</param>5 <message>姓名不能为空</message>6 </field-validator>7 </field>8 </validators>
5)新建jsp页面:
1 <body>2 <s:fielderror name="name"/>3 <form action="${pageContext.servletContext.contextPath}/validateAction.action">4 姓名:<input type="text" name="person.name"><br>5 <input type="submit" value="提交">6 </form>7 </body>
当第一次加载jsp页面时不会显示校验信息:
当在表单中不添加任何信息直接点击提交按钮时会显示设置的校验信息: