数据类型转化和数据校验的原理和流程
struts2数据校验的基本原理
- 当用户发送请求经过一系列的过滤器之后,会由动态代理生成相应的拦截器
- 由拦截器进行数据的校验,如果数据不合法将产生错误信息,并且返回一个逻辑结果INPUT
- 我们可以将错误信息自定义,然后通过struts2标签输出到页面
- 我们也可以自定义数据校验器和转换器
操作流程
- 自定义校验器
1.创建一个自定义校验器类继承FieldValidatorSupport类
2.重写validate()方法,方法体内部进行数据校验,如果不符合条件在action中放入错误字段名,会自动产生错误信息,在页面上就可以输出此字段的错误信息,同样也可以自定义错误信息
3.在src根目录下创建一个validators.xml文件,里面的validator的class属性指向这个校验器 - 自定义转换器
1.创建一个自定义转换器继承StrutsTypeConverter类
2.重写convertFromString()和convertFromString()方法,在前者的方法体中做数据转换,直接返回一个我们想要转换的类型即可
3.可以在src下创建一个xwork-conversion.properties文件作为全局的转换器配置,用需要目标转换类(包名.类名)指向该转换器;或者在同一个包级别中配置一个文件,名字叫XxxAction-conversion.properties,里面用目标action名指向这个转换器 - 自定义校验xml文件
在同一个包级别下创建一个XxxAction-目标action名-validation.xml文件,在该文件中配置需要校验的字段名的配置(举例说明,member为操作对象)
<validators>
<field name="member.loginId">
<field-validator type="requiredstring">
<message>会员账号不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>账号的字符数必须在${minLength}到${maxLength}位之间</message>
</field-validator>
<field-validator type="regex">
<param name="regex"><![CDATA[\w*]]></param>
<message>账号中的字符只能出现“字母”、“数字”或“下划线”!</message>
</field-validator>
</field>
<field name="member.loginPsw">
<field-validator type="requiredstring">
<message>会员密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">8</param>
<param name="maxLength">20</param>
<message>账号的字符数必须在${minLength}到${maxLength}位之间</message>
</field-validator>
</field>
<field name="loginPsw2">
<field-validator type="requiredstring">
<message>确认密码不能为空!</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[member.loginPsw == loginPsw2]]></param>
<message>确认密码错误:两次密码不一致!</message>
</field-validator>
</field>
<field name="member.height">
<field-validator type="required">
<message>会员身高不能为空!</message>
</field-validator>
<field-validator type="double">
<param name="minInclusive">1.0</param>
<param name="maxInclusive">2.5</param>
<message>会员身高必须在${minInclusive}到${maxInclusive}米之间</message>
</field-validator>
</field>
<field name="member.birthdate">
<field-validator type="date">
<param name="min">1980-1-1</param>
<param name="max">2000-12-31</param>
<message>会员出生日期必须在${min}到${max}之间</message>
</field-validator>
</field>
<field name="member.zipcode">
<field-validator type="zip">
<message>会员的邮编号码格式错误,必须是6位数字</message>
</field-validator>
</field>
</validators>
自定义拦截器
1. 创建一个自定义拦截器类实现接口interceptor或继承抽象类AbstractInterceptor
2. 重写intercept(ActionInvocation actionInvocation)方法
3. 利用传递的参数actionInvocation获得servletAPI进行处理扽登陆访问权限验证等需求
4. 在xml文件中进行配置,声明自定义的拦截器,然后需要注册启用
5. 可以将其设置成默认的拦截器,这样就是默认在该包命名空间下的访问都会经过这个拦截器
6. 在配置默认的拦截器时注意:
a. 要改变之前使用的默认的拦截器栈,重新定义一个拦截器栈,将自定义的和struts2原始默认的拦截器一起配进去
b. 设置好后仍然需要注册启用
c. 在要使用struts2原始的默认拦截器设置参数时就用自定义拦截器栈名 . dafualtStack声明
7. 在配置自定义拦截器的时候,可以配置不过滤的目标方法,交给struts2来做这个过滤工作,我们只需要做具体的逻辑判断即可(如实现免登陆的功能)