SSH框架之Struts的类型转换器、案例——多格式转换

Struts的类型转换器(在此以日期类型转换器为例)

一、类型转换器
1、Struts中jsp提交的数据(均为Stringl类型),struts会自动转换为action中属性的对应类型;(这一点优于Servlet,Servlet需要手动转换)。
2、对于基本数据类型以及日期类型会自动转换。
3、日期类型只支持yyyy-MM-dd格式。如果是其他格式,需要自定义类型转换器。

二、类型转换器分类
1、局部类型转换器
2、全局类型转换器

三、Struts转换器的API
|–TypeConverter 转换器接口
|—–DefaultTypeConverter 默认类型转换器类
|——–StrutsTypeConverter 用户编写的转换器类,需要继承此类

四、局部类型转换器类
1、局部类型转换器开发步骤:
1)写转换器类

package sram.type;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

/**
 * 在项目开发中,该类应位于util包下
 */
//1.继承StrutsTyptConverter
public class MyConverter extends StrutsTypeConverter{
    //2.实现StrutsTypeConverter抽象类中的所有方法
    /**
     * 2.1把String转为指定类型【String To Date】
     * @param context   当前的上下文环境
     * @param values    jsp表单提交的字符串的值
     * @param toClass   要转换为的目标类型
     */
    public Object convertFromString(Map context, String[] values, Class toClass) {
        try {
            //判断1:内容不能为空
            if(values==null||values.length==0){
                return null;
            }
            //判断2:类型必须为Date
            if(Date.class!=toClass){
                return null;
            }
            //转换
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            return sdf.parse(values[0]);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    public String convertToString(Map arg0, Object arg1) {
        return null;
    }
}

2)配置转换器类(告诉Struts应用自己的转换器类)
a)在同包的action目录下,新建一个properties文件。
b)命名规则:ActionClassName-conversion.properties
举例:sram.type包下创建UserAction-conversion.properties

3)内容
user.birthday=转换器类全路径(sram.type.MyConverter)

2、总结:转换器能否给其他Action使用?
不能,这里的转换器指的是转换器类(MyConverter)+配置文件(UserAction-conversion.properties),所以不能给其他Action使用,而转换器类(MyConverter)是通用的。

五、全局类型转换器:需要写一个转换器,给所有的Action用!
1、全局类型转换器开发步骤:
1)配置全局类型转换器:src/xwork-conversion.properties
2)内容:
要转换的类型的全名(java.util.Date)=类型转换器类(sram.type.MyConverter)

六、总结:当项目中同时存在局部类型转换器与全局类型转换器的时候,优先执行局部类型转换器(就近原则)

七、经典案例:

package sram.type;

import java.sql.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

public class MyConverter extends StrutsTypeConverter{
    /**
     * 需求:要求项目支持的格式为:
     *      yyyy-MM-dd
     *      yyyyMMdd
     *      yyyy年MM月dd日
     *      ......
     */
    //先定义项目中支持的转换的格式
    DateFormat[] df = {
        new SimpleDateFormat("yyyy-MM-dd"), 
        new SimpleDateFormat("yyyyMMdd"),
        new SimpleDateFormat("yyyy年MM月dd日"),
    };

    public Object convertFromString(Map context, String[] values, Class toClass) {
        //判断1:内容不能为空
        if(values==null||values.length==0){
            return null;
        }
        //判断2:类型必须为Date
        if(Date.class!=toClass){
            return null;
        }
        //迭代:转换失败继续下一个格式的转换;转换成功就直接返回
        for(int i=0;i<df.length;i++){
            try {
                //转换
                return df[i].parse(values[0]);
            } catch (ParseException e) {
                continue;
            }
        }
        return null;
    }

    public String convertToString(Map arg0, Object arg1) {
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值