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