客户端发送过来的数据都是以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就是你自己写的那个转换器类。写完之后保存。这样一个类型转换过程就完成了!

效果图如下:

 

 

posted on 2016-08-16 18:37  为活着而活着  阅读(3480)  评论(0编辑  收藏  举报