struts2中的类型转换

转载 2012年03月25日 18:19:02

框架中常规的类型转换对我们而言是透明的,我们无需关心,一般来说我们所要做的是确保HTMLinput的命名能够在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/Integerfloat/Floatlong/Longdouble/Double

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

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

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

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

二.创建一个类型转换器

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

 

public class MyConverter extends StrutsTypeConverter {
publicObject convertFromString(Map context, String[] values, Class toClass){
       //定义如何将字符串转换为目标类型
    }
publicString 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_xxxElement_xxx来分别指定KeyValue的类型,xxx仍然用来指代我们的action或者对象中Map类型属性的名字。尽管Collection_xxx这种格式已经停止使用,但是目前仍然是支持的。下面看一个对Collection支持的例子。

首先创建一个模型beanMyBeanCollection中存放的都是这个类型的对像:

MyBean.java

public class MyBean implements Serializable {
    privateLong id;
    privateString name;
    publicLong getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    publicString getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    publicString 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;
    }
    publicString execute() throws Exception {
        return SUCCESS;
    }
}

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

MyBeanAction-conversion.properties

KeyProperty_beanList=id
Element_beanList=MyBean
CreateIfNull_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之类型转换

一、Struts2 类型转换介绍   类型转换:解析HTTP请求参数,将Http请求参数赋值给Action的属性;比如:         此处将名为nam...
  • xiazdong
  • xiazdong
  • 2012年02月02日 21:34
  • 8016

Struts2——基于StrutsTypeConverter的类型转换

简单来说 执行继承StrutsTypeConverter的类型转换时, 页面向后台传数据执行convertFromString(), 后台向前台传数据执行convertToString()类型转...
  • my13413527259
  • my13413527259
  • 2017年02月03日 16:26
  • 554

Struts2之类型转换中的错误

1. 处理类型转换错误 在Web的应用中,表现层主要涉及到数据校验和类型转换,这两个是紧密相关的。在实际中,只有通过了类型转换,下一步才会去实现数据上的校验。那么今天,笔者将向大家介绍关于Strut...
  • owen_william
  • owen_william
  • 2016年02月22日 23:40
  • 727

Struts2(二)局部与全局类型转换器

所谓类型转换器就是继承一个类DefaultTypeConverter,然后重写方法实现。应用类型转换器会有两种情况: 1、由请求参数的值转换成属性的值 2、使用struts2的标签,进行数据回显...
  • u011731233
  • u011731233
  • 2015年06月17日 18:14
  • 1554

深入理解Struts2----类型转换

之前的一系列文章主要介绍了有关Struts2的一些基本用法和部分的简单原理,但是始终没有介绍有关拦截器的相关内容,从本篇开始我们将从另一个角度去深入理解框架的使用,核心还是拦截器,但本篇首先来介绍下有...
  • qq_35326718
  • qq_35326718
  • 2017年05月17日 21:15
  • 386

struts2类型转换中的异常处理

在网页中的资源信息过于丰富,如果用户在填写表单时不按照要求的数据类型输入,就会导致页面异常。如:年龄输入框只能输入整数,而用户输入了字母,页面就应该提示出数据类型不符合。struts2提供了自带的异常...
  • fancheng614
  • fancheng614
  • 2017年07月10日 19:35
  • 143

【Struts2框架】第七节类型转换-类型转换原理和自定义类型转换器实例

1.类型转换原理 类型转换是struts拦截器来实现的。 类型转换的意思是能够把参数转换成action里面所需要的类型。 转换不了可以使用自己写的转换器(但几乎不用自己写)。 在struts的传参过...
  • u013517797
  • u013517797
  • 2015年07月30日 21:44
  • 2462

Struts2_类型转换错误消息的显示和定制

类型转换概述 从一个HTML表单到一个Action对象,类型转换是从字符串到非字符串 --HTTP没有“类型”的概念,每一项表单输入只可能是一个字符串或一个字符串数组。在服务器端,必须把Str...
  • Mrwuyi
  • Mrwuyi
  • 2016年05月25日 17:50
  • 1298

Struts2常用的常量配置

struts.locale:指定Web应用的默认Locale。默认的Locale是en_US。struts.i18n.encoding:指定Web应用的默认编码集。该常量对于处理中文请求参数非常有用。...
  • lzx_longyou
  • lzx_longyou
  • 2016年01月22日 13:21
  • 1649

struts2系列学习笔记(8)---------------类型转换的错误处理

由于用户输入的数据错误,而导致进行类型转换发生异常的情况时有发生.此时需进行类型转换的错误处理!类型转换的错误处理方法:(1)引用defaultStack拦截器栈 ----包如果继承自struts-d...
  • pony1001
  • pony1001
  • 2011年01月26日 10:08
  • 1078
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:struts2中的类型转换
举报原因:
原因补充:

(最多只允许输入30个字)