基本验证(对action的所有方法进行校验)
该方法与setUsername()方法和login()方法的执行顺序是
<resultname="imput">/validate/login.jsp</result>
什么时候表示验证没有通过?
* 验证通过:1、集合存在,但集合中的内容为空;2、集合不存在
* 验证不通过:集合存在,并且集合中的内容不为空
如何往集合中存放错误信息:this.addFieldError("username","用户名错误");
* 参数1:key(用户字段名,Action中的属性名),fieldName="username"
* 参数2:错误信息,errorMessage="用户名错误"
public synchronized void addFieldError(String fieldName, String errorMessage) {
final Map<String,List<String>> errors = internalGetFieldErrors(); //Map集合
List<String>thisFieldErrors = errors.get(fieldName); //list集合
if(thisFieldErrors == null) { //list集合为空
thisFieldErrors = new ArrayList<String>(); //创建一个新的list集合
errors.put(fieldName, thisFieldErrors); //放置list集合到Map集合中
}
thisFieldErrors.add(errorMessage); //在list集合中放置错误信息
}
显示错误Jsp页面:
使用<s:fielderror/>显示错误消息
注:使用<s:fielderror/>标签即可将错误提示信息输出到页面中。
基本验证(对action的指定方法进行校验)
底层代码(ValidationInterceptor拦截器)
输入校验的流程
1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。
3。系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。
4。调用action中的validate()方法。
5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
总结
struts2手动验证:
* 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法
* 要继承ActionSupport类或者实现Validateable接口
* 重写Validateable接口的validate()方法
* 前提是:要保证setUsername()、validate()、login()方法要按照这个先后顺序执行
* 如果登录失败,如何处理:
* this.addFieldError( key, value);
* key:错误提示字段
* value:错误提示信息
* 什么时候才是验证通过?
* 验证通过:1、map集合不存在;2、map集合存在并为空
* 验证不通过:map集合存在并且不为空
* 分析需求:
* 用户名不能为null ,""
* 密码不能为null, "" ,并且密码的长度6-12之间
* 针对所有业务方法进行验证还是针对某个指定业务方法进行验证?
* 重写的validate()方法,针对所有业务方法进行验证
* 重写的validate()方法加上要验证的指定的业务方法名(业务方法名的首字母大写),实现针对某个指定的业务方法进行验证
* 为什么要这样进行拼接?因为struts2框架底层拼接,如果不这样写,底层就找不到对应方法名