首页 > 代码库 > 如何自定义类型转换器 ?
如何自定义类型转换器 ?
问题4. 如何自定义类型转换器 ?
1). 为什么需要自定义的类型转换器 ? 因为 Struts 不能自动完成 字符串 到 引用类型 的 转换.
在java中,基本类型有int,double,float,boolean,char,引用类型就是对象类型,例如数组吖,对象吖,这些
2). 如何定义类型转换器:
StrutsTypeConverter 类--->继承OGNL.defaultTypeConverter---》继承OGNL.TypeConverter
I. 开发类型转换器的类: 所以咋们一般扩展StrutsTypeConverter 类就足够了
1 package com.atguigu.struts2.Converter; 2 3 import java.sql.Date; 4 import java.text.DateFormat; 5 import java.text.ParseException; 6 import java.text.SimpleDateFormat; 7 import java.util.Map; 8 9 import org.apache.struts2.util.StrutsTypeConverter;10 11 public class TestTypeConverter extends StrutsTypeConverter {12 13 /*14 * 此方法是用来将传进来的字符串数组变成一个Object对象15 * 16 * 17 */18 DateFormat dateFormat=new SimpleDateFormat("YYYY-MM-DD hh:mm:ss");19 public Object convertFromString(Map arg0, String[] arg1, Class arg2) {20 if(arg2==Date.class){21 if(arg1!=null&&arg1.length>0){22 String string=arg1[0];23 try {24 dateFormat.parseObject(string);25 } catch (ParseException e) {26 // TODO Auto-generated catch block27 e.printStackTrace();28 }29 }30 }31 32 return arg1;33 }34 35 /*36 *37 * 此方法是用来回显的时候调用的,将Object对象转换成字符串38 * 39 */40 41 public String convertToString(Map arg0, Object arg1) {42 //判断是否为Date对象43 if(arg1 instanceof Date){44 //是的话,就使用format()方法将Date对象转换成一个字符串45 return dateFormat.format(arg1);46 }47 return null;48 }49 50 }
II. 配置类型转换器:
有两种方式
①. 基于字段的配置:
> 在字段所在的 Model(可能是 Action, 可能是一个 JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件
> 在该文件中输入键值对: fieldName=类型转换器的全类名.
fieldName=类型转换器的全类名例如下面的:birth=com.atguigu.struts2.Converter.TestTypeConverter
> 第一次使用该转换器时创建实例.
> 类型转换器是单实例的!
②. 基于类型的配置:
> 在 src 下新建 xwork-conversion.properties
> 键入: 待转换的类型=类型转换器的全类名.
需要转换的类型=转换器全类名例如下面的:java.util.Date=com.atguigu.struts2.Converter.TestTypeConverter
> 在当前 Struts2 应用被加载时创建实例.所以若在转换器里有引用Web.xml里的参数时就要注意了,因为 转换器在Struts2在加载时就已经创建实例了,而此时web.xml还没加载呢,所以你在转换器里引用web.xml的资源就为空了,所以一定要做是否非空做出判断,要不要转换器还是起不了作用
-->
如何自定义类型转换器 ?