上篇博文已经讲解了,Struts2为咱们实现了数据自动封装…由上篇的例子咱们能够看出,表单提交过去的数据全都是String类型的,可是通过Struts自动封装,就改为是JavaBean对应成员变量的类型了。java
可是呢,日期类型只支持是yyyy-MM-dd这种格式的,由于咱们在上个例子中直接使用的是Struts支持的格式,所以没有报错…本篇博文就是讲解Struts如何对日期类型的格式更好地支持markdown
当咱们使用的是yyyyMMdd这种格式的时候,咱们看看Struts的自动封装能不能解析出相对应的日期app
直接抛出了异常jsp
那么,咱们怎么让Struts可以支持更多的日期格式呢??好比,我想Struts在自动封装数据的时候支持yyyyMMdd,yyyy年MM月dd日这样的日期格式…..ide
Struts提供了转换器给咱们使用,也就是,咱们能够自定义转换器,咱们定义了什么格式,Struts就能够根据对应的格式进行自动封装…spa
当咱们写完自定义转换器,是须要向Struts说明咱们写了,否则的话,Struts是不知道咱们自定义了转换器类的…code
也就是说,咱们要想实现类型转换,须要两步:orm
通常地,咱们想要编写自定义转换器类,都是实现StrutsTypeConverter类的….xml
/** * Created by ozc on 2017/5/1. * 自定义异常转换器类 * * 咱们要实现的就是:在Struts转换的时候, * */ public class MyConvter extends StrutsTypeConverter { //需求,当Struts自动封装数据时,也支持yyyyMMdd,yyyy年MM月dd日等格式的支持\ SimpleDateFormat[] format = {new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyyMMdd"), new SimpleDateFormat("yyyy年MM月dd日")}; /** * 把String转换为指定的类型 【String To Date】 * * * @param map * 当前上下文环境 * @param strings * jsp表单提交的字符串的值 * @param aClass * 要转换为的目标类型 */ @Override public Object convertFromString(Map map, String[] strings, Class aClass) { //判断是否有值 if (strings == null) { return null; } //判断是不是日期类型的 if (Date.class != aClass) { return null; } //遍历循环 for (SimpleDateFormat dateFormat : format) { try { //解析传递进来的第一个就行啦 dateFormat.parse(strings[0]); } catch (ParseException e) { //若是格式不对,那么就跳出当前的循环 continue; } } return null; } @Override public String convertToString(Map map, Object o) { return null; } }
告诉Struts我写了一个转换器类,也分两种方式图片
步骤:
xwork-conversion.properties
的文件java.util.Date=qwer.MyConvter
步骤:
Action名-conversion.properties
的文件user.birthday=qwer.MyConvter
当发生了日期转换的异常时,Struts给出的页面是这样子的:
这个咱们称之为input视图,咱们要作的就是给出用户更友好的提示,因而在struts.xml文件中配置:若是返回的是input视图,那么跳转到咱们相对应的页面上
<result name="input">/error.jsp</result>