Struts数据自动封装和类型转换

前言

struts框架提供给我们许多功能,比如页面传递的数据自动封装到action中的属性,传递的字符串类型数据自动转换成action类中定义的属性类型等,方便用户开发,提高开发效率。

请求数据自动封装

在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名属性。
还可以接收对象。
请求路径: http://localhost:8080/test/view.action?product.id=78
Struts2首先通过反射技术调用Product的默认构造器创建product对象,然后再通过反射技术调用product中与请求参数同名的属性的setter方法来获取请求参数值。
Struts2中如何传递请求参数给Action?
Struts2框架会将表单的参数以同名的方式设置给对应Action的属性中。
该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了。
小结:
一、Jsp表单填充到action中的属性
必须有setter方法
二、Jsp表单填充到action中的对象属性
必须有setter方法和getter方法

类型转换

在struts中,jsp提交的数据(字符串),struts会自动转换为Action中属性的类型,对于基本数据类型以及日期类型会自动转换。但是日期类型只支持yyyy-MM-dd
默认的转换器类为DefaultTypeConverter类在构造方法中定义了可以转换的基本类型。当该类中没有定义类型,不能满足用户的类型需要的时候,需要自定义类型转换器类。
小结:
String到基本数据类型的转换是自动的。
String到Date日期类型的转换是有条件的。
默认输入框输入的格式必须是yyyy-MM-dd,其他格式无法转换。
注意:如果类型自动转换错误,那么Struts2框架默
认会找名为input的result进行处理。因此开
发者需要在此Action的result配置中配置一个
名为input的result。前提: 继ActionSupport。

Struts2中如何配置自定义转换器?(局部的和全局的)

自定义转换器开发步骤:
1、自定义转换器继承StrutsTypeConverter
2、重写convertFromString和convertToString方法
3、注册转换器–写配置通知struts,自定义类在哪里
这里的配置文件分为局部转换器和全局转换器,如果定义局部转换器,只是对当前Action类有效,那么定义配置文件如下:
3.1 在指定要转换类型的Action所在包中建立配置文件命名规则如下:
Action名-conversion.properties
例如:UserAction-conversion.properties
3.2 在3.1文件中添加以下内容:
需要转换的字段名=自定义转换器类的权限定名(包括包名)
例如:user.birthday=com.nwpu.MyConvertor(这么一行数据即可)
如果是要配置全局的转换器类,供多个Action类使用,那么
3.注册全局的转换器
3.1 在项目src目录下建立以下固定格式的配置文件
xwork-conversion.properties —注意文件名必须固定(因为源码中定义规则)
3.2 在3.1文件中添加以下内容
需要转换的类类型=转换器类的权限定名
如: java.util.Date= com.nwpu.MyConvertor—–自定义类全称(包括包名)

案例:

需求:在用户注册时候会传递日期格式的数据,那么就必须多定义几种用户习惯的填写日期格式的类型进行转换。

自定义转换器类 MyConvertor.java

public class MyConvertor extends StrutsTypeConverter {

    // 需求: 要求项目中要支持的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日..

    // 先定义项目中支持的转换的格式
    DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("yyyyMMdd"),
            new SimpleDateFormat("yyyy年MM月dd日") };

    /**
     * 把String转换为指定的类型 【String To Date】
     * 
     * @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;
        }

        // 迭代:转换失败继续下一个格式的转换; 转换成功就直接返回
        for (int i=0; i<df.length; i++) {
            try {
                return df[i].parse(values[0]);
            } catch (ParseException e) {
                continue;
            }
        }
        return null;
    }

    @Override
    public String convertToString(Map context, Object o) {
        return null;
    }
}

其他文件例如struts.xml配置,register.jsp,UserAction.java这里就省略了,有不会或者写的不对的地方可以私信我哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值