`

Struts2学习:类型转换

阅读更多
框架中常规的类型转换对我们而言是透明的,我们无需关心,一般来说我们所要做的是确保HTML中input的命名能够在OGNL表达式中使用。在HTML中,并没有数据类型的概念,任何数据都被当做字符串或者字符串数组来传递。Struts2为我们提供了一些内建的类型转换,譬如说基本类型之间的转换、”1984-08-27”格式的字符串能够被正确的转换为Date类型等等。但是这些内建的类型转换有时并不能满足我们的需求,比方说,我们希望用户输入”3,32”格式的坐标字符串时,Struts2能帮我们把这个String类型转化成Point类型,这个时候我们就需要自定义一个类型转换器。具体来说,整个过程可以分为两个步骤:

1.定义一个类型转换类,需实现ognl.TypeConverter接口(文档中无具体实例)

2.给需要进行转换的类或属性指定类型转换器

上述第2步需要用到配置文件,根据作用域的不同可以将配置文件分为两种:类级别和全局级别。

1.类级别配置               

假设我是在MyAction这个action中要对它的Point类型的属性point进行转化,那么我就需要创建一个名字为MyAction-conversion.properties文件,内容如下:

point=com.acme.PointConverter

注意,等号右边的内容应该是我们所定义的类型转化器,这里我们只是给出了一个样例,并没有真正创建这个类型转换类。另外局部类型转换配置文件遵循如下的命名规则:ClassName-conversion.properties

2.全局级别配置

在classpath的根目录下创建一个xwork-conversion.properties文件,加入如下内容:

com.acme.Point = com.acme.PointConverter

前后两种配置,等候右边的内容是一样的,只是左右稍微不同。类级别时,左边是类中需进行类型转换的属性的名称;全局级别时,左边是需进行类型转化的类型的全名。

一.内建的类型转换支持

XWork能够自动的为我们处理大多数常见的类型转换,它能帮我们把字符串转换为下面的任意一种类型,也能把下面任意一个类型转换为字符串。这些类型如下所示:

●      String

●      boolean/ Boolean

●      char/Character

●      int/Integer,float/Float,long/Long,double/Double

●      dates----使用当前时区的SHORT格式

●      arrays-----假设每个单独的字符串都能转换成数组中元素的类型

●      collections-----如果不能确定集合中元素的类型,会默认是String类型,并创建一个新的ArrayList对象

    对数组进行转换时,会顺延至对数组中的每个元素进行转换。和所有其它的类型转换一样,如果转换无法完成需要使用一个标准的类型转换错误报告来表明处理类型转换时发生了问题。

二.创建一个类型转换器

文档中没有给出具体的实例,只是给我们介绍了一个用于编写类型转换的帮助类。这个类是org.apache.struts.action2.util.StrutsTypeConverter,它能帮助我们方便的编写一个类型转换器。这个类提供了两个抽象方法,以便我们将目标类型转换为String或者将String转换为目标类型。这两个方法是convertFromString和convertToString,关于它们的使用可以参考Struts2自带的API说明文档,很容易理解。下面是文档中给出的片段:

public class MyConverter extends StrutsTypeConverter { public Object convertFromString(Map context, String[] values, Class toClass){       //定义如何将字符串转换为目标类型    } public String convertToString(Map context, Object o) {       //定义如何将目标类型转换为字符串    } }


三.高级类型转换

1.处理null属性访问

如果action上下文中的#CREATE_NULL_OBJECTS被指定为true,那么当OGNL表达式遇到空指针异常时,表达式会暂时停止计算(evaluate),系统会自动尝试创建一个新的对象来解决这个空指针问题。#CREATE_NULL_OBJECTS的值只能够在ParametersInterceptor的执行过程中被指定。处理null属性有如下一些规则:

●      当属性被声明为Collection或者List时,返回一个ArrayList对象来赋给空的reference

●      当属性声明为Map时,返回一个HashMap对象赋给空的reference

●      当属性声明为一个简单带有无参数构造方法的javabean时,调用无参数的构造方法生成这个javabean的实例赋给空的reference

2.对集合(Collection)与Map的支持

Struts2框架支持多种方式来发现(discover)集合中元素的类型,这个发现(discover)是通过ObjectTypeDeterminer类来完成的,框架提供了这个类的默认实现。ObjectTypeDeterminer类会查看ClassName-conversion.properties文件来得知Collection或者Map中存放的是什么对象。对Collection而言,比如List,元素是通过Element_xxx格式来指定的,xxx用来指代我们的action或者对象中Collection类型属性的名字。对于Map而言,则需通过Key_xxx和 Element_xxx来分别指定Key和Value的类型,xxx仍然用来指代我们的action或者对象中Map类型属性的名字。尽管Collection_xxx这种格式已经停止使用,但是目前仍然是支持的。下面看一个对Collection支持的例子。

首先创建一个模型bean:MyBean,Collection中存放的都是这个类型的对像:
public class MyBean implements Serializable {    private Long id;    private String name;    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String toString() {        return "MyBean{" +                "id=" + id +                ", name='" + name + '\'' +                '}';    }}


这个类很简单:一个id用于唯一标识一个对象,一个name属性。

MyBeanAction.java:

public class MyBeanAction implements Action {    private List beanList = new ArrayList();    private Map beanMap = new HashMap();    public List getBeanList() {        return beanList;    }    public void setBeanList(List beanList) {        this.beanList = beanList;    }    public Map getBeanMap() {        return beanMap;    }    public void setBeanMap(Map beanMap) {        this.beanMap = beanMap;    }    public String execute() throws Exception {        return SUCCESS;    }}

这个类中有一个Collection类型的属性beanList,它是一个MyBean类型对象的集合。

MyBeanAction-conversion.properties:

KeyProperty_beanList=idElement_beanList=MyBeanCreateIfNull_beanList=true

上面是一个类级别的类型转换配置文件,Element_beanList=Mybean告诉Struts2框架我们这里指定的不是一个类型转换器,而是指定了集合类型的属性beanList包含的是类型为Mybean的对象。至于KeyProperty_beanList=id则是告诉我们beanList中的对象使用它们的id属性来作为identifier,相当于给这个集合加了一个索引,便于我们查找。

通过这样的设置后我们可以在页面上一次性提交若干个Mybean对象,实现批量保存的效果。譬如前台的html页面就可以这样写:

<input type=”text” name=”beanList[0].name”>

<input type=”text” name=”beanList[1].name”>

<input type=”text” name=”beanList[2].name”>

<input type=”text” name=”beanList[3].name”>

这样当我们提交页面到action中后,Struts2框架会自动为我们在beanList集合中放置好了四个Mybean类型的对象,并且名字是我们在页面中输入的值,尤其是当Myben类有很多属性的时候这个功能特别好用,可以方便的实现数据的批量保存。

分享到:
评论

相关推荐

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts2简单实例(类型转换)

    在这个"struts2简单实例(类型转换)"中,我们将探讨Struts2如何处理不同类型的数据转换,以及如何创建一个简单的演示应用。 首先,让我们理解什么是类型转换。在Web应用程序中,用户通过表单提交的数据通常是字符...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    struts2数据类型转换器

    这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...

    struts2简单实例(类型转换方法对比)

    本实例主要探讨了在Struts2中进行类型转换的三种方法:局部类型转换、全局类型转换以及大量数据类型的转换。对于初学者来说,理解并掌握这些转换方式至关重要,因为它们能够帮助我们处理用户输入的数据,并将其转化...

    Struts2类型转换(一)----常规类型,自定义类型,错误处理

    Struts2是一个强大的MVC框架,它在处理Web应用程序时提供了许多便利,其中包括类型转换功能。类型转换是将用户输入的数据自动转化为服务器端处理所需的类型,这样可以避免手动转换带来的繁琐工作。本篇文章将深入...

    struts2学习笔记四(第4讲.Struts2的类型转换续)

    在"Struts2学习笔记四(第4讲.Struts2的类型转换续)"中,我们将会深入探讨Struts2中的类型转换机制,这是一个核心特性,用于处理Action类属性与HTTP请求参数之间的数据类型转换。 在HTTP请求中,数据通常是字符串...

    struts2注册转换器

    Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java Web开发中。...这个案例提供了一个很好的学习点,帮助开发者更好地理解和利用Struts2框架的类型转换机制,提高代码的健壮性和可维护性。

    struts2 学习重点笔记

    - **优势**:使用 Struts2 可以显著提高开发效率,因为它能够处理很多基础任务,如数据接收、类型转换、验证等。 **1.2 Struts2 架构** - **MVC 架构**:Struts2 采用经典的 MVC 架构,分为模型(Model)、视图(View)...

    struts2的类型转换器授课教案和例子源码

    通过这两课时的学习,你应该能够熟练掌握Struts2类型转换器的使用,并能根据业务需求自定义自己的转换器。这些知识对于进行Java web开发,特别是使用Struts2框架的工作来说,是非常关键的。理解并运用好类型转换器,...

    第2讲 --Struts2的类型转换

    本讲将深入探讨Struts2的类型转换机制及其在实际开发中的应用。 首先,我们理解一下为什么需要类型转换。在HTTP请求中,所有的数据都是以字符串形式传递的。例如,用户通过表单提交的数据,服务器接收到的都是字符...

    struts2(1-7)源码 struts2学习入门 源码学习

    struts2 将要进行自定义类型转换的点数据从1个增加到3个 struts3 进行全局的类型转换 struts4 使用Struts2中内部类中的方法进行自定义类型转换,用到的类StrutsTypeConverter struts5 增加集合类型,使用范型 ...

    struts2学习心得

    9. **全局类型转换配置**:为了统一管理不同类型转换的规则,Struts2允许在`struts.xml`配置文件或`xwork-conversion.properties`文件中定义全局的类型转换策略,从而避免在每个Action中重复配置相同的转换规则。...

    struts2类型转换深入总结

    这篇博文深入探讨了Struts2中的类型转换机制,通过分析源码和使用工具,帮助开发者更好地理解和应用这一特性。 在Struts2中,类型转换主要由`ValueStack`和`TypeConverter`接口负责。`ValueStack`是一个对象栈,它...

    struts2 全局类型转换器.rar

    通过这个压缩包,开发者可以学习到如何自定义Struts2的类型转换器,提高应用的灵活性和可维护性。同时,结合博文链接(https://llxhna.iteye.com/blog/1067851)可能会提供更深入的讲解和示例代码,帮助理解并实践这...

    struts2自定义类型转换、拦截器实例练习

    本实例练习旨在帮助你深入理解Struts2的工作原理,特别是自定义类型转换和拦截器的使用。 首先,让我们详细探讨Struts2的MVC架构。在MVC模式中,Model代表业务逻辑,View负责展示数据,而Controller则是两者之间的...

    struts2中文学习文档

    WebWork在被Struts2吸收之前,已经具备了许多先进的特性,如动态类型转换、拦截器和结果类型等。这些特性后来都被融入到了Struts2中,使得Struts2不仅继承了WebWork的优点,还在此基础上进行了改进和扩展,成为了...

    struts2学习笔记

    5. **类型转换与输入校验**:Struts2在类型转换过程中也会进行基本的校验,如检查非空、数值范围等。 **四.Struts2的核心:拦截器** 拦截器是Struts2的核心组件,它们在Action执行前后介入处理流程。拦截器可以...

    struts2 转换器

    在实际应用中,Struts2转换器不仅可以处理简单的类型转换,还能进行数据验证。例如,你可以在转换器中检查日期是否符合特定格式,或者数值是否在指定范围内。这样,你可以在数据到达业务逻辑之前就捕获并处理潜在的...

    Struts2之类型转换器的使用案例struts002

    通过学习这个案例,开发者可以更好地理解和掌握Struts2类型转换器的使用,从而提高应用程序的灵活性和可维护性。 总的来说,Struts2的类型转换器机制为处理复杂数据类型提供了便利,使得我们可以根据需求自由定制...

Global site tag (gtag.js) - Google Analytics