-
Struts2的主动类型转换及自定义类型转换
添加时间:2013-7-25 点击量:转自:http://www.chinasb.org/archives/2010/11/850.shtml
为什么会有类型转换?
HTTP和谈中传递的任何内容都是String类型的,所以一旦我们在办事器上须要一个非String类型的对象,例如:int或者Date,那么我
们就须要在收到 HTTP恳求的数据的时辰,起首将String类型的数据变换为我们须要的对应类型的数据,之后再应用。这个过程就是类型转换类型转换在Struts2中是透明的,即Struts2内置了类型转换机制。
一、概述
在B/S应用中,将字符串恳求参数转换为响应的数据类型,是MVC框架供给的功能,而Struts2是很好的MVC框架实现者,理所当然,供给了类型转换机制。Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单位素和其他GET/POET的参数)定名为合法的OGNL表达式,就可以充沛哄骗Struts2的转换机制。
除此之外,Struts2供给了很好的扩大性,开辟者可以很是简单的开辟本身的类型转换器,完成字符串和自定义复合类型之间的转换。总
之,Struts2的类型转换器供给了很是强大的发挥解析层数据处理惩罚机制,开辟者可以哄骗Struts2的类型转换机制来完成随便率性的类型转换。二.常规类型的转换:
比如表单提交的信息有 用户名,诞辰, 春秋, Action中对应的数据类型分别是 String, Date, int.没什么好说的, Struts2会主动完成.
Struts2内建了常用的类型转换器,如String ,boolean,char,int,long,float,double,Date, 数组(假定元素是String类型), 凑集(假定元素是String类型,用ArrayList封装)
实现自定义类型转换器
实现TypeCoverter接口,或者持续DefaultTypeConverter实现类(该类实现了TypeCoverter接口),经由过程持续该实现类来实现本身的类型转换器。重写convertValue办法即可。为了简化类型转换器的实现,Struts2供给了一个StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了办法,并供给了2个不合转换标的目标的办法:Object
convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。三、注册应用
实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2框架才可以正常应用该类型转换器。
关于类型转换器的注册体式格式,首要有3中:
A、注册局部类型转换器:仅仅对某个Action的属性起感化。
B、注册全局类型转换器:对所有Action的特定类型的属性都邑生效。1、局部类型转换器
供给如下格局的文件
文件名: ActionName-conversion.properties
内容:多个propertyName(属性名)=类型转换器类(含包名),如 date=com.aumy.DateConverter
存放地位:和ActionName类雷同路径。2、全局类型转换器
供给如下格局的文件
文件名: xwork-conversion.properties
内容: 多个“复合类型=对应类型转换器”项构成,如 java.Util.Date=com.aumy.DateConverter
存放地位:WEB-INF/classes/目次下。四、应用示例
因为Struts2对日期转换显示时,会显示日期和时候,如今项目只须要显示日期,所以采取自定义的类型转换器来实现日期显示。1、类型转换类
package com.cczjjg.util;
import java.text.;
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class DateTypeConverter extends DefaultTypeConverter {
private static final DateFormat[] ACCEPT_DATE_FORMATS = {
new SimpleDateFormat(dd/MM/yyyy),
new SimpleDateFormat(yyyMMdd),
new SimpleDateFormat(yyyy-MM-dd),
new SimpleDateFormat(yyyy/MM/dd) }; // 支撑转换的日期格局
public Object convertValue(Map context, Object value, Class toType) {
if (toType == Date.class) { // 浏览器向办事器提交时,进行String to Date的转换
Date date = null;
String dateString = null;
String[] params = (String[]) value;
dateString = params[0];// 获取日期的字符串
for (DateFormat format : ACCEPT_DATE_FORMATS) {
try {
return format.parse(dateString);// 遍历日期支撑格局,进行转换
} catch (Exception e) {
continue;
}
}
return null;
}else if (toType == String.class) { // 办事器向浏览器输出时,进行Date to String的类型转换
Date date = (Date) value;
return new SimpleDateFormat(yyyy-MM-dd).format(date);// 输出的格局是yyyy-MM-dd
}
return null;
}
}
2. 具体注册应用
局部设备:
ActionName-conversion.properties设备文件
1
读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。