1.使用DefaultTypeConverter进行转换
需要手动创建DefaultTypeConverter的子类
package com.action; import java.util.Map; import com.bean.Person; import ognl.DefaultTypeConverter; public class UserConverter extends DefaultTypeConverter { @SuppressWarnings("unchecked") @Override public Object convertValue(Map context, Object value, Class toType) { if(toType.equals(Person.class)) { String personStr = ((String[])value)[0]; String[] personArr = personStr.split(","); Person person = new Person(); person.setName(personArr[0]); try{ person.setAge(Integer.parseInt(personArr[1])); }catch (Exception e) { person.setAge(0); } return person; }else if(toType.equals(String.class)) { Person person = (Person) value; return "<" + person.getName() + "," + person.getAge() + ">"; } return null; } }
其中,是自定义类转换为字符串还是字符串转换为自定义类,需要根据toType的类型进行判断。
toType.getClass().equals(String.class)时就是将自定义对象转换为字符串。
需要注意的是,如果是字符串转换为对象的话 ,
value是一个字符串数组,原因是url传值时可以传递多个相同名称的参数。
如果是转换单一对象,那么真正传递过来的字符串是数组的第0个下标。
而对应的从自定义类型向字符串转换的应用场合是在jsp中直接输出自定义类型,这时相当调用了
类的toString()方法,即会将自定义类型转换为字符串。
2.使用StrutsTypeConverter抽象类
代码如下:
package com.action; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import com.bean.Person; public class MyStrutsTypeConverter extends StrutsTypeConverter { @SuppressWarnings("unchecked") @Override public Object convertFromString(Map arg0, String[] strs, Class arg2) { String str = strs[0]; String[] personStrs = str.split(","); Person person = new Person(); person.setName(personStrs[0]); person.setAge(Integer.parseInt(personStrs[1])); return person; } @SuppressWarnings("unchecked") @Override public String convertToString(Map arg0, Object obj) { Person p = (Person)obj; String str = "<" + p.getName() + "," + p.getAge() + ">"; return str; } }
需要实现其中的两个方法
convertFromString和convertToString
这两个方法明确代表了是从对象转换为字符串和从字符串转换为对象。从而避免了使用toType进行判断的麻烦。
上面两种方法最终还要搭配一个properties文件才能发挥作用。
就是你应用类型转换的Action-conversion.properties文件。
例如,在ConvertAction中应用了类型转换,则需要在
相同路径下,构建ConvertAction-conversion.properties文件。
在该文件中写入键值对。
person=com.action.MyStrutsTypeConverter
即指明该Action中对应的字段使用何种类型转换器。
如果相对应用中所有的Action都应用该转换器的话,需要在src目录下,新建文件
xwork-conversion.properties文件,在该文件中声明什么类型应用什么转换器。
即
com.bean.Person = com.action.MyStrutsTypeConverter
多个转换器的话就写多个这样的键值对即可。
在类型转换的过程中可能会出现错误,那么如果出现了错误,错误会返回input视图,所以我们指定input视图所
对应的页面即可。
配置了该视图后使用<s:fielderror />将会输出下面的一段话
Invalid field value for field "person".
其中person就是相应的转换错误的字段。
如果想要改变该显示方式,需要在国际化资源文件中使用xwork.dafault.invalid.fieldvalue={0}xxxxxxx
即可,其中xxxxxxx就是转换失败后显示的信息,而{0}则是可以传递进去转换失败的字段。
若要对特定的属性进行特殊的提示的话,可以在Action类名。properties文件中指定要转换的字段进行什么提示
如ConvertAction.properties文件中。添加一行为
invalid.fieldvalue.person=\u8bf7\u6b63\u786e\u586b\u5199\u4fe1\u606f
其中person为相应转换出现错误的字段。
牢记这两个字段值,但是不太现实,太长,也不好记,记记试试吧。
1.xwork.default.invalid.fieldvalue
2.invalid.fieldvalue.xxx