【Struts2】1.类型转换和输入校验

1.Struts2的类型转换:
    1).对于8个原生数据类型以及DateString等常见类型,Struts2可以使用内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,就需要我们自己指定类型转换的方式了。
    2).对于自定义的类型转换器来说需要提供3个信息:Action的名字、Action中待转换的属性名以及该属性对应的类型转换器。其中Action的名字是通过属性文件名来获得的、Action中待转换的属性名是通过属性文件中的key来获得的,该属性对应的类型转换器是通过该key所对应的value来获得的。
    3).可以使用Struts2框架自带的类型转换器StrutsTypeConverter简化类型转换代码的编写,StrutsTypeConverter继承于DefaultTypeConverter父类,并且提供了两个抽象方法:convertFromStringconvertToString,分别表示从页面的字符串转换为后台对象以及从后台对象转换为页面的字符串,我们只需实现这两个抽象方法即可实现类型转换。
    注意:之前的都是局部类型转换,针对于某一个action
    4).全局类型转换。在src目录下新建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字
Struts2也支持自定义方法,即在struts.xml中的action元素内定义method属性,属性值即为待执行的方法。其中,该方法的声明要与execute保持一致。但是不推荐使用这种方式,因为它容易导致Action代码混乱。
 
2.输入校验
执行流程:
1) 首先进行类型转换,(出现错误会放到fileError中)
2) 然后进行输入校验(执行validate方法)
3) 如果在上述过程中出现了任何错误,都不会再去执行execute方法,会转向struts.xml中该action的名为input的result所对应的页面。
图解:
 【Struts2】1.类型转换和输入校验
ActionSupport类的addActionError()方法的实现:首先创建一个ArrayList对象,然后将错误消息添加到该ArrayList对象中。
当调用getActionErrors()方法返回Action级别的错误信息列表时,返回的实际上是集合的一个副本而不是集合本身,因此对集合副本调用clear()方法清除的依旧是副本中的元素而非原集合中的元素,此时原集合中的内容没有收到任何的影响。换句话说,Action级别的错误信息列表对开发者来说是只读的。
 Field Error级别的错误信息底层是用LinkedHashMap实现的,该MapkeyString类型,valueList类型,这就表示一个Field Name可以对应多条错误信息,这些错误信息都放置在List集合当中。
 
Action中自定义方法的输入校验。对于通过actionmethod属性所指定的自定义方法,其对应的自定义输入校验方法名为validateMyExecute(假设自定义的方法名为myExecute)。底层是通过反射来调用的。
当在Action中指定了自定义的execute方法时,首先会执行自定义的execute方法所对应的输入校验方法,然后再去执行validate方法,执行完毕后如果出现了任何错误都不会再去执行自定义的execute方法,流程转向了input这个名字所对应的页面上。
 
自定义Field级别的错误提示消息
1) 新建一个以Action名命名的properties文件,如RegisterAction.properties。
2) 然后在该属性文件中指定每一个出错字段的错误消息
invalid.fieldvalue.birthday=birthday invalid!!
 
Struts2的校验框架(有效的xml文件)。具体来说分为字段优先校验器与校验器优先校验器。
 
对于国际化的资源文件,其命名规则是:package_语言名_国家名,比如package_zh_CN,package_en_US
 
 Struts2框架校验执行的先后顺序:
1) 首先执行校验框架(xml文件)
2) 执行自定义方法的校验方法(validateMyExecute)
3) 执行validate方法
 
几种配置文件
1.全局数据类型转换:src目录下新建xwork-conversion.properties,该文件的内容是
    待转换的类=转换器的名字(com.test.action.User=com.test.converter.UserConverter)
2.局部数据类型转换:在action包下创建:对应action类名-conversion.properties,文件内容是:键值对,即action类要转换的成员=转换器的名字(user=com.test.converter.UserConverter)
3.file级别的错误提示消息:在action包下创建:以Action名命名的properties文件,即action类名.properties(RegisterAction.properties);该文件的内容是:指定action中每一个出错字段的错误消息(invalid.fieldvalue.birthday=birthday invalid!!)
4.框架校验:在action包下创建:action类名-validation.xml文件,
5.资源文件:
  
注意短路校验器



注:此文档为学习圣思园风中叶教程结合自身学习所记录。