struts2中的类型转换

2012/05/13 1948点热度 0人点赞 0条评论

struts2中的前后台交互中的基本类型是自动转型的,

 如何接收表单中的值?

    a,在Action中定义和表单name相对应的属性

    b,在Action中实现模型驱动,模型驱动的中的bean中的属性和页面中的name对应

 当转化日期时会报错,我们可以struts.xml中定义的<action>中配置异常制定下的页面

<result name="input">/异常页面</result>

 我们可以通过自定义转化器来转化日期

定义转化器,必须实现TypeConvert接口

可以继承它的子类defaultTypeConvert,strutsTypeConverter实现

定义类型转换类

public class DateConverter extends DefaultTypeConverter {
    /**
     * 该方法的返回值就是同目录下的action中private Date createTime属性的值
     *   * context:action中上下文
     *   * value:要转化的值:该值是字符串类型的数组,strus2底层用request.getParameterValues("createTime")---String[]
     *   * toType:要转化成的数据类型,这里是java.util.Date.class类型
     */
    public Object convertValue(Map<String, Object> context, Object value,Class toType) {
        if(value==null){
            return null;
        }
        if(toType==null){
            return null;
        }
        if(toType!=java.util.Date.class){
            return null;
        }
        if(value instanceof String[]){
            try {
                String str[]=(String[])value;
                if(StringUtils.isNotBlank(str[0])){
                    SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
                    return sf.parse(str[0]);
                }
            } catch (ParseException e) {
                e.printStackTrace();
                /**
                 * struts2的类型转化控制是由类型转化错误拦截器来完成的
                 *    * 如果进行类型转化没有任何的异常,则 struts2的类型转化错误拦截器不再进行拦截
                 *    * 如果进行类型转化任何的异常,则必须抛出异常 struts2的类型转化错误拦截器接收到抛出的异常,进行处理
                 */
                throw new RuntimeException("日期转化有误",e);
            }
        }
        return null;
    }
}

局部配置类型转换方法:(也叫基于字段的类型转换器)

 新建'Action名称'+'-conversion.properties'属性文件,  和action放在同一个目录下

  比如:UserAction-conversion.properties

  #指定要转化的类型和转换类,  要转化成的属性key对应转化器的类路径value

   createTime=com.yxkong.converter.DateConverter

配置全局的转换方法:

在src下 新建xwork-conversion.properties

  #指定要转化的类型和指定转换类的实现

  java.util.Date=com.yxkong.converter.DateConverter

在ssh框架下,会报这种错误,是因为页面上的input为空的时候,struts2会把这些值当成string类型,BigDecimal类型无法转换string类型的字符,所以就报这个错了,不影响功能的

 Error setting expression 'costs[5].costSum' with value '[Ljava.lang.String;@22a730bd'
ognl.MethodFailedException: Method "setCostSum" failed for object com.hisun.report.model.CostResponsibility@afbf16d [java.lang.NoSuchMethodException: com.hisun.report.model.CostResponsibility.setCostSum([Ljava.lang.String;)]

写一个转换器就行了

public class BigDecimalConverter extends StrutsTypeConverter {

    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        BigDecimal bd = null;  
        //判断类型,(不用判断也行,在配置文件中已经配置了,判断下更保险)
        if(BigDecimal.class ==toClass){  
            String bdStr = values[0];  
            if(bdStr!=null&&!"".equals(bdStr)){  
                bd = new BigDecimal(bdStr);  
            }else{  
            }  
            return bd;  
        }         
        //正常不会走到这一步
        return null;  
    }

    @Override
    public String convertToString(Map context, Object o) {
        if(o instanceof BigDecimal){  
            BigDecimal b = new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_DOWN);  
            return b.toString();  
        }         
        return o.toString();  
    }

}

在src下配置全局的配置xwork-conversion.properties

java.math.BigDecimal=com.yxkong.common.interceptor.BigDecimalConverter

yxkong

这个人很懒,什么都没留下

文章评论