坠落凡间的struts2(4)---数据的校验

来源:互联网 发布:日本大学 知乎 编辑:程序博客网 时间:2024/04/27 14:16

数据校验的意义

WEB数据收集的复杂性
客户数据输入的误操作
其他恶意攻击

struts2数据校验的方法

客户端校验和服务端校验。

    客户端校验是指,在HTML画面上自动生成JavaScript校验代码,在用户提交到服务器之前在客户端浏览器中进行校验。默认位客户端校验。

    服务端校验是指,在数据提交到服务器上之后,在Action处理之前,对客户但提交的数据进行校验。

struts2校验分为:
Java Annotation配置
XML配置文件配置
ActionSupport实现了Validatable接口,这个接口中定义了一个validate方法,通过重写validate方法可以完成更详细的校验

validate方法验证:

package org.senssic.action;import com.opensymphony.xwork2.ActionSupport;public class ValidationC extends ActionSupport {private static final long serialVersionUID = 1L;private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String execute() {return SUCCESS;}@Overridepublic void validate() {if ("".equals(name.trim()) || name == null) {addFieldError("name", "姓名输入错误!");}if (age <= 0 || age > 100) {addFieldError("age", "年龄输入错误!");}}}
jsp如果要显示错误信息需要添加struts的标签<filederror/>:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>  <s:fielderror></s:fielderror>   <s:form action="ValidationC" >      姓名:<s:textfield name="name"></s:textfield>      年龄:<s:textfield name="age"></s:textfield>     <s:submit>提交</s:submit>   </s:form></body></html>

validate多业务action方法的验证:

如果业务验证方法不止一个则可以使用validateXXX(){}来验证,在struts.xml配置方法调用
<action name="ValidationC" class="org.senssic.action.ValidationC" method="test">           <result name="input">/page/login.jsp</result>              <result>/page/welcome.jsp</result>           </action>

package org.senssic.action;import com.opensymphony.xwork2.ActionSupport;public class ValidationC extends ActionSupport {private static final long serialVersionUID = 1L;private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String execute() {return SUCCESS;}@Overridepublic void validate() {if ("".equals(name.trim()) || name == null) {addFieldError("name", "姓名输入错误!");}if (age <= 0 || age > 100) {addFieldError("age", "年龄输入错误!");}System.out.println("validate方法验证了");}public String test() {System.out.println("test的业务");return SUCCESS;}public void validateTest() {System.out.println("validateXXX方法验证了,是test业务的验证。");}}


执行顺序为:


运行结果:

validateXXX方法验证了,是test业务的验证。
validate方法验证了
test的业务

Java 通过Annotation校验:

import com.opensymphony.xwork2.validator.annotations包提供了一些必要的Annotation用来配置校验信息。
这些内容包括:
枚举类型
ValidatorType     
Field    校验字段
Simple   校验其他
Annotation(标注)类型
Validation
    用来标记一个类需要被校验
ConversionErrorFieldValidator
    字段转换出错
DateRangeFieldValidator
    日期范围校验
DoubleRangeFieldValidator
    Double类型范围校验
EmailValidator
    Email地址校验
ExpressionValidator
    使用一个OGNL表达式的校验,功能非常强大
FieldExpressionValidator
    针对一个字段的使用OGNL表达式的校验
IntRangeFieldValidator
    Int类型范围校验
RegexFieldValidator
    正则表达式校验
RequiredFieldValidator
    必填字段校验
RequiredStringValidator
    必填String校验,
StringLengthFieldValidator
    字符串长度校验
UrlValidator
    URL校验
Validations
    可以组合上述的各种校验类型以满足更多的需求。
VisitorFieldValidator
    可以将Action中的对象的属性的校验方法定位到已经定义的对象原有的校验方法
CustomValidator
ValidationParameter
        两个类一起完成自定义的校验
eg:
package org.senssic.action;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator;import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;import com.opensymphony.xwork2.validator.annotations.Validations;import com.opensymphony.xwork2.validator.annotations.ValidatorType;@Validationspublic class ValidationA extends ActionSupport {private String name;private int age;public int getAge() {return age;}@RequiredFieldValidator(shortCircuit = true, type = ValidatorType.FIELD, message = "年龄必须填写")@IntRangeFieldValidator(min = "1", max = "100", type = ValidatorType.FIELD, shortCircuit = true, message = "年龄必须在0~100之间")public void setAge(int age) {this.age = age;}@Overridepublic String execute() {return SUCCESS;}public String getName() {return name;}@RequiredFieldValidator(shortCircuit = true, type = ValidatorType.FIELD, message = "姓名为必须填写项")public void setName(String name) {this.name = name;}}

java通过xml校验:

采用字段校验:

acttion代码:

package org.senssic.action;import com.opensymphony.xwork2.ActionSupport;public class XmlValidate extends ActionSupport {private static final long serialVersionUID = 1L;private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String execute() {return SUCCESS;}}

xml校验代码(xml位于同包下且命名为:actionname-validation.xml,对某个action的输入校验):

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC  "-//Apache Struts//XWork Validator 1.0.3//EN"  "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">  <validators>   <field name="name">     <field-validator type="requiredstring">        <message>name为必须填写项</message>     </field-validator>   </field>   <field name="age">   <field-validator type="required">      <message>年龄为必填项</message>   </field-validator>      <field-validator type="int">        <param name="min">1</param>        <param name="max">100</param>        <message>年龄必须在1~100之间</message>      </field-validator>   </field>  </validators>

其中字段<field-validator type=""/>中的type在对应的xwork-core.jar的com.opensymphony.xwork2.validator.validators包下的default.xml

而对应的属性名字为相应类中的属性值(例如age的校验)


采用非字段校验:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//Apache Struts//XWork Validator 1.0.3//EN""http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"><validators><validator type="requiredstring"><param name="fieldName">name</param><message>name为必须填写项</message></validator><validator type="int"><param name="fieldName">age</param><param name="min">1</param><param name="max">100</param><message>年龄必须在1~100之间</message></validator><validator type="required"><param name="fieldName">age</param><message>年龄不能为空</message></validator></validators>

struts2多业务方法xml校验:

1、Action级别校验命名格式:
ActionClassName-validation.xml

同上
2、Action中某个方法的校验命名格式:
ActionClassName-ActionAliasName-validation.xml

注意:这里的ActionAliasName(action别名)指的是struts.xml中Action name="XX"的xx的名称,而不是method="XX"的名称

 <action name="ValidationC" class="org.senssic.action.ValidationC" method="test">           <result name="input">/page/login.jsp</result>              <result>/page/welcome.jsp</result>           </action>
对这个业务方法验证即为:

ValidationC-ValidationC-validation.xml

短路校验器:

校验的顺序:如果以上2个校验文件都存在,那么2个文件都会被执行;如果2个校验文件中的校验属性相同那么将被执行同校验属性中ActionClassName-ActionAliasName-validation.xml中的校验规则。首先Validator,其次Field Validator,但是在Validator或者Field Validator执行的过程中,顺序按照xml文件中的定义。短路的意思是,一旦一个短路的校验出错,其余后续的校验将不再进行。

内建校验器:

required (必填校验器,要求field的值不能为null)

requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)
url(网址校验器,要求如果field的值非空,则必须是合法的url地址)
date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)
expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)



原创粉丝点击