接收页面的参数都是String类型的, 如果使用Servlet来做参数接收都必须手动转换, 而Struts2框架可以为我们自动进行转换, 但前提是页面传递过来的数据类型能够和后台定义的数据类型进行相互的转换, 如果遇到不能转换的(如: 时间类型的转换)
我们一般做数据的转换有两种情况: 第二种情况一般由后续会讲到的页面标签来处理, 这一节主要讲的是第一种情况.
1 String(前台)-->其他类型(后台)
2 其他类型(后台)-->String(前台展示)
①时间类型参数的局部转换
Struts2框架默认接收的时间参数是xxxx-xx-xx的格式
"struts.xml"配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="person" extends="struts-default" namespace="/person">
<action name="test1" class="com.rl.action.PersonAction1" method="hello1">
<result name="success">/success.jsp</result>
<result name="input">/form1.jsp</result>
</action>
</package>
</struts>
动作类代码:
还是采用模型驱动的方式接收参数, 在model类Person中添加Date类型的birthday属性
form1.jsp:
同之前的模型驱动的form一样, 添加了展示错误信息标签(后续会讲到, 这里不贴出来了)
访问:
以斜杠的日期方式输入:
输出结果:
以横线的日期方式输入:
结果:
1 自定义时间类型转换器"MyDateConverter":
package com.rl.converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class MyDateConverter extends StrutsTypeConverter {
/**
* 由字符串格式(前台)转成其他格式(日期)(后台)
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Date date = null;
if(values != null && values.length > 0){
if(toClass == Date.class){
try {
date = new SimpleDateFormat("yyyy/MM/dd").parse(values[0]);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
return date;
}
/**
* 由其他格式(日期)(后台)转成字符串格式(前台)
*/
@Override
public String convertToString(Map context, Object o) {
String dateStr = null;
if(o != null && o.getClass() == Date.class){
dateStr = new SimpleDateFormat("yyyy/MM/dd").format((Date)o);
}
return dateStr;
}
}
2 注册时间类型转换器"Person-conversion.properties": 需要在model类的同级包下新建一个名为"类名.conversion.properties"的文件
birthday=com.rl.converter.MyDateConverter
工程结构图:
横线的日期格式访问:
结果:
斜杠的日期格式访问:
结果:
②时间类型参数的全局转换
①是采用局部的注册, 一旦有多个则比较不方便, 一般都是采用全局注册的方式.
将局部的注册文件删除, 在classpath下新建一个名为"xwork-conversion.properties"的文件
java.util.Date=com.rl.converter.MyDateConverter
斜杠方式访问:
结果:
③参数类型转换错误的中文提示
刚才的页面提示的错误信息是英文的, 可以自定义成中文的.
1 在动作类的同级包下创建一个名为"action类名.properties"的属性文件,
key为表单文本域中的name, 这里是birthday
value为错误提示的中文信息
invalid.fieldvalue.birthday=\u65E5\u671F\u683C\u5F0F\u9519\u8BEF, \u5E94\u4E3A yyyy/MM/dd
横线的日期格式输入, 结果为: