Struts2学习 一 自定义类型转换器

2018-02-28  本文已影响10人  Mon7ey

struts2中,使用Jsp提交表单数据时,struts2会自动将表单中的数据封装,并复制给对应Action中的属性.

struts2会自动转换只支持基本数据类型和 "yyyy-MM-dd"形式的日期类型.

如果用户输入的日期类型.不是struts2可识别的格式,就会报错.

在项目中,经常会需要用户输入各种类型的时间.这种情况下我们就需要用到"自定义类型转换器".

Struts2 类型转换接口

接口实现关系

TypeConverter接口定义了方法.DefaultTypeConverter是该接口的默认实现.StrutsTypeConverter继承了DefaultTypeConverter类.

自定义类型转换分为 : 局部类型转换 和 全局类型转换

Action实例
public class UserAction extends ActionSupport {

    private User user;

    private Date birth;

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String register() {
        System.out.println(user.getName());
        System.out.println(user.getPwd());
        System.out.println(user.getAge());
        System.out.println(user.getBirth());
        return "success";
    }
}

局部类型转换

  1. 我们在自定义类型转换器时,需要继承StrutsTypeConverter类.重写converterFromString 和 convertToString方法
public class MyConverter extends StrutsTypeConverter{

    /**
     * 把String转换为指定对象
     * @param context 当前上下文环境
     * @param values jsp表单提交的字符串的值
     * @param toClass 要转换的目标类型
     */
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            
            return sdf.parse(values[0]);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    /**
     * 将指定类型转换String
     */
    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        return null;
    }

}2. 注册转换器

在需要进行类型转换的Action目录(包)下,创建一个新的properties文件.
文件名按照指定规则指定.

文件的命名规则为 : ActionClassName-conversion.properties

举例 :
如果是UserAction中有字段需要进行类型转换.
配置文件命名为:UserAtion-conversion.properties

  1. 声明配置文件内容

对属性成员进行类型转换时 :

birth=com.se7en.struts02.util.MyConverter(自定义转换器类的全路径)

对属性成员内部变量进行类型转换时 :

user.birth=com.se7en.struts02.util.MyConverter(自定义转换器类的全路径)

全局类型转换

全局类型转换器的定义方法和局部类型转换器相同. 同样是继承StrutsTypeConverter类.实现converterFromString 和 converterToString方法

不同点是配置文件,全局类型转换器的配置文件的命名和位置都与局部类型转换器不同.

配置文件名称 : xwork-conversion.properties

全局类型转换器的配置文件必须放在 src 目录下!!!
全局类型转换器的配置文件必须放在 src 目录下!!!
全局类型转换器的配置文件必须放在 src 目录下!!!

内容 :

java.util.Date=com.se7en.struts02.util.MyConverter

完整的类型转换
public class MyConverter extends StrutsTypeConverter{

    /**
     * 把String转换为指定对象
     * @param context 当前上下文环境
     * @param values jsp表单提交的字符串的值
     * @param toClass 要转换的目标类型
     */
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        
        // 内容不能为空
        if (values == null || values.length == 0) {
            return null;
        }
        
        // 判断类型必须为Date
        if (Date.class != toClass) {
            return null;
        }
        
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            
            return sdf.parse(values[0]);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    /**
     * 将指定类型转换String
     */
    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        return null;
    }

}
上一篇下一篇

猜你喜欢

热点阅读