Struts2学习:类型转换篇

翻译 2007年09月25日 10:49:00

框架中常规的类型转换对我们而言是透明的,我们无需关心,一般来说我们所要做的是确保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说明文档,很容易理解。下面是文档中给出的片段:

 

三.高级类型转换

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来分别指定KeyValue的类型,xxx仍然用来指代我们的action或者对象中Map类型属性的名字。尽管Collection_xxx这种格式已经停止使用,但是目前仍然是支持的。下面看一个对Collection支持的例子。

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

MyBean.java

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

MyBeanAction.java

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

MyBeanAction-conversion.properties

上面是一个类级别的类型转换配置文件,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之类型转换中的错误

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

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

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

五、Struts2之类型转换

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

Struts2——基于StrutsTypeConverter的类型转换

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

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

由于用户输入的数据错误,而导致进行类型转换发生异常的情况时有发生.此时需进行类型转换的错误处理!类型转换的错误处理方法:(1)引用defaultStack拦截器栈 ----包如果继承自struts-d...
  • pony1001
  • pony1001
  • 2011年01月26日 10:08
  • 1081

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

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

struts2的自定义类型转换和异常处理

action数据类型封装中自定义类型转换。
  • pseudonym_
  • pseudonym_
  • 2017年06月28日 02:54
  • 584

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

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

Struts2类型转换的作用

1、Struts2类型转换的作用   在Web应用中,页面提交请求的参数都是字符串类型的。但是在学习中,我们都是直接在Action中按照需要来定义属性的类型,比如private int age,也没...
  • guozehao520
  • guozehao520
  • 2014年08月20日 23:27
  • 598

Struts2框架基础篇

首先,要了解Struts2框架中参数传递的大体流程: 1.服务器端的Web容器收到用户的请求(URL)。 2.Struts2的核心控制器FilterDispatcher接受用户发起的请求,然后判断这...
  • weixin_36380516
  • weixin_36380516
  • 2017年05月04日 21:58
  • 609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Struts2学习:类型转换篇
举报原因:
原因补充:

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