zsisgood

导航

 

 

  struts2中类型转换器

  使用背景:在通过jsp页面传递参数时,http通常将参数设置为String类型,即接收String类型参数,而在struts2中提供了类型转换的机制,将传递来的参数转换成action需要的类型。

  如下action中定义了基本类型和复杂类型的参数。基本类型的转换struts2在处理过程中会调用基本的转换方法,如将字符串类型转换为整形。

package action;

import java.awt.Point;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.opensymphony.xwork2.ActionSupport;

public class testAction extends ActionSupport {
    private String name;
    private int age;
    private Date date;
    private List<String> i;
    private Set<String> s;
    private Point p;
    private List<Point> ps;
    private Map<String,Point> point;
    
    
    public Map<String, Point> getPoint() {
        return point;
    }


    public void setPoint(Map<String, Point> point) {
        this.point = point;
    }


    public List<Point> getPs() {
        return ps;
    }


    public void setPs(List<Point> ps) {
        this.ps = ps;
    }


    public Point getP() {
        return p;
    }


    public void setP(Point p) {
        this.p = p;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public int getAge() {
        return age;
    }


    public void setAge(int age) {
        this.age = age;
    }


    public Date getDate() {
        return date;
    }


    public void setDate(Date date) {
        this.date = date;
    }


    public List<String> getI() {
        return i;
    }


    public void setI(List<String> i) {
        this.i = i;
    }


    public Set<String> getS() {
        return s;
    }


    public void setS(Set<String> s) {
        this.s = s;
    }


    public String execute(){
        return SUCCESS;
    }
}

 

  而如果在前台页面中如果出现像复选框这样的提交参数形式时候,可以通过List或Set在action中接收,或者通过数组也可。

  但如果出现像awt.Point类的参数时,该Point类只有set方法没有get方法,意思是在struts2的action中不能将传递过来的参数实现初始化。那么现在就可以使用自定义的类型转换器来实现。如下:

package convertor;

import java.awt.Point;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
import com.opensymphony.xwork2.factory.DefaultConverterFactory;

public class myPointConvertor extends DefaultTypeConverter {
    public Object convertValue(Object value,Class toType){
        if(toType==Point.class){
            Point p=new Point();
            String args[]=(String[])value;
            String xy[]=args[0].split(",");
            p.x=Integer.parseInt(xy[0]);
            p.y=Integer.parseInt(xy[1]);
            return p;
        }
        if(toType==String.class){
            return value.toString();
        }
        return super.convertValue(value, toType);
    }
}

为了接收处理Point类型的参数,实现一个该Point类型的转换器,需要注意的是实现该转换器时可以继承struts2中的DafaultConverter类,实现convertValue(Object,Class)方法,该方法中toType表示要转换成的类型,value表示转换的值。该转换器可以将字符串类型和Point类型相互转换,也可以将其它类转换为字符串,如果该转换器无法处理对应情况时,返回给父类的方法转换。

  而为了实现该转换器需要在该项目中注册该转换器....

  这里只列举一种常用的方法:即在src目录下创建properties文件,而需要注意的是该文件名称必须固定为"xwork-conversion"

  文件中需要写入:想要转换的类型 以及对应的转换器 如图:

  

java.awt.Point=convertor.myPointConvertor

  具体实现是这样的:当前台页面中传递过来的参数如p=1,2 而action中发现没有对应的方法初始化action中的参数p,此时strut2就会搜索目录下的注册文件,发现src目录下有对应的转换文件xwork-conversion.properties,找到该文件中和action对应的参数类型相同的类型,Point,然后找到该类型转换器,将需要转换的类型传递给Class toType参数。而将接收过来的参数传递给convertValue方法中的value参数。实现该类型的转换。

  对于注册方式,本文中使用了全局注册方式,也可以使用局部注册或者注解方式。

posted on 2016-03-11 09:20  zsisgood  阅读(87)  评论(0)    收藏  举报