struts中提供一个自定义类型的转换,比如这里面的日期,默认转换2019-9-12,如果写成2019/9/12则会报错
- struts的字符串类型转换是由一个类com.opensymphony.xwork2.conversion.impl.StringConverter类来完成的
- 日期类型转换是由com.opensymphony.xwork2.conversion.impl.DateConverter来完成
所以如果自己想修改转换格式的话,可以自定义一个转换器
源码分析得出,如果要自己写一个类型转换
- 可以实现DefaultTypeConverter抽象类
- 我们一般也可以用它的子类StrutsTypeConverter来实现
写一个MyDateConverter,测试一下这里面的方法参数分别为什么东西
package convert;
import org.apache.struts2.util.StrutsTypeConverter;
import java.util.Map;
public class MyDateConverter extends StrutsTypeConverter {
/**
* 将字符串转化为对象类型
* @param map
* @param strings
* @param aClass
* @return
*/
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
System.out.println(aClass);
for (String s:strings) {
System.out.println(s);
}
return null;
}
/**
* 将对象类型转化为字符串
* @param map
* @param o
* @return
*/
@Override
public String convertToString(Map map, Object o) {
return null;
}
}
然后在模型包下面创建一个配置文件,命名为 : 模型名-conversion.properties
上面那个是默认的struts规定的转换器配置文件格式,配置文件中写想要转换的模型中的属性,以及依赖的转换器
birthday=convert.MyDateConverter
这里面的birthday是User里面的一个属性
启动服务器,提交表单数据,查看控制台,发现输出如下:
class java.util.Date
2019/2/4
User{username='hh', password='123', birthday=null, hobby='唱歌,code', married=false}
由输出来看这里的aClass是目的转换类型所依赖的类
第二行是待转换的数据
第三行中birthday为null,是因为这里面的转换器的转换方法,返回的值为null
下面演示如何自定义一个转换器,将自定义格式的字符串转化为Date类型的
package convert;
import org.apache.struts2.util.StrutsTypeConverter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
public class MyDateConverter extends StrutsTypeConverter {
/**
* 将字符串转化为对象类型
* @param map
* @param strings
* @param aClass
* @return
*/
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
if (strings!=null&&strings.length>0){
//取数据
String dateStr=strings[0];
if ("".equals(dateStr)){
return null;
}
//转换
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException(e);//转换异常
}
}
return null;
}
/**
* 将对象类型转化为字符串
* @param map
* @param o
* @return
*/
@Override
public String convertToString(Map map, Object o) {
return null;
}
}
在这里面为了使项目中所有Date类型的数据转换器全依靠这个转换器,可以在src的根路径下面创建一个配置文件xwork-conversion.properties,在配置文件中写:
java.util.Date=convert.MyDateConverter
这样就使得全局中的Date类型数据转化都使用这个转换器