6.类型转换


1 类型转换 2 课程结构 内容 课时(H) 第一章:Struts2入门 3 第二章:Struts2中的Action 6 第三章:Struts2拦截器 3 第四章:表达式语言OGNL 3 第五章:Struts2标签库 3 第六章:类型转换 3 第七章:国际化 3 第八章:文件上传和下载 3 第九章:校验框架 3 3 第六章:类型转换 目标: 本章旨在向学员介绍: 1)类型转换的概念 2)Struts2内置的类型转换 3)创建自定义类型转换器 4)局部类型转换器的配置 5)全局类型转换器的配置 时间:3学时 教学方法:授课+练习 4 第六章:类型转换 • 本章内容  6.1 类型转换概述  6.2 自定义转换器  6.3 高级类型转换 5 6.1.1 类型转换的原因 • 客户端浏览器只能将字符串传送到服务器(文件上传除外),而 服务器端java语言是强类型语言,数据类型非常丰富,这就造成 B/S两端的类型不兼容问题. • 传统做法: – 将客户端数据转变成int • int v = Integer.parseInt(request.getParameter(“user”)); – 缺陷: • 过程烦琐枯燥. 6 6.1.2 类型转换的概念 • 所有页面与控制器传递的数据均为String类型,而我们在对其 进行处理时可能会用到各种数据类型,程序无法自动完成数据 类型的转换,需要我们在代码中手动完成,这个过程称为类型 转换。 7 6.1.3 Struts2的内置类型转换器 • Struts2提供了强有力的表现层类型转换机制,无需程序员过多 干预即可自动完成转换. • Struts能自动处理类型转换过程中出现的未知异常. • Struts 2提供的自动类型转换,包括如下几种类型: boolean和Boolean:完成String和布尔型之间的转换。 char和Character:完成String和字符型之间的转换。 int和Integer:完成String和整型之间的转换。 long和Long:完成String和长整型之间的转换。 float和Float:完成String和单精度浮点型之间的转换。 double和Double:完成String和双精度浮点型之间的转换。 Date:完成String和日期类型之间的转换,日期格式为用户请求本地的SHORT格式。 数组:该类型在数据转换时,必须满足需要转换的数据中每一个元素都能转换成数组的 类型。但若程序员自定义类型转换器,则要根据情况判断。 集合:在使用集合类型转换器时,如果集合中的数据无法确定,可以先将其封装到一个 String类型的集合中,然后在用到某个元素时再进行手动转换。 类型转换是在页面与Action相互传递数据时发生的。 8 6.1.4内置类型转换器对集合的支持 • 对List集合的支持: • 对Map集合的支持: private ArrayList list; private HashMap map; 9 第六章:类型转换 • 本章内容  6.1 类型转换概述  6.2 自定义转换器  6.3 高级类型转换 10 6.2.1 创建自定义类型转换器 • 当Struts2内置的转换器不能满足你的应用需求,你可以开发 自己的类型转换器。 • 三种方法可以创建自定义类型转换器: – 实现ognl.TypeConverter接口 – 继承DefaultTypeConverter类 – 继承StrutsTypeConverter类 11 6.2.1 创建自定义类型转换器 • TypeConverter接口中只有一个方法convertValue,该方法过于复 杂 • 我们一般使用DefaultTypeConverter类,该类实现了 TypeConverter接口,并提供了一个简化的convertValue()方法。 • 参数context是表示OGNL上下文的Map对象,target是需要转换的 对象,toType是要转换的目标类型。 public Object convertValue(Map context, Object target, Member member, String propertyName,Object value, Class toType) public Object convertValue(Map context, Object target, Class toType) 12 6.2.1 创建自定义类型转换器 • 除了可以继承OGNL中的DefaultTypeConverter类外,还可以 继承struts2中给出的 org.apache.struts2.util.StrutsTypeConverter抽象类。 StrutsTypeConverter继承自ognl.DefaultTypeConverter类,它 提供了两个抽象的方法用于字符串和其它类型的相互转换。这 两个方法如下所示: public Object convertFromString(Map context, String[] values, Class toClass) 说明:将一个或多个字符串值转换为指定的类型。 参数context是表示action上下文的Map对象, 参数values是要转换的字符串值, 参数toClass是要转换的目标类型。 public String convertToString(Map context, Object obj) 说明:将指定的对象转换为字符串。 参数context是表示action上下文的Map对象。 参数obj是要转换的对象。 13 6.2.2 编写类型转换器—继承 DefaultTypeConverter类 public class DateTypeConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { if(toType == Date.class){//当字符串向Date类型转换时 String[] params = (String[]) value;//Request.getParameterValues() return dateFormat.parse(params[0]); }else if(toType == String.class){//当Date转换成字符串时 Date date = (Date) value; return dateFormat.format(date); } } catch (ParseException e) {} return super.convertValue(context, value, toType); }} 14 6.2.3 编写类型转换器—继承 StrutsTypeConverter类 public class DateTypeConverter extends StrutsTypeConverter{ private static SimpleDateFormat sf=new SimpleDateFormat(“yyyy-MM-dd”); public Object convertFromString(Map context,String[] values,Class toClass){ try{ return sf.parse(values[0]); //使用指定的日期格式解析字符串值,返回date对象 }catch(Exception k){} } public String convertToString(Map context,Object obj){ return sf.format(obj); } } 15 6.2.4 配置类型转换器 • 在struts2中提供了两种方式来配置转换器,一种是应用于全局范 围的类型转换器, 另一种是应用于特定类的类型转换器。 • 注册自定义类型转换器有两种方法 – 特定类型转换器:只有特定的Action才可以使用 • 注册方法:在Action所在的包中建立properties文件,文件名格 式:Action类名-conversion.properties,内容如下: – 要转换的Action类的属性名=类型转换器全限定名 例如: birthday=com.neusoft.utils.DateTypeConverter 其中:birthday是action属性名 – 全局类型转换器:所有Action都可以使用 • 注册方法:在classpath下建立名为xwork- conversion.properties的文件,内容如下: – 目标类型(全限定名)=类型转换器全限定名 例如: java.util.Date=com.neusoft.utils.DateTypeConverter 16 6.2.5 类型转换的流程 1、用户进行请求,根据请求名在struts.xml中寻找Action 2、在Action中,根据请求域中的名字去寻找对应的set方法。找 到后在赋值之前会检查这个属性有没有自定义的类型转换。没 有的话,按照默认进行转换;如果某个属性已经定义好类型转 换,则会去检查配置文件。 3、从文件中找到要转换的属性及其转换类。 4、进入转换类中,在此类中判断转换的方向。先进入从字符串 到类的转换。返回转换后的对象。 5、将返回的对象赋值给Action中的属性,执行Action中的 execute() 6、执行完execute()方法,根据struts.xml的配置转向页面 示例: struts2_06_typeconvert 17 第六章:类型转换 • 本章内容  6.1 类型转换概述  6.2 自定义转换器  6.3 高级类型转换 18 6.3.1 空值属性处理 • 如果属性声明为Collection或List,将自动创建ArrayList对象 • 如果属性声明为Map,将自动创建HashMap对象 • 如果属性是一个具有无参构造方法的bean,将使用ObjectFactory 的buildBean()方法创建bean的实例 19 6.3.2 类型转换错误处理 对于前面的转换器,如果用户在界面上输入一些格式不正确的数据。 如:当我们在页面上输入2009/1/1,而我们需要的日期格式是2009-01-01。 对于这种情况类型转换器中会因为类型不符合导致错误的发生。当发生了类 型转换错误后,Struts2会将转换错误放到ActionContext中一个名为 conversionErrors的Map对象中。在出现类型转换错误后,你可以选择是否 向用户提示转换错误。 在Struts2中有两个拦截器负责处理类型转换错误,如下: – com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor 此拦截器将conversionErrors Map中找到的所有错误都添加为 action的字段错误(需要实现ValidationAware接口,ActionSupport实 现了此接口)。 – org.apache.struts2.interceptor.StrutsConversionErrorInterceptor StrutsConversionErrorInterceptor只在字段值 不是null、不是””或 者${“”}(表示只有一个空字符串元素的字符串数组)的情况下,把转换 错误从ActionContext添加到action的字段错误。 注意: 在struts-default.xml文件中定义了conversionError拦截器,类 型是 StrutsConversionErrorInterceptor,这个拦截器已被包含在 defaultStack拦截器栈中。(当发生转换错误后,struts2会自动转找 input结果视图,所以需要在action的配置中添加input结果映射) 20 6.3.2 类型转换错误处理 • 总结一下:要向用户报告类型错误,需要实现下面三个步骤: 1、引用defaultStack拦截器栈(包含了conversionError拦截器) 2、让Action类从ActionSupport继承(实现了ValidationAware接 口) 3、为Action配置添加input结果映射 • 可以通过xwork.default.invalid.fieldvalue属性自定义错误消息 21 6.3.2 类型转换错误处理 • 输出错误信息可以使用fielderror标签来输出字段的错误信息。 • 当填写内容格式不正确时会在页面上出现Invalid field value for field “xxx.xxx”,很显然这不是我们想要的,我们自定义错误信息,步骤如下: – 1、在src下新建资源属性文件夹ApplicationResources.properties,并添加 下列内容:xwork.default.invalid.fieldvalue=字段”{0}”的值无效。 在输出类型转换错误消息时,占位符{0}将自动被字段名所替换。 – 2、编辑struts.xml文件,使用struts.custom.i18n.resources属性设置默 认的资源包,如下所示: – I18N消息键xwork.default.invalid.fieldvalue对所有字段的类型转换错误 都适用,如果你想为某个特定字段定制错误消息,则可以在Action相关 的资源文件中添加I18N消息键invalid.fieldvalue.xxx来指定错误消息, xxx是字段名称。资源文件的组织和加载顺序可以I18N章节。 例如: 在com. neusoft.action.LoginAction相应的包新建LoginAction.properties文 件,并添加下列内容:invalid.fieldvalue.user.birthday=无效字段值 或者在com.neusoft.vo.User相应的包中新建User.properties文件,并添加 下列内容:invalid.fieldvalue.birthday=无效字段值 22 本章小结 • 了解Struts2的内置类型转换 • 掌握编写自定义类型转换器的方式 • 会配置局部类型转换器和全局类型转换器 23
还剩22页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

hejinen

贡献于2014-04-15

下载需要 3 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf