zoukankan      html  css  js  c++  java
  • 编程式验证中的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级别错误消息,而不再是字段级别的错误消息。
     
     
     
  • 相关阅读:
    jsp小测文件上传+servlet+分页 47/32(继续努力!)
    使用分层实现业务处理
    jsp 2018年5月7日11:04:15题库52/34
    jsp题库 (一)小测(25/21)
    Js2云题库,好题就得藏起来
    Jsp前2纠错
    【转】js限制用户上传文件类型
    【转】HTML from enctype 定义和实例
    fmt jstl标签 时间格式化例子
    【转】hibernate中lazy的使用
  • 原文地址:https://www.cnblogs.com/gxpblogs/p/3072175.html
Copyright © 2011-2022 走看看