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
文章评论