在使用Struts2框架的时候可以方便的把前台用户输入的表单数据转换为期望类型,要知道前台输入的数据都是字符串(文本)形式的,是Struts2框架的预处理使得这些字符串变成了相应的数据类型.
这里我们通过Struts2提供的类型转换API实现自定义类型数据的转换.
自定义数据类型转换器先要确定的几点:
1.确定是谁要进行类型转换? ——–>convertValue()的value参数,这个需要使用到.properties配置文件通知框架哪些属性是我自己要指定转换类型的
2.要转换到哪个类型? ——–>convertValue()的toType参数(这里的toType参数是由你的action中该属性的类型确定的,框架在为参数注入时会先调用该方法传入参数值和所需类型,所以这里的类型肯定是要跟action中该属性类型一致的)
3.继承一个转换器类/接口 ——–>覆写DefaultTypeConverter类的convertValue()方法,该方法是框架对转换器的一个实现,里面封装了经常使用到的基本类型的转换,所以我们才可以方便的使用任意基本类型数据接收来自表单的字符串数据
一.使用.properties配置文件对客户端数据进行拦截,这里又分为两种:全局配置(所有action通用的)和局部的(只在一个action生效的);
A.如果是全局的,配置文件需要满足以下条件:
(1)文件名为:xwork-conversion.properties
(2)存放位置:src目录下
(3)内容:多个“复合类型=对应类型转换器”项组成,如 java.Util.Date=com.aumy.DateConverter
B.如果是局部的,配置文件需要满足以下条件:
(1)文件名: action名-conversion.properties
(2)存放位置:和ActionName类相同路径。
(3)内容:多个propertyName(属性名)=类型转换器类(含包名),如 date=com.aumy.DateConverter
二.定义自己的类型转换器
这里我们先观察Struts2的一个默认类型转换器DefaultTypeConverter的核心方法convertValue():
public Object convertValue(Object value, Class toType) {
Object result = null;//准备返回结果
if (value != null) {//判断是否为空
if ((toType == Integer.class) || (toType == Integer.TYPE))//判断是否为整型
result = Integer.valueOf((int) longValue(value));
}
return result;
}
可以看到这个方法需要两个参数:value和class,即需要转换的值和转换的目标类型.知道这两点之后就可以利用各基础类型接收String类型数据初始化的方法进行类型转换了.
所以在自定义类型转换器的时候,只需要让自定义类继承DefaultTypeConverter类并重写convertValue(Object value, Class toType)方法,让传入的value转换为所需要的类型toType返回即可.
知道了这些原理之后就可以自己写一个类型转换器来实现自己需要的业务功能了,这些功能通常是一些 日期类型 / 集合类型等框架不易实现的通用转换.
具体示例有很多博主已经分享了,这里就不再赘述.