从一个HTMl到一个Action对象,类型转化你是从字符串到非字符串。
首先,HTTP没有“类型” 的概念,每一项表单的输入值可能是从一个字符串或一个字符串数组,在server端,必须把String转换成特定的数据类型。
struts2中,把请求参数映射到action属性的工作由Parameters拦截器负责,它是默认的defaultStack拦截器中的一份子,Parameters拦截器可以自动完成字符串和基本数据类型之间的转换。
类型的转换错误
- 若Action类没有实现ValidationAware接口:struts在遇到类型转换错误时,仍然会调用Action方法,仿佛什么都没有发生。
- 若action类实现了ValidationAware接口: struts在遇到类型转换错误时将不会继续调用其Action方法;struts将检查相关action元素的声明是否包含一个name=input的result。如果有,struts将把控制权交给result元素;如果没有input结果,struts将抛出一个异常。
继承ActionSupport来间接实现ValidationAware接口
public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable
下面看一个例子
此时还没有继承ActionSupport类
两个输入结果分别是
可以看到确实执行了Action方法;再看一下继承了ActionSupport的Action类
再看一下执行结果
可以看到返回了一个错误提示;那么这个错误提示可以被覆盖吗?那就要用到ConversionError拦截器;其负责添加与类型转换错误有关的错误信息(前提,Action实现了ValidationAware接口),而且还能保存各请求参数的原始值。
覆盖默认的错误消息
- 在对应的Action类所在的保重新建ActionClassName.properties文件,ActionClassName为输入字段的Action类的类名
- 在属性文件中添加如下键值对:invalid.fieldvalue.fieldName=xxx
再看一下执行结果
若字段标签使用的不是Simple主题,责非法输入字段将导致不提示错误消息,那就需要手动去添加错误消息
使用s:debug查看栈顶属性
看到值栈里有fieldErrors属性里面存放了我们的错误信息,该属性为Map<String,List<String>>类型,可以通过EL或者OGNL方式来显示错误信息