struts2内建的类型转换器并不能解决所有的问题,那就需要自己创建类型转换器。
自定义的类型转换器必须实现ognl.TypeConverter接口或对这个接口的某种具体实现做进一步扩展。
TypeConverter接口只有一个名为convertValue的方法,它的方法签名如下:
public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
参数:
context:将在其中进行类型转换的OGNL上下文环境。
target:将在其中对有关属性进行设置的目标对象。
member:将被设置的类成员的名字。
propertyName:将被设置的属性的名字。
value:将被转换的值。
toType:转换结果的类型。
与自行实现TypeConverter接口相比,对该类扩展更容易一些,他是对TypeConverter金额接口的一种默认实现类,且他有简单的方法签名。
public Object convertValue(Map<String, Object> context, Object value, Class toType) { return convertValue(value, toType); } public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType) { return convertValue(context, value, toType); }
在使用一个自定义的类型转换器之前,必须先对它进行配置。这种配置可以基于字段,也可以基于类。
在动作类所在的包中创建ActionClass-conversion.properties的文件,其中的内容可能为下所示:
fieldname=customConverter1
在WEB-INF/classes子目录下创建一个conversion.properties文件,其中的内容可能为下所示:
1.创建属性文件,全局的,在src下面,在action封转数据碰到Adress类型就调用转换器。
xwork-conversion.properties
内容:com.hstc.model.Adress=com.hstc.ognl.adressConverter
1.编写处理类
public class adressConverter extends StrutsTypeConverter{ //输入 @Override public Object convertFromString( Map arg0, String[] arg1, Class arg2) { // TODO Auto-generated method stub if(arg1!=null || arg1.length>0){ String[] str = arg1[0].split("-"); Adress a = new Adress(); a.setJiehao(str[0]); a.setPaihao(str[1]); return a; } return null; } //输出 @Override public String convertToString(Map arg0, Object arg1) { // TODO Auto-generated method stub String str = ""; if(arg1 instanceof Adress){ str = arg1.toString(); } return str; } }
3.在view的使用
<!-- 自定义转换器输入 --> <s:textfield name="address" label="address"></s:textfield> <!-- 自定义转换器输出 --> <s:property value="address"/>
4.model类
public class Adress { private String jiehao; private String paihao; public String getJiehao() { return jiehao; } public void setJiehao(String jiehao) { this.jiehao = jiehao; } public String getPaihao() { return paihao; } public void setPaihao(String paihao) { this.paihao = paihao; } public String toString(){ return jiehao + paihao; } }