1.struts2数据验证
验证的方式:
- 客服端校验:使用js结合正则表达式来校验,不和服务器打交道,开发简单,安全性差
- 服务器端校验:请求web服务器,开发量比较大,但是安全性好,如果需要和数据库打交道的就必须要使用服务器端校验。
- 实际开发中,客户端校验比较多,最好的是客户端和服务端都校验。
- struts2的校验属于服务器端校验。
(1)struts2编程式校验
编程式校验:重写父类的validate方法,在这个方法中对每一个字段来做校验,但是校验的前提是提交过来的参数是能相互转换的,如果转换不了的话会由param,modelDriven拦截器来负责。如果参数不符合正则,我们可以添加提示信息。

/**
* 在封装参数之前做验证,如果验证不通过,跳转到表单页面
*/
@Override
public void validate() {
if(!person.getName().matches("[a-zA-A]{3,8}")){
// 添加提示信息,第一个参数是字段名表单中的文本域的name,第二个是提示信息
addActionError("name", "姓名只能是大小写字母(3-8位)");
}
}
private void addActionError(String name, String s) {
this.addActionError(name, s);
}
}
2.跳出校验:在编程校验中,validate会对当前的action类中的每一个方法做校验,那么有一些方法是不需要校验的,我们可以通过@SkipValidation来跳过校验。
- 我们在Action中定义一个验证方法,命名规则是validate+【要验证的方法名】,那么这个方法就会被校验,如validateSave,那么save方法会被校验,其余的方法的都不会被校验。
// 跳出校验
@SkipValidation
public String delect() {
System.out.println(person);
return super.SUCCESS;
} public void validateSave() {
if(!person.getName().matches("[a-zA-A]{3,8}")){
// 添加提示信息,第一个参数是字段名表单中的文本域的name,第二个是提示信息
addActionError("name", "姓名只能是大小写字母(3-8位)");
}
} (1)struts2声明式验证 为了解决Action和验证逻辑的高耦合,我们可以使用声明式验证,我们要把验证规则配置在xml中。 规则:在Action的同级包下创建一个xml,名称规范:Action名称validation.xml - 打开xwork-validator-config-1.0.dtd,把头信息copy到我们的xml中


3.系统提供的校验器参数配置如下:



regex的使用:
<?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>
<!--表单中要提交的文本域
name:文本域的name值
-->
<field name="name">
<!--文本域的验证器-->
<field-validator type="requiredstring">
<message>姓名不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="regex">[a-zA-Z]{3,8}</param>
<message>姓名为3-8位的字符</message>
</field-validator>
</field>
<!--第二种验证的配置方式-->
<validator type="regex">
<!--配置验证的字段-->
<param name="fieldName">address</param>
<!--验证的正则-->
<param name="regex">\d{6,8}</param>
<!--提示信息-->
<message>请输入6-8位的文本</message>
</validator>
</validators>

expression的校验:
<validator type="expression">
<param name="fieldName">repwd</param>
<param name="expression">pwd == repwd</param>
<message>两次密码必须一致</message>
</validator>
jsp界面
<tr>
<td>密码</td>
<td><input type="text" name="pwd"></td>
<td><s:fielderror fieldName="pwd"></s:fielderror></td>
</tr>
<tr>
<td>重复密码</td>
<td><input type="text" name="repwd"></td>
<td><s:fielderror fieldName="repwd"></s:fielderror><s:actionerror></s:actionerror></td>
</tr>
int的使用:
<field name="age">
<field-validator type="int">
<param name="min">0</param>
<param name="max">150</param>
<message>年龄必须在${min}到${max}之间</message>
</field-validator>
</field>
<!--jsp界面-->
<tr>
<td>年龄</td>
<td><input type="text" name="age"></td>
<td><s:fielderror fieldName="age"></s:fielderror></td>
</tr>
|