第3章 Struts 2的类型转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.2
Struts 2内置的类型转换器
• 类型转换是在页面与Action相互传递数据时发生的。 Struts2对于基本类型如int、long、float、double、 boolean以及char等(包括Date),已经做好了基本类型 转换。因此如果Action中包含基本类型属性(一定要有 getter和setter方法),在页面上只要包含对应此属性的 名称,Struts 2会自动进行类型转换。
清华大学出版社
3.5
集合属性的类型转换器
• 如果3.4节应用中goods属性不是使用字符串数组封装,而 是使用集合属性来处理,则修改后的Action代码如下: • 本节修改后的代码只需要将3.4节中对应的配置文件做简 单修改即可,JSP页面不需要做任何修改。实际上,List 对象和数组几乎可以互换使用。即使Action类里使用List 对象来封装请求参数的多个值,类型转换器也可以将字符 串数组转换成Goods数组(不需要修改类型转换器类)— —因为Struts 2默认支持数组和List之间的转换。
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.2
• • • • • • • • •
Struts 2内置的类型转换器
• Struts 2提供的内置类型转换,包括如下几种类型:
boolean和Boolean:完成String和布尔型之间的转换。 char和Character:完成String和字符型之间的转换。 int和Integer:完成String和整型之间的转换。 long和Long:完成String和长整型之间的转换。 float和Float:完成String和单精度浮点型之间的转换。 double和Double:完成String和双精度浮点型之间的转换。 Date:完成String和日期类型之间的转换,日期格式为用户请求本地的SHORT格式(如 :yy-mm-dd)。 数组(arrays):该类型在数据转换时,必须满足需要转换的数据中每一个元素都能 转换成数组的类型。 集合(collections):在使用集合类型转换器时,如果集合中的数据无法确定,可以 先将其封装到一个String类型的集合中,然后在用到某个元素时再进行手动转换。
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.4
数组属性的类型转换器
• 在3.3节中,一直只处理字符串数组的第一个数组元素— —请求参数是单个值,而不是一个字符串数组。实际上, 请求参数经常是字符串数组的情形,考虑到如图3.6所示 的输入页面。
无限挑战 无限飞翔
Struts 2框架应用教程
无限挑战 无限飞翔 Struts 2框架应用教程 清华大学出版社
3.3.3
实践环节
• 创建一个Web应用project333pratice,该应用具体实施步 骤如下: • 1.编写一个JSP页面input.jsp,该页面运行效果如图3.4 所示。
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.3
自定义类型转换器
• 当Struts 2内置的类型转换器不能满足需求时,开发者可 以开发自己的类型转换器。例如有个应用ch3希望用户在页面
上的表单输入信息来创建商品信息。当输入“苹果,10.58,200”时, 表示在程序中自动创建一个new Goods,并将“苹果”值自动赋值给 goodsname属性,将“10.58”值自动赋值给goodsprice属性,将 “200”值自动赋值给goodsnumber属性。
清华大学出版社
1.注册局部类型转换器
• 在Action所在的包中建立properties文件,文件命名格式为 ActionName-conversion.properties。ActionName是需要转换器生效 的Action的类名,后面的-conversion.properties是固定部分。 • 对于3.3节中的GoodsConvertAction类,应该提供的类型转换器 注册文件的文件名为:GoodsConvertAction-conversion.properties ,该文件是一个典型的properties文件,文件由key-value对组成。 文件内容为: • propertyName=类型转换器类 • ActionName-conversion.properties文件由多个 “propertyName=类型转换器类”项组成,其中propertyName是 Action中需要类型转换器转换的属性名,类型转换器类是开发者实现 的类型转换器的全限定类名(需要加包名)。
第 3章
Struts 2的类型转换
主要内容 类型转换的意义 Struts 2内置的类型转换器 自定义类型转换器
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.1
类型转换的意义
本节通过一个简单应用(JSP + Servlet)为示例来介绍 类型转换的意义。如图3.1所示的添加商品页面,该页面 用于收集用户输入的商品信息。商品信息包括:商品名称 (字符串类型String)、商品价格(双精度浮点类型 double)、商品数量(整数类型int)。 • 对于上面这个应用而言,开发者需要自己在Servlet中进 行类型转换,并将其封装成值对象。这些类型转换操作全 部手工完成,异常繁琐。 • 对于MVC框架而言,它必须将请求参数转换成值对象类里 各属性对应的数据类型——这就是类型转换的意义。
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.3.2
注册类型转换器
• 在Web应用中,注册类型转换器有两种常用方式: • 注册局部类型转换器:仅仅对某个Action的属性起作用。 • 注册全局类型转换器:所有Action的特定属性都会生效。
无限挑战 无限飞翔
Struts 2框架应用教程
• 想实现上述应用功能需要做以下4件事:
• • • • 需要一个POJO类Goods。 创建一个Action。 创建自定义类型转换器。 配置类型转换器。
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.3.1
• • • •
实现类型转换器
创建自定义类型转换器类,有三种方法: 实现ognl.TypeConverter接口 继承DefaultTypeConverter类 继承StrutsTypeConverter类
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.3.3
实践环节
• 2.编写POJO类User。 • 3.编写Action类,在Action类中,类型转换器会自动将请求过来的 值转换成User类型。 • 4.通过继承StrutsTypeConverter类的方式,编写自定义类型转换器 类UserConverter。 • 5.注册全局类型转换器。 • 6.配置Action。 • 7.编写用户信息输出页面showUser.jsp,页面效果如图3.5所示。
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
2.继承DefaultTypeConverter类
• DefaultTypeConverter类实现了TypeConverter接口,并 提供了一个简化的convertValue方法。 • public Object convertValue(Map context, Object value, Class toType) • convertValue方法负责完成类型的转换,这种转换是 双向的:当需要把字符串转换成Goods实例时,是通过该 方法实现的;当需要把Goods实例转换成字符串时,也是 通过该方法实现的。应用ch3的自定义类型转换器类 GoodsConverter1.java的代码如下:
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
3.继承StrutsTypeConverter类
• Struts 2提供了一个TypeConverter接口的默认实现类 StrutsTypeConverter。该实现类有两个抽象方法:public Object convertFromString(Map context, String[] values, Class toClass);public String convertToString(Map context, Object obj),在定义类型转换器必须被实现。 • convertFromString方法的功能是将一个或多个字符串值转换为指定 的类型。参数context是表示Action上下文的Map对象,参数values是 要转换的字符串值,参数toClass是要转换的目标类型。 • convertToString方法的功能是将指定的对象转换为字符串。参数 context是表示Action上下文的Map对象,参数obj是要转换的对象。 • 应用ch3的自定义类型转换器类GoodsConverter2.java的代码如下:
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
2.注册全局类型转换器
• 假设应用中有多个Action都包含了Goods类型的属性,如果多次重复 注册局部类型转换器,则将是很繁琐的事情。幸运的是Struts 2提供 了全局类型转换器,它对指定类型的全部属性有效。 • 注册全局类型转换器应该在classpath(src)下提供一个 xwork-conversion.properties文件,其内容由多个“目标类型=对应 类型转换器”项组成,其中“目标类型”指定需要完成类型转换的类 (全限定名),“对应类型转换器”指定类型转换的转换器类(全限 定名)。例如,指定model.Goods类的类型转换器为3.3.1节中的 converter. GoodsConverter2,则注册全局类型转换器的注册文件代 码如下: • model.Goods= converter.GoodsConverter2 • 一旦注册了上面的全局类型转换器,该全局类型转换器就会对 所有Goods类型属性起作用。
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出பைடு நூலகம்社
1.实现ognl.TypeConverter接口
• TypeConverter接口有一个接口方法: • public Object convertValue(Map context, Object target, Member member, String propertyName, • Object value, Class toType); • 实现ognl.TypeConverter接口创建自定义类型转换器 ,必须实现上述接口方法,不过该接口方法过于复杂,所 以OGNL项目还提供一个TypeConverter接口的实现类: DefaultTypeConverter,一般通过继承该类实现自己的类 型转换器。
相关文档
最新文档