编程式验证中的Action级别错误信息、字段级别错误信息详解

 
接上一篇问到的 下面 红色字体部分↓↓↓
 
@Override
public void validate() {
  if (this.user.getUname().length()==0) {
    this.addFieldError("uname", "用户名不能为空aaa!");
    this.addFieldError("uname", "用户名不能为空bbb!");  
     
  }
  super.validate();
}
答案是:当用户名为空时,这两个都会显示在jsp页面
 
分析:
struts2 api中是这样写的
Action level messages are kept in a Collection. 
Field level error messages are kept in a Map from String field name to a List of field error msgs.
译:
Action级别信息保存在一个集合,字段级别的错误信息都保存在一个从字符串字段名称到List字段错误信息的Map中。
 
其实把Action级别错误信息保存到集合与字段级别错误信息保存到map差不多,具体区别见本页最后。
 
因此我们就以把field级别错误信息保存到map为例:
把field错误信息保存到Map中步骤:
1.首先它会检查map中有没有以字段名命名的key;
2.如果没有:map.put("",new List());还会把错误信息放到list对象中;
3.已经有了,就通过这个key得到所应对应的集合对象--list对象,map.get("uname"),然后再把错误信息放进去;
注:有多少field,它就会放多少
 
具体调用到的代码:

//用户验证的Action会调用ActionSupport中的addFieldError(...)方法
public void addFieldError(String fieldName, String errorMessage) {
        validationAware. addFieldError(fieldName, errorMessage);
     //ActionSupport在此调用ValidationAwareSupport类中的addFieldError(...)方法
    }
 
 
 //ValidationAwareSupport类
 public synchronized void   addFieldError(String fieldName, String errorMessage) {
        final Map> errors =   internalGetFieldErrors();
        List thisFieldErrors = errors.get(fieldName);
 
        if (thisFieldErrors == null) {
            thisFieldErrors = new ArrayList();
            errors.put(fieldName, thisFieldErrors);
        }
 
        thisFieldErrors.add(errorMessage);
    }

private Map<String, List<String>> internalGetFieldErrors() {
        if (fieldErrors == null) {
            fieldErrors = new LinkedHashMap<String, List<String>>();
        }

        return fieldErrors;
    }

 
Action级别与字段级别错误信息的区别?
:区别在于这两个级别错误信息发生时间 不同
      <1>字段级别错误信息发生时间:
params拦截器拦下数据之后,马上进行验证,验证的时候数据还有赋值给这个属性。
这时也许有人会 :既然这个时候数据还没有赋值给这个属性,那么它的的值是怎么来的?
答案 是:缓存机制把值赋给这个属性。
      <2>Action级别错误信息发生时间:
是在执行execute方法之前。
注:非字段验证器在验证失败时会产生一条Action级别错误消息,而不再是字段级别的错误消息。
 
 
 

转载于:https://www.cnblogs.com/gxpblogs/archive/2013/05/10/3072175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值