首页 > 新闻动态 >  

新闻动态
NEWS

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




读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。
分享到: