您的位置:首页 > 编程语言

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

2013-05-10 22:16 211 查看
接上一篇问到的下面红色字体部分↓↓↓

@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级别错误消息,而不再是字段级别的错误消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐