接上一篇问到的下面红色字体部分↓↓↓
@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级别错误消息,而不再是字段级别的错误消息。