`

《研磨struts2》第十一章 类型转换 之 11.2 内建类型转换器

 
阅读更多

11.2  内建类型转换器

Struts2内建的类型转换器能处理绝大多数的需求,只有极特殊情况才需要自定义类型转换器。在这一节中就一起来看看Struts2的内建类型转换器都可以完成哪些工作。

11.2.1简单类型

Struts2已经内置了基本数据类型及其包装类和其他一些常见的用于表示数字/日期类型的类型转换器,包括:

  • int/Integer:整数型
  • short/Short:短整数型
  • long/Long:长整型
  • float/Float:浮点型
  • double/Double:双精度型
  • boolean/Boolean:布尔型
  • byte/Byte:字节型
  • char/Character:字符型
  • BigInteger:大整数型
  • BigDecimal:大浮点数型
  • Date:日期型

11.2.2枚举类型

枚举类型往往被人们忽略,其实Struts2的Action中也可以直接使用枚举类型,其对应的参数值只需要对应枚举定义时的定义名即可。

       比如有如下的枚举定义,示例代码如下:

 

java代码:
  1. public enum ColorEnum {  
  2.     red,blue,green;  
  3. }  

在Action引用的时候,只需传入枚举的定义名(red,blue或green)即可,示例代码如下:

 

java代码:
  1. public class ConverterAction extends ActionSupport {  
  2.     private ColorEnum color;  
  3.     public ColorEnum getColor() {  
  4.         return color;  
  5.     }  
  6.     public void setColor(ColorEnum color) {  
  7.         this.color = color;  
  8.     }  
  9.       
  10.     public String execute() throws Exception {  
  11.         System.out.println("color="+color);  
  12.         System.out.println("传入的颜色是红色吗?答案是 :"+(color==ColorEnum.red));  
  13.         return SUCCESS;  
  14.     }  
  15. }  

其在struts.xml中的定义为:

 

java代码:
  1.  <package name="helloworld" extends="struts-default">  
  2.      <action name="converterAction" class="cn.javass.convert.ConverterAction">  
  3. <result>/converter/success.jsp</result>  
  4. lt;/action>  
  5.  </package>  

为了简单,就不去写页面了,直接通过URL来访问,使用get传参的方式,访问的URL为:“http://localhost:9080/helloworld/converterAction.action?color=red”,运行后,后台输出的结果为:

 

java代码:

可以看到,使用red作为参数将得到枚举中red的那个枚举值。

11.2.3复合类型

这里提到的复合类型与上一节的简单类型相比,并不是Action的属性的类型变得复杂了,而是操作属性的OGNL变得复杂了,其最终操作的无非还是上面的那些简单类型。

其实,这些东西在第四章的时候都已经提到过了,只不过是在这里再次归纳总结,让大家看到类型转换器的全貌。

1:JavaBean

       在Action中定义一个JavaBean属性,那么访问JavaBean中的某一个属性,需要使用Action中JavaBean的属性名.JavaBean中的属性名。

       比如有长方形这个JavaBean:

 

java代码:
  1. public class Rectangle {  
  2.     private int width;  
  3.     private int height;  
  4.       
  5.     public int getWidth() {  
  6.         return width;  
  7.     }  
  8.     public void setWidth(int width) {  
  9.         this.width = width;  
  10.     }  
  11.     public int getHeight() {  
  12.         return height;  
  13.     }  
  14.     public void setHeight(int height) {  
  15.         this.height = height;  
  16.     }  
  17. }  

在Action定义一个长方形类型的属性,并提供相应的getter/setter方法,示例代码如下:

 

java代码:
  1. public class ConverterAction extends ActionSupport {      
  2.     private Rectangle rectangle;  
  3.     public Rectangle getRectangle() {  
  4.         return rectangle;  
  5.     }  
  6.     public void setRectangle(Rectangle rectangle) {  
  7.         this.rectangle = rectangle;  
  8.     }  
  9.     //其它的就省略了  
  10. }  

需要在提交页面上用<s:textfield name=” rectangle.width”/>来引用Action的rectangle属性的width属性。就相当于调用这个Action的get Rectangle().setWidth()方法。

2:数组和List—简单属性

       使用数组和List及其相似,在提交页面上并无区别,在Action中也仅是声明的区别。比如在Action中需要得到提交页面提交的两组身高和体重的数据:

 

java代码:
  1. public class ConverterAction extends ActionSupport {      
  2.     private int heights[];  
  3.     private List<Integer> weights;  
  4.     public int[] getHeights() {  
  5.         return heights;  
  6.     }  
  7.     public void setHeights(int[] heights) {  
  8.         this.heights = heights;  
  9.     }  
  10.     public List<Integer> getWeights() {  
  11.         return weights;  
  12.     }  
  13.     public void setWeights(List<Integer> weights) {  
  14.         this.weights = weights;  
  15.     }  
  16.     //其它的就省略了  
  17. }  

对应的提交页面上需要添加:

 

java代码:
  1. <s:textfield name="heights"/>  
  2. <s:textfield name="heights"/>  
  3. <s:textfield name="weights[0]"/>  
  4. <s:textfield name="weights[1]"/>  

对应的提交页面上在<s:textfield>的name属性上写不写对应的索引都可以。Action都会正确的获取到用户的输入。

3:数组和List—JavaBean

       如果数组或List里面放的是JavaBean,大家不可以掉以轻心,在提交页面上的写法就不那么随便了。

       仍然使用上面长方形的JavaBean(里面有width和height两个属性)来做说明,在Action中需要接收一个长方形类型的数组,示例代码如下:

 

java代码:
  1. public class ConverterAction extends ActionSupport {      
  2.     private Rectangle[] rectangles;  
  3.     public Rectangle[] getRectangles() {  
  4.         return rectangles;  
  5.     }  
  6.     public void setRectangles(Rectangle[] rectangles) {  
  7.         this.rectangles = rectangles;  
  8.     }  
  9.     //其它的就省略了  
  10. }  

这个时候,如果在提交页面上不用索引:

 

java代码:
  1. <s:textfield name="rectangles.height"/>  
  2. <s:textfield name="rectangles.weight"/>  
  3. <s:textfield name="rectangles.height"/>  
  4. <s:textfield name="rectangles.weight"/>  

在Action中得到的就会是四个对象,Struts2并不会把第一个rectangles.height和第一个rectangles.weight凑成一对,放到一个对象里,而是把四个属性都分别放到自己的对象里。

       所以,这时候,必须写索引,示例代码如下:

 

java代码:
  1. <s:textfield name="rectangles[0].height"/>  
  2. <s:textfield name="rectangles[0].weight"/>  
  3. <s:textfield name="rectangles[1].height"/>  
  4. <s:textfield name="rectangles[1].weight"/>  

Action中才能正确的接到两个长方形的对象。

4:Map

       Map与数组及其类似,同样是用来存放多个“单体”数据,只不过数组用索引来区分不同的单体,而Map用Key来区分所有的单体。可以用“Map名[‘Key值’]”这样的OGNL来引用Map中的值。

       在Action中使用Map来存储多个长方形,多个长方形以Key区分:

 

java代码:
  1. public class ConverterAction extends ActionSupport {      
  2.     private Map<String, Rectangle> map;  
  3.     public Map<String, Rectangle> getMap() {  
  4.         return map;  
  5.     }  
  6.     public void setMap(Map<String, Rectangle> map) {  
  7.         this.map = map;  
  8.     }  
  9.     //其它的就省略了  
  10. }  

在提交页面上可以这么写:

 

java代码:
  1. <s:textfield name="map[‘first’].height"/>  
  2. <s:textfield name="map[‘first’].weight"/>  
  3. <s:textfield name="map[‘second’].height"/>  
  4. <s:textfield name="map[‘second’].weight"/>  

Action的map中。

5:小节

       这里看到了很多的复合类型:JavaBean、数组或List、Map,这些复合类型之间还可以结合使用。在前面就已经见到了JavaBean数组(Rectangle[] rectangles);Map里面有JavaBean(Map<String, Rectangle>)。反过来JavaBean里面有List或Map,甚至嵌套更多层都是可以的。

虽然看起来会很复杂,但只要牢牢掌握它们各自的访问方式,然后根据情况自由组合就可以了。基本的访问方式为:

分享到:
评论

相关推荐

    研磨Struts2

    - **默认转换器**:Struts2内置了一些常用的类型转换器。 - **自定义转换器**:如果内置转换器无法满足需求,可以通过实现TypeConverter接口来自定义转换器。 ### 知识点十一:国际化 #### 11.1 国际化的意义 ...

    研磨Struts2配书视频对应的演示源代码

    2. **拦截器(Interceptors)**:Struts2的核心之一是其拦截器机制,它们在Action执行前后执行一系列预定义或自定义的操作。这些拦截器可以用于登录验证、日志记录、性能监控等。源代码中可能包含了不同类型的拦截器...

    研磨struts2 高清版

    由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。

    研磨struts2

    2. **FilterDispatcher**:这是 Struts2 的核心组件之一,所有的请求都会经过此过滤器。它负责初始化 Struts2 的环境,并调用相应的 Action 处理器。 3. **ActionMapper**:根据请求的 URL 确定哪个 Action 类负责...

    《研磨Struts 2》PDF版本下载.txt

    相比于第一代Struts框架,Struts 2提供了更多的功能,如拦截器、动态方法调用、更强大的表单处理机制等,并且它与Spring和Hibernate等其他Java EE技术栈的集成更加紧密。 ### Struts 2的特点 1. **强大的表单处理...

    研磨struts2_系列文章.pdf

    从给定的文件信息来看,这是一份关于Struts2框架深入解析的系列文章,涵盖了Struts2的基础、架构、核心组件、高级特性等多个方面,旨在帮助读者全面掌握Struts2框架的应用与实践。以下是对该系列文章所涵盖的关键...

    研磨Struts2配书视频对应的PPT

    Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建高效、可扩展且易于维护的Web应用的工具和组件。《研磨Struts2》这本书是专门针对Struts2框架的学习...

    研磨Struts2 高清完整版.part2

    研磨Struts2 高清完整版,请和第一部分一起下载啊

    研磨struts

    11. **Interceptor**:拦截器是Struts2中的另一个重要特性,它们在Action执行前后插入,提供了日志、权限检查、事务控制等功能。拦截器链可以根据需要定制,提高了代码的复用性和可扩展性。 12. **其他重要知识**:...

    研磨Struts2_12859679_高清完整版.part2.rar

    研磨Struts2_12859679_高清完整版

    研磨Struts2-高清-完整目录-2011年10月

    研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人

    研磨设计模式(完整带书签).part2.pdf

    第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式...

    2020年九年级化学下册第十一单元盐化肥11.2化肥同步练习含解析新版新人教版20200403279

    8. **化肥的检验**:鉴别化肥时,Ba(OH)2溶液是一种有效的试剂,因为它可以和硫酸盐反应形成硫酸钡沉淀,与铵盐反应产生氨气,从而区分不同类型的化肥。 综上所述,本练习涵盖了化肥的分类、性质、鉴别方法、使用...

    研磨设计模式-part2

    第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式...

    研磨设计模式(完整带书签).part1.pdf

    第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式...

    研磨设计模式.part2(共4个)

    第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式...

Global site tag (gtag.js) - Google Analytics