第六章 类型转换_第1页
第六章 类型转换_第2页
第六章 类型转换_第3页
第六章 类型转换_第4页
第六章 类型转换_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1类型转换类型转换2课程结构课程结构内容内容课时(课时(H H)第一章:第一章:Struts2Struts2入门入门3 3第二章:第二章:Struts2Struts2中的中的ActionAction6第三章:第三章:Struts2Struts2拦截器拦截器3第四章:表达式语言第四章:表达式语言OGNLOGNL3第五章:第五章:Struts2Struts2标签库标签库3第六章:类型转换第六章:类型转换3第七章:国际化第七章:国际化3第八章:文件上传和下载第八章:文件上传和下载3第九章:校验框架第九章:校验框架33第六章:类型转换第六章:类型转换目标目标:本章旨在向学员介绍:本章旨在向学员介绍:1

2、)类型转换的概念)类型转换的概念2)Struts2内置的类型转换内置的类型转换3)创建自定义类型转换器)创建自定义类型转换器4)局部类型转换器的配置)局部类型转换器的配置5)全局类型转换器的配置)全局类型转换器的配置时间:时间:3学时学时教学方法:授课教学方法:授课+练习练习4第六章:类型转换第六章:类型转换本章内容本章内容6.1 类型转换概述类型转换概述6.2 自定义转换器6.3 高级类型转换56.1.1 类型转换的原因类型转换的原因客户端浏览器只能将字符串传送到服务器(文件上传除外),而服务器端java语言是强类型语言,数据类型非常丰富,这就造成B/S两端的类型不兼容问题.传统做法:将客户

3、端数据转变成intint v = Integer.parseInt(request.getParameter(“user”);缺陷:过程烦琐枯燥.66.1.2 类型转换的概念类型转换的概念所有页面与控制器传递的数据均为String类型,而我们在对其进行处理时可能会用到各种数据类型,程序无法自动完成数据类型的转换,需要我们在代码中手动完成,这个过程称为类型这个过程称为类型转换。转换。76.1.3 Struts2的内置类型转换器的内置类型转换器Struts2提供了强有力的表现层类型转换机制,无需程序员过多干预即可自动完成转换.Struts能自动处理类型转换过程中出现的未知异常.Struts 2提供

4、的自动类型转换,包括如下几种类型:boolean和和Boolean:完成:完成String和布尔型之间的转换。和布尔型之间的转换。char和和Character:完成:完成String和字符型之间的转换。和字符型之间的转换。int和和Integer:完成:完成String和整型之间的转换。和整型之间的转换。long和和Long:完成:完成String和长整型之间的转换。和长整型之间的转换。float和和Float:完成:完成String和单精度浮点型之间的转换。和单精度浮点型之间的转换。double和和Double:完成:完成String和双精度浮点型之间的转换。和双精度浮点型之间的转换。Da

5、te:完成:完成String和日期类型之间的转换,日期格式为用户请求本地的和日期类型之间的转换,日期格式为用户请求本地的SHORT格式。格式。数组:该类型在数据转换时,必须满足需要转换的数据中每一个元素都能转换成数组的类数组:该类型在数据转换时,必须满足需要转换的数据中每一个元素都能转换成数组的类型。但若程序员自定义类型转换器,则要根据情况判断。型。但若程序员自定义类型转换器,则要根据情况判断。集合:在使用集合类型转换器时,如果集合中的数据无法确定,可以先将其封装到一个集合:在使用集合类型转换器时,如果集合中的数据无法确定,可以先将其封装到一个String类型的集合中,然后在用到某个元素时再进

6、行手动转换。类型的集合中,然后在用到某个元素时再进行手动转换。类型转换是在页面与类型转换是在页面与Action相互传递数据时发生的。相互传递数据时发生的。86.1.4内置类型转换器对集合的支持内置类型转换器对集合的支持对List集合的支持:对Map集合的支持:private ArrayList list;private HashMap map;或或9第六章:类型转换第六章:类型转换本章内容本章内容6.1 类型转换概述6.2 自定义转换器自定义转换器6.3 高级类型转换106.2.1 创建自定义类型转换器创建自定义类型转换器当Struts2内置的转换器不能满足你的应用需求,你可以开发自己的类型转

7、换器。三种方法可以创建自定义类型转换器:实现ognl.TypeConverter接口继承DefaultTypeConverter类继承StrutsTypeConverter类116.2.1 创建自定义类型转换器创建自定义类型转换器TypeConverter接口中只有一个方法convertValue,该方法过于复杂,所以我们一般使用DefaultTypeConverter类,该类实现了TypeConverter接口,并提供了一个简化的convertValue()方法。参数context是表示OGNL上下文的Map对象,target是需要转换的对象,toType是要转换的目标类型。public O

8、bject convertValue(Map context, Object target, Member member, String propertyName,Object value, Class toType)public Object convertValue(Map context, Object target, Class toType)126.2.1 创建自定义类型转换器创建自定义类型转换器除了可以继承OGNL中的DefaultTypeConverter类外,还可以继承struts2中给出的org.apache.struts2.util.StrutsTypeConverter抽

9、象类。StrutsTypeConverter继承自ognl.DefaultTypeConverter类,它提供了两个抽象的方法用于字符串和其它类型的相互转换。这两个方法如下所示:public Object convertFromString(Map context, String values, Class toClass)说明:将一个或多个字符串值转换为指定的类型。参数context是表示action上下文的Map对象,参数values是要转换的字符串值,参数toClass是要转换的目标类型。public String convertToString(Map context, Object

10、obj) 说明:将指定的对象转换为字符串。参数context是表示action上下文的Map对象。参数obj是要转换的对象。136.2.2 编写类型转换器编写类型转换器继承继承 DefaultTypeConverter类类public class DateTypeConverter extends DefaultTypeConverter Override public Object convertValue(Map context, Object value, Class toType) SimpleDateFormat dateFormat = new SimpleDateFormat(y

11、yyyMMdd);try if(toType = Date.class)/当字符串向当字符串向Date类型转换时类型转换时String params = (String) value;/Request.getParameterValues() return dateFormat.parse(params0);else if(toType = String.class)/当当Date转换成字符串时转换成字符串时Date date = (Date) value;return dateFormat.format(date); catch (ParseException e) return super

12、.convertValue(context, value, toType);146.2.3 编写类型转换器编写类型转换器继承继承 StrutsTypeConverter类类public class DateTypeConverter extends StrutsTypeConverter private static SimpleDateFormat sf=new SimpleDateFormat(“yyyyMMdd”); public Object convertFromString(Map context,String values,Class toClass)try return sf.

13、parse(values0); /使用指定的日期格式解析字符串值,返回使用指定的日期格式解析字符串值,返回date对象对象 catch(Exception k) public String convertToString(Map context,Object obj) return sf.format(obj); 156.2.4 配置类型转换器配置类型转换器在struts2中提供了两种方式来配置转换器,一种是应用于全局范围的类型转换器, 另一种是应用于特定类的类型转换器。注册自定义类型转换器有两种方法特定类型转换器:只有特定的Action才可以使用注册方法:在Action所在的包中建立prop

14、erties文件,文件名格式:Action类名-perties,内容如下:要转换的Action类的属性名=类型转换器全限定名 例如: birthday=com.neusoftconverter.DateTypeConverter 其中:birthday是action属性名全局类型转换器:所有Action都可以使用注册方法:在classpath下建立名为perties的文件,内容如下:目标类型(全限定名)=类型转换器全限定名 例如: Java.util.Date=com.neusoft.converter.DateTypeCon

15、verter166.2.5 类型转换的流程类型转换的流程1、用户进行请求,根据请求名在struts.xml中寻找Action 2、在Action中,根据请求域中的名字去寻找对应的set方法。找到后在赋值之前会检查这个属性有没有自定义的类型转换。没有的话,按照默认进行转换;如果某个属性已经定义好类型转换,则会去检查配置文件。 3、从文件中找到要转换的属性及其转换类。 4、进入转换类中,在此类中判断转换的方向。先进入从字符串到类的转换。返回转换后的对象。 5、将返回的对象赋值给Action中的属性,执行Action中的execute() 6、执行完execute()方法,根据struts.xml的

16、配置转向页面17第六章:类型转换第六章:类型转换本章内容本章内容6.1 类型转换概述6.2 自定义转换器6.3 高级类型转换高级类型转换186.3.1 空值属性处理空值属性处理如果属性声明为Collection或List,将自动创建ArrayList对象如果属性声明为Map,将自动创建HashMap对象如果属性是一个具有无参构造方法的bean,将使用ObjectFactory的buildBean()方法创建bean的实例196.3.2 类型转换错误处理类型转换错误处理对于前面的转换器,如果用户在界面上输入一些格式不正确的数据。如:当我们在页面上输入2009/1/1,而我们需要的日期格式是200

17、9-1-1。对于这种情况类型转换器中会因为类型不符合导致错误的发生。当发生了类型转换错误后,Struts2会将转换错误放到ActionContext中一个名为conversionErrors的Map对象中。在出现类型转换错误后,你可以选择是否向用户提示转换错误。 在Struts2中有两个拦截器负责处理类型转换错误,如下:erceptor.ConversionErrorInterceptor 此拦截器将conversionErrors Map中找到的所有错误都添加为action的字段错误(需要实现ValidationAware接口,Actio

18、nSupport实现了此接口)。erceptor.StrutsConversionErrorInterceptor StrutsConversionErrorInterceptor只在字段值 不是null、不是”或者$“”(表示只有一个空字符串元素的字符串数组)的情况下,把转换错误从ActionContext添加到action的字段错误。注意: 在struts-default.xml文件中定义了conversionError拦截器,类型是 StrutsConversionErrorInterceptor,这个拦截器已被包含在 defaultStack

19、拦截器栈中。(当发生转换错误后,struts2会自动转找input结果视图,所以需要在action的配置中添加input结果映射)206.3.2 类型转换错误处理类型转换错误处理总结一下:要向用户报告类型错误,需要实现下面三个步骤: 1、引用defaultStack拦截器栈(包含了conversionError拦截器) 2、让Action类从ActionSupport继承(实现了ValidationAware接口) 3、为Action配置添加input结果映射可以通过xwork.default.invalid.fieldvalue属性自定义错误消息216.3.2 类型转换错误处理类型转换错误处理输出错误信息可以使用fielderror标签来输出字段的错误信息。当填写内容格式不正确时会在页面上出现Invalid field value for field “xxx.xx

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论