客户端发送过来的数据都是以String[]的形式保存的。在struts2里面仅仅很少的数据类型转换支持,例如原生的数据类型。还有常见的String或者Date类型。struts无法知道我们会使用哪种数据类型。所以它提供一些实现自定义类型转换的类。具体的转换过程如下:
首先我们要定义好我们需要的数据类型。例如定义一个User类型。User类代码如下:
package com.struts2.customtype; public class User { private String name; private String surname; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } }
然后定义action类来处理请求:
package com.struts2.customaction; import com.opensymphony.xwork2.ActionSupport; import com.struts2.customtype.User; public class UserAction extends ActionSupport{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { // TODO Auto-generated method stub return ActionSupport.SUCCESS; } }
接着我们就来定义自定义类型转换器,这个转换器需要继承一个类叫:DefaultTypeConverter类。它是由obgl这个包提供的。我们要重写里面的convertValue方法,然后这个方法会被struts调用。代码如下:
package com.struts2.conversion; import java.lang.reflect.Member; import java.util.Map; import java.util.StringTokenizer; import com.struts2.customtype.User; import ognl.DefaultTypeConverter; public class UserConversion extends DefaultTypeConverter{ @Override public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType) { // TODO Auto-generated method stub if(toType==User.class){ String[] param=(String[]) value; StringTokenizer st= new StringTokenizer(param[0], ";"); String name=st.nextToken(); String surname=st.nextToken(); User user=new User(); user.setName(name); user.setSurname(surname); return user; } else if (toType==String.class) { User user=(User) value; return "your name is : "+user.getSurname()+" "+user.getName(); } return null; } }
我在convertValue方法里面实现了转换的过程,就是判断如果是字符串类型就将字符串分割成两部分,一部分是用户名,一部分是密码。然后将分割好的两个字符串赋予一个新new出来的User对象。然后将这个user对象return回去。这样就实现了一个转换。
后面代码原理一样。
这样我们就写好了一个我们自己的类型转换器。
现在我们写了三个类。这三个类现在还是毫无关系的。那么如何将他们关联起来呢?struts让我们在自定义action 的包下建一个properties文件。这个文件名字有要求的。文件名为:aactionname-conversion.properties
然后我们在这个文件里面填写对应的键值对,field=actionconvert.Class。 field就是你的action 里面要被转换的属性的名字。actionconvert.Class就是你自己写的那个转换器类。写完之后保存。这样一个类型转换过程就完成了!
效果图如下: