类型转换
将某些类型的数据转换成固定的形式
比如说:
new SimpleDateFormat("yyyy 年MM 月dd 日"),
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("MM/dd/yy"),
new SimpleDateFormat("yyyy.MM.dd"),
new SimpleDateFormat("yyMMdd"),
new SimpleDateFormat("yyyy/MM/dd") };
首先创建一个jsp页面去接受收入数据的类型:
<%@ taglib prefix="s" uri="/struts-tags" %> <body> <s:form action="dateConvert.action"> <div class="infos"> <table class="field"> <tr> <td class="field">请输入日期:</td> <td><input type="text" class="text" name="timeDate" /></td> </tr> <s:fielderror /> </table> <div class="buttons"> <s:submit value="转换格式"/> </div> </div> </s:form> </body>
2.上边的页面会将数据交给dateConvert处理,dateConvert类由于要处理数据转换方面的问题,所以继承了StrutsTypeConverter
具体代码如下:
package cn.jbit.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import com.opensymphony.xwork2.conversion.TypeConversionException; public class DateConverter extends StrutsTypeConverter { // 支持转换的多种日期格式,可增加时间格式 控制台可以接受的类型转换格式 private final DateFormat[] dfs = { new SimpleDateFormat("yyyy 年MM 月dd 日"), new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("MM/dd/yy"), new SimpleDateFormat("yyyy.MM.dd"), new SimpleDateFormat("yyMMdd"), new SimpleDateFormat("yyyy/MM/dd") }; /** * 将指定格式字符串转换为日期类型。 */ public Object convertFromString(Map context, String[] values, Class toType) { String dateStr = values[0];// 获取日期的字符串 for (int i = 0; i < dfs.length; i++) {// 遍历日期支持格式,进行转换 try { //2012/12/12 return dfs[i].parse(dateStr); //进行格式的比较 } catch (Exception e) { continue; } } throw new TypeConversionException("转换错误"); } public String convertToString(Map context, Object object) { Date date = (Date) object; // 输出的格式是yyyy-MM-dd return new SimpleDateFormat("yyyy-MM-dd").format(date); } }
上述类可以说是用来做类型转换的一个自定义的手工的工具类,现在做的需要真正的转换字符串
创建出一个数据转换的action类,如下:
package cn.jbit.action; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class DateConvertAction extends ActionSupport { //定制成员变量TIMEDATE 时间 private Date timeDate; public String execute(){ return SUCCESS; } public Date getTimeDate() { return timeDate; } public void setTimeDate(Date timeDate) { this.timeDate = timeDate; } }
我们可以通过两种方式吧工具类和真正的action类做一个关联:
1.可以创建一个全局类型的转换器
转换类全名=类型转换器类的全名(文件名为xword.conversion.properties)的属性文件,里边配置为:
java.util.Date=cn.jbit.util.DateConverter
这是适合于多个action的全局的
2.可以创建一个相对于单个action的属性文件:ClassName.conversion.properties
其内容为特定类的属性名=类型转换器的全名
完成之后可以做一些处理类型转换错误的操作:
1.前提条件:>启动strusConversionErrorInterceptor拦截器,该拦截器包含在defaultStack拦截器栈中,参看struts-defatul.xml文件,如果在struts.xml中扩展了"struts-default"包,启动项目时会自动加载
>实现validationAware接口,ActionSupport实现了该接口
>配置input结果映射,出现错误之后,停留到该页面
>再页面使用<s:fielderror>标签来输出转换的错误.
2.修改所有类型的转换错误信息
<constant name ="struts.custom.i18n.resources" value="message">
创建资源文件message.properties ,并添加文本:
xwork.default.invalid.fieldvalue=field"{0}"'s value is invalid
3.定制特定字段的类型转换错误信息在action 同级目录下 DateConvertAction.properties
invalid.fieldvalue.timeDate
日期格式错误