`

2.2、Struts2数据验证续

 
阅读更多
用struts2标签库来实现Struts2数据输入校验---函数验证的基本原理:
错误消息分为field级和action级,都在ActionSupport类中预定义了,不同的是,
fieldError是通过一个Map来实现,事实上记录了field的名字和错误信息,因此能在页面上对应的field中显示;
而actionError是通过一个Collection实现,没有记录报错的来源,只记录了错误信息。

注意,下面是简要流程:
(1)页面提交到action之后,首先struts会尝试对输入的字符串信息根据Action中定义的属性类型进行类型匹配及转换,如果输入为空,它会将内容置为该类型的缺省值(0、0.0、空字符串等等),对于数据格式不匹配的情况,比如说在age栏里面输入字母等等,struts会自动提示默认的错误,并返回input,这一工作是struts2自动完成的。

(2)然后,验证机制生效,调用validate()函数和XML验证框架中的验证逻辑(《Struts2 数据输入校验(2) —— XML验证 》会提到),检查的同时会因为验证错误调用了addFieldError()和addActionError()。页面提交之前,struts会调用ActionSupport(严格说是ValidationAware接口)的hasErrors()方法,该方法很简单,就是检查fieldError的Map和actionError的Collection是否为空,如果均为空,则调用execute()方法
  • 进行业务逻辑的调度,否则返回error。

  • (3)最后,程序会根据返回信息执行forward操作,struts.xml中则定义了这些返回值所对应的跳转逻辑。

    如果有错误返回,错误信息会在页面上提示
    在Action中所有addFieldError()设置的信息将在对应的field位置显示;
    在Action中所有addActionError()设置的信息将不会显示,除非在页面中定义了s:actionerror控件,那么错误将以ul的格式显示。

    对多验证和跳转逻辑的支持
    对于一些Action如果需要重用,struts也提供了支持。
    上述
  • 处,你也可以指定其它任意的名字,这需要在struts.xml中修改对应action的method属性
  • <action name="XXXAction" class="com.myspace.myname.XXXAction" method="newExcuteName">
          <result>success.jsp</result>
    </action>
    


    同时在XXXAction中我们需要定义一个方法
    public String newExcuteName(){  /*dummy code*/ }

    如果同时还定义了
    public void validateNewExcuteName(){  /* dummy code */ }

    那么在执行validate()之前,程序会先执行validateNewExcuteName()方法
    可以考虑把所有公用的验证逻辑放到validate()方法中
    上述过程完全是靠java反射机制实现的,效率会低一些,所以除非真有必要,否则不用。

    错误提示字符串的本地化
    在validator方法中直接写错误信息固然方便,但不算是一个好习惯,同时也不能支持本地化。下面简单说明本地化的两种方式
    1、全局国际化默认的错误提示,首先在struts.xml中加入常量
    <struts>
    <constant name="struts.custom.i18n.resources" value="message"></constant>
    </struts>

    然后在与struts.xml同级的位置建立message.properties中写入
    xwork.default.invalid.fieldvalue={0} error

    2、针对某个Action的验证错误提示
    在与XXXAction同级目录下建立与该Action同名的属性文件
    XXXAction.properties中写入
    invalid.fieldvalue.字段名=错误信息

    两种验证机制的执行顺序
    先执行validation.xml,后执行Action内部的validate()方法。

    ActionSupport类对ActionError和FieldError的实现细节
    在ActionAware接口中声明的
    ActionError,ActionMessage:  Collection<String>
    FieldError:   Map<String,List<String>>

    ActionSupport组合了一个实现了ValidationAware的ValidationAwareSupport来继承ValidationAware接口:
    ValidationAwareSupport类内部声明了三个私有变量,
    其中
    actionMessage = new ArrayList<String>();
    actionError = new ArrayList<String>();
    fieldErrors = new LinkedHashMap<String, List<String>>();

    FieldErrors需要注意的一点
    我们往FieldErrors中添加错误的时候,需要调用addFieldError(),而不应该调用getFieldErrors().put()函数.
    这两个方法看起来是一样的,其实不然。
    getFieldErrors()在实现的时候返回的是fieldErrors的一个可写副本,修改这个副本不会真正将错误传入fieldErrors中去。addFieldError()才是真正向fieldErrors中添加内容
    分享到:
    评论

    相关推荐

      Struts2 in action中文版

      10.3.2 使用自定义数据验证器 229 10.4 验证框架的高级主题 230 10.4.1 在域对象级别验证 231 10.4.2 使用验证上下文优化验证 233 10.4.3 验证继承 235 10.4.4 验证短路效应 236 10.4.5 使用注解声明验证 237 10.5 ...

      struts2讲义_吴峻申

      5.7 Struts2自定义标签实现图形验证功能 121 第6章 Struts2非JSP视图技术 125 6.1 velocity视图技术使用介绍 125 6.2 freemarker视图技术使用介绍 128 6.3 JasperReports报表视图技术使用介绍 130 第7章 Struts2类型...

      深入浅出Struts2(附源码)

      作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...

      深入浅出Struts 2 .pdf(原书扫描版) part 1

      书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

      低清版 大型门户网站是这样炼成的.pdf

      2.2 struts 2配置精要 54 2.2.1 web.xml中struts 2的配置实现 54 2.2.2 struts 2属性配置文件struts.properties详解 55 2.2.3 struts 2核心配置文件struts.xml详解 57 2.3 struts 2应用开发实务 61 2.3.1 ...

      structs程序设计从入门到精通word文档

      2.2 Struts原理、开发及项目实施 8 2.3使用STRUST控制流 8 2.4讨论STRUTS的优缺点 9 2.5 Struts入门经验 9 2.6用strtus制作登陆页面: 9 第3章Struts 基础学习 9 3.1Struts标记库 9 3.2Struts框架基础篇 9 3.3Struts...

      JAVA WEB典型模块与项目实战大全

      第20章 数据格式转换(struts 2.x+hibernate+dom4j)  20.1 关于xml文件基础知识  20.2 下载dom4j  20.3 数据格式转换功能前期准备  20.4 数据格式转换功能具体开发  20.5 多学两招——其他操作xml文件...

      Eclipse开发入门与项目实践 源代码

      案例5-6 使用Validator验证框架实现注册表单的数据验证 201 5.4.4 Struts标记库 206 案例5-7 采用Struts标记库实现身份验证应用相关页面 207 第6章 Eclipse中Hibernate的开发 211 6.1 Hibernate概述 211 ...

      AnyFo - Struts 2_1爆胎易筋丸.pdf

      5 数据验证...........................................................................................................................14 5.1 validate 方法验证..............................................

      java web技术开发大全(最全最新)

      提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例和4...

      外文翻译 stus MVC

      Struts is an MVC implementation that uses Servlets 2.2 and JSP 1.1 tags, from the J2EE specifications, as part of the implementation. You may never implement a system with Struts, but looking at ...

      Spring in Action(第二版 中文高清版).part2

      16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

      java web开发技术大全

      提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例...

      Spring in Action(第2版)中文版

      16.2协同使用spring和webwork2/struts2 16.3集成spring和tapestry 16.3.1集成spring和tapestry3 16.3.2集成spring和tapestry4 16.4协同使用spring和jsf 16.4.1解析jsf管理的属性 16.4.2解析springbean 16.4.3...

      JSP实习报告完美版

      2.2 物联网技术 3 2.3 不确定数据管理 4 2.4 非PC\Windows下的计算机应用 4 3. 企业参观体会 6 4. 基于JSP的美文欣赏查询系统设计与实现 8 4.1 系统需求分析 8 4.1.1 用例分析 8 4.1.2 数据逻辑模型 9 4.2 系统总体...

      Spring in Action(第二版 中文高清版).part1

      16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

    Global site tag (gtag.js) - Google Analytics