Struts2【表单数据验证篇】3
服务端验证
(一) 编程式验证
编程式验证分为对所有方法验证和对单个方法验证,下面我们来一一叙述。
(1.1) 对所有方法进行验证
(1) 创建一个类继承ActionSupport
原因: 因为ActionSupport类实现了Validateable接口
(2) 在创建的Action中覆写valudate()方法
public class RegisterAction extends ActionSupport implements ModelDriven<User>{ private User user=new User(); @Override public User getModel() { // TODO Auto-generated method stub return user; } @Override public void validate(){ //验证不成功的情况,向一个Map中存放信息,如果Map为空,说明验证通过,否则就是验证失败 if("".equals(user.getUsername().trim())){ //说明没有输入用户,调用该方法往Map里增加信息 addFieldError("user.username", "用户名不能为空"); } } ..... }
在这里,addFieldError方法就是往Map里放值,那么关键点就在于这个key是什么?
我们分为两种情况
情况一:动作类就是模型类
此时key为"模型类的属性",如"username"
情况二:动作类,模型类分开
此时key为"模型类.模型类的属性",如”user.username“
(3) 在strus.xml配置验证失败后,跳转到的结果集
Struts在进行数据效验失败以后,会返回"Action.INPUT"字符串
建议使用struts2标签,如果没有显示,使用<s:fielderror></s:fielderror>.
(1.2) 对指定方法进行验证
方式一:使用@SkipValition注解
也就是说在Action中,我们在不需要验证的操作方法上使用该注解
public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User user; public void validate(){ System.out.println("执行了验证操作"); } @SkipValidation public String login(){ System.out.println("执行了登录操作<*>"); return SUCCESS; } public String add(){ System.out.println("执行了添加操作<*>"); return SUCCESS; }
结果:在依次调用了动作以后,发现在执行login方法以前,不会在执行validate方法。
方式二:在validate方法+需要验证的方法
public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User user; public void validateAdd(){ System.out.println("执行了验证操作"); } public String login(){ System.out.println("执行了登录操作<*>"); return SUCCESS; } public String add(){ System.out.println("执行了添加操作<*>"); return SUCCESS; }
结果:这样子,就只会在调用add动作的时候,执行验证方法
【总结】
缺点:验证规则写到了代码中,硬编码
优点:可以控制的更加精细。(实际开发中用得比较少)
声明验证恰恰于其相反,缺点是没有编程式验证精细,优点就是避免了硬编码
(二) 声明式验证
(2.1)对所有方法进行验证
在Action包中,创建一个名称为:Action类名-validation.xml的文件
(1)创建配置文件
规则:
a.配置文件位置:和需要拦截的Action在一个包中
b.配置文件名字:Action-validation.xml(Action的类名)
c.配置文件中field标签的name与表单中的name对应,
<?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> <!-- 指定要验证的字段 --> <field name="username"> <!-- 指定验证规则 --> <field-validator type="required"><!-- required:验证字段是不是null --> <message>必须要输入用户名</message> </field-validator> </field> </validators>
( 2 ) 配置结果集
在struts.xml中配置一个result结果集,name为input的结果集,就是当验证器验证失败以后转向的页面
以上就配置完成了,每当你访问Action的时候,不论调用Action中的什么方法,都会进入验证器验证,验证成功后才会执行Action方法,否则返回一个"input",并转发到相应的页面
(2.2)对指定方法进行验证
炒鸡简单,只需要改变配置文件名字,内容不变。改为:
Action名字+Action动作名+"-validation".xml 如:LoginAction-login-validation.xml
【题外话-拦截器】
验证功能是由Struts2的validation拦截器处理的
回显错误信息是由workflow拦截器处理的
(2.3)声明式验证使用的验证器
(1) 寻找 Struts2 配置这些拦截器的配置文件
jar包:xwork-core-2.3.24.1.jar
包:com.opensymphony.xwork2.validator.validators
找到了default.xml配置文件,
(2) 查看配置文件的书写规则
jar包:xwork-core-2.3.24.1.jar
找到 xwork-validator-1.0.3.dtd 配置文件
( 3 ) 写配置文件
在配置文件中使用验证器有两种方式,
方式一:
<validators> <field name="username"> //要验证的字段 <field-valitor type="regex"> <param> <![CDATA[[a-zA-Z]{6,8}]]> </param> <message> 字符串由6-8字符串组成 </message> </field-valitor> </field> </validators>
方式二:
<validators> <validator type="regex"> //要使用的验证器 <param name="filedName">username</param> <param> <![CDATA[[a-zA-z]{6,8}]]> </param> <message> 字符串由6-8位字符串组成 <message> </validator> </validators>
(三) 自定义验证
(1)查看下Strust2定义的拦截器,通过struts-default.xml查找随便一个拦截器的源码
validate() //进行的验证方法。
object //就是我们调用的Action
fieldName //配置文件中,配置的要监听的属性
getFieldValue(fieldName,object) //从Action中寻找监听的属性
要想阅读这类源码,我们需要从上往下看,因为一个类可能有多个子类,但最后的最后,父类(父接口)只有一个
fieldName: //配置文件要监听的属性
type: //监听的类型
由名字可知,Validate接口就是我们要找到的最终的接口,ValidatorSupport就是对接口的实现,FieldValidatorSupprort是其的子类,Struts2提供的一些验证器就是该类的子类,所以我们可以继承该类来实现我们自己的验证器
(二)创建验证类,实现FieldValidatorSupport
public class StrongPasswordValidator extends FieldValidatorSupport { private boolean trim = true; @Override public void validate(Object obj) throws ValidationException { // obj当前执行的动作类 String fieldName = getFieldName(); // 配置文件中,写的要验证的字段名 Object value = this.getFieldValue(fieldName, obj); // 从当前动作类找到你要验证字段名的值 if (!(value instanceof String)) { addFieldError(fieldName, obj); } else { String s = (String) value; if (trim) { s = s.trim(); } if (!isPasswordStrong(s)) { addFieldError(fieldName, obj); } } ..... }
(三) 创建配置文件
规则:在根目录下创建XML配置文件,命名必须为"validators.xml"。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <validators> <validator name="strongpassword" class="StrongPasswordValidator"/> </validators>
(四) 在Action包中的配置文件中使用 我们创建的验证器
<validators> <field name="username"> <field-validator type="strongpassword"> <message>强度太弱了</message> </field-validator> </field> </validators>