- 浏览: 263393 次
- 来自: ...
文章分类
最新评论
-
zhangxin007:
CXF spring jaxws:endpoint jaxws:server 区别 与 关系 -
kashu1217:
請問一下您的代碼為什麼都貼二次?
struts2 异常处理 -
zhangzhimvp:
alert("1111");
struts 文件下载 -
zhangzhimvp:
引用
[img][/img][url][/url][img] ...
struts 文件下载 -
mousepc:
你好,我想问一下。如果Set集合是在另一个集合中的,没办法初始 ...
Struts2的类型转换器
转贴 http://aumy2008.iteye.com/blog/150202
一、概述
在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制。
Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单元素和其他GET/POET的参数)命名为合法的OGNL表达式,就可以充分利用Struts2的转换机制。
除此之外,Struts2提供了很好的扩展性,开发者可以非常简单的开发自己的类型转换器,完成字符串和自定义复合类型之间的转换。总之,Struts2的类型转换器提供了非常强大的表现层数据处理机制,开发者可以利用Struts2的类型转换机制来完成任意的类型转换。
二、实现自定义类型转换器
实现TypeCoverter接口,或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口),通过继承该实现类来实现自己的类型转换器。重写convertValue方法即可。
为了简化类型转换器的实现,Struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了方法,并提供了2个不同转换方向的方法:Object
convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。
三、注册应用
实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器。
关于类型转换器的注册方式,主要有3中:
A、注册局部类型转换器:仅仅对某个Action的属性起作用。
B、注册全局类型转换器:对所有Action的特定类型的属性都会生效。
C、使用JDK1.5的注释来注册类型转换器:通过注释方式来生成类型转换器。
1、局部类型转换器
提供如下格式的文件
文件名: ActionName-conversion.properties
内容:多个propertyName(属性名)=类型转换器类(含包名),如 date=com.aumy.DateConverter
存放位置:和ActionName类相同路径。
2、全局类型转换器
提供如下格式的文件
文件名: xwork-conversion.properties
内容: 多个“复合类型=对应类型转换器”项组成,如 java.Util.Date=com.aumy.DateConverter
存放位置:WEB-INF/classes/目录下。
为了让系统知道List里的元素类型,为了让系统的类型转换器起作用,有两种方法:
1、使用泛型来限制集合里元素的类型;eg:在Action类代码中关于user属性的泛型定义为:private List<user> user;
2、使用Struts2的配置文件:使用局部类型转换的配置文件来指定集合元素的数据类型。
为了在局部类型转换文件中指定集合元素的类型,应该在局部类型转换文件中增加如下的key-value对:
Element_xxx = 复合类型 (说明:key-value对中的Element是固定的,xxx是Action中的集合属性名,复合类型是集合元素类型的全限定数类名[应该增加完整的包前缀])
eg:Element_user = lee.User //指定Action类的user集合属性的元素为lee.User实例
下面先介绍一下局部类型转换器的注册,要注册类型转换吕只需提供文件名为如下格式的文件:
ActionName-conversion.properties:ActionName是需要转换器第一次的Action的类名,后面的-conversion.properties字符串则是固定部分。
eg:对于LoginAcion.java类,则应该提供的类型转换器注册文件的文件名为:LoginAction-conversion.properties,该文件由key-value对组成。文件内容为: propertyName=类型转换器类
LoginAction-conversion.properties文件应该与LoginAction.java文件放在相同路径下(如LoginAction.java的包为lee,则该文件也应放在包lee内)。
有几个要说明的地方,这时封装Set集合时必须要注意的:
1.CustomerInserterAction.java中对orders必须要初始化,如下所示:
private Set<Order> orders=new HashSet();
2.在jsp页面中给变量命名时必须要按照如下的格式:
<input name="orders.makeNew[0].orderNumber" type="text" size="10">
必须要使用makeNew运算符,这样ognl才能帮我创建新的对象,否则orders会为空。当时如果集合类型是List,就不必这样,直接name="orders[0].orderNumber"就可以了。
3.在Class-conversion.properties文件中加上KeyProperty_orders=id,这是封装Set时必须的。这个主要是用来设置检索集合中元素时的索引,具体含义:
也可以向WebWork传递元素的某个给定属性的值来获取集合中的唯一元素(element). 缺省情况下, 这个属性由 Class-conversion.properties中定义的KeyProperty_xxx=yyy决定, 这里的xxx是返回集合的JavaBean类型名称, yyy是我们用于索引集合中元素的属性名称.
MyAction.java
/**
* @return a Collection of Foo objects
*/
public Collection getFooCollection()
{
return foo;
}Foo.java
/**
* @return a unique identifier
*/
public Long getId()
{
return id;
}然后将 KeyProperty_fooCollection=id 放在MyAction-conversion.properties文件中. 这样就可以使用 fooCollection(someIdValue) 从集合fooCollection中获取id等于 someIdValue 的Foo对象. 例如, fooCollection(22) 将得到id值为22的Foo对象.
这一点十分有用, 因为这直接将一个集合中的元素与它的唯一标志符联系起来, 而不需要强制使用索引, 从而允许修改一个Bean的集合中的元素而不需要编写额外的代码. 例如, 值为 Phil 的参数 fooCollection(22).name 将集合fooClooection中id属性值为22的Foo对象的name属性设置为"Phil".
Webwork可以使用类型转换自动将参数的类型转换成key属性的类型.
与Map和List元素的属性不同, 如果fooCollection(22)不存在, WebWork不会创建新的对象. 想要做到这一点, 可以使用符号 fooCollection.makeNew[index], 在这里index是一个整数(0, 1等等). 因此, 参数 fooCollection.makeNew[0]=Phil 以及 fooCollection.makeNew[1]=John 将在fooCollection中添加两个新的Foo对象, 一个name属性值为Phil, 另一个为Bar. 注意, 不管用哪种方法, 在使用Set类型时, 必须定义对象的equals方法和hashCode方法来并保证他们不仅仅包含id属性. 这将导致id属性为null的元素可以从Set中删除.
一、概述
在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制。
Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单元素和其他GET/POET的参数)命名为合法的OGNL表达式,就可以充分利用Struts2的转换机制。
除此之外,Struts2提供了很好的扩展性,开发者可以非常简单的开发自己的类型转换器,完成字符串和自定义复合类型之间的转换。总之,Struts2的类型转换器提供了非常强大的表现层数据处理机制,开发者可以利用Struts2的类型转换机制来完成任意的类型转换。
二、实现自定义类型转换器
实现TypeCoverter接口,或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口),通过继承该实现类来实现自己的类型转换器。重写convertValue方法即可。
为了简化类型转换器的实现,Struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了方法,并提供了2个不同转换方向的方法:Object
convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。
三、注册应用
实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器。
关于类型转换器的注册方式,主要有3中:
A、注册局部类型转换器:仅仅对某个Action的属性起作用。
B、注册全局类型转换器:对所有Action的特定类型的属性都会生效。
C、使用JDK1.5的注释来注册类型转换器:通过注释方式来生成类型转换器。
1、局部类型转换器
提供如下格式的文件
文件名: ActionName-conversion.properties
内容:多个propertyName(属性名)=类型转换器类(含包名),如 date=com.aumy.DateConverter
存放位置:和ActionName类相同路径。
2、全局类型转换器
提供如下格式的文件
文件名: xwork-conversion.properties
内容: 多个“复合类型=对应类型转换器”项组成,如 java.Util.Date=com.aumy.DateConverter
存放位置:WEB-INF/classes/目录下。
为了让系统知道List里的元素类型,为了让系统的类型转换器起作用,有两种方法:
1、使用泛型来限制集合里元素的类型;eg:在Action类代码中关于user属性的泛型定义为:private List<user> user;
2、使用Struts2的配置文件:使用局部类型转换的配置文件来指定集合元素的数据类型。
为了在局部类型转换文件中指定集合元素的类型,应该在局部类型转换文件中增加如下的key-value对:
Element_xxx = 复合类型 (说明:key-value对中的Element是固定的,xxx是Action中的集合属性名,复合类型是集合元素类型的全限定数类名[应该增加完整的包前缀])
eg:Element_user = lee.User //指定Action类的user集合属性的元素为lee.User实例
下面先介绍一下局部类型转换器的注册,要注册类型转换吕只需提供文件名为如下格式的文件:
ActionName-conversion.properties:ActionName是需要转换器第一次的Action的类名,后面的-conversion.properties字符串则是固定部分。
eg:对于LoginAcion.java类,则应该提供的类型转换器注册文件的文件名为:LoginAction-conversion.properties,该文件由key-value对组成。文件内容为: propertyName=类型转换器类
LoginAction-conversion.properties文件应该与LoginAction.java文件放在相同路径下(如LoginAction.java的包为lee,则该文件也应放在包lee内)。
有几个要说明的地方,这时封装Set集合时必须要注意的:
1.CustomerInserterAction.java中对orders必须要初始化,如下所示:
private Set<Order> orders=new HashSet();
2.在jsp页面中给变量命名时必须要按照如下的格式:
<input name="orders.makeNew[0].orderNumber" type="text" size="10">
必须要使用makeNew运算符,这样ognl才能帮我创建新的对象,否则orders会为空。当时如果集合类型是List,就不必这样,直接name="orders[0].orderNumber"就可以了。
3.在Class-conversion.properties文件中加上KeyProperty_orders=id,这是封装Set时必须的。这个主要是用来设置检索集合中元素时的索引,具体含义:
也可以向WebWork传递元素的某个给定属性的值来获取集合中的唯一元素(element). 缺省情况下, 这个属性由 Class-conversion.properties中定义的KeyProperty_xxx=yyy决定, 这里的xxx是返回集合的JavaBean类型名称, yyy是我们用于索引集合中元素的属性名称.
MyAction.java
/**
* @return a Collection of Foo objects
*/
public Collection getFooCollection()
{
return foo;
}Foo.java
/**
* @return a unique identifier
*/
public Long getId()
{
return id;
}然后将 KeyProperty_fooCollection=id 放在MyAction-conversion.properties文件中. 这样就可以使用 fooCollection(someIdValue) 从集合fooCollection中获取id等于 someIdValue 的Foo对象. 例如, fooCollection(22) 将得到id值为22的Foo对象.
这一点十分有用, 因为这直接将一个集合中的元素与它的唯一标志符联系起来, 而不需要强制使用索引, 从而允许修改一个Bean的集合中的元素而不需要编写额外的代码. 例如, 值为 Phil 的参数 fooCollection(22).name 将集合fooClooection中id属性值为22的Foo对象的name属性设置为"Phil".
Webwork可以使用类型转换自动将参数的类型转换成key属性的类型.
与Map和List元素的属性不同, 如果fooCollection(22)不存在, WebWork不会创建新的对象. 想要做到这一点, 可以使用符号 fooCollection.makeNew[index], 在这里index是一个整数(0, 1等等). 因此, 参数 fooCollection.makeNew[0]=Phil 以及 fooCollection.makeNew[1]=John 将在fooCollection中添加两个新的Foo对象, 一个name属性值为Phil, 另一个为Bar. 注意, 不管用哪种方法, 在使用Set类型时, 必须定义对象的equals方法和hashCode方法来并保证他们不仅仅包含id属性. 这将导致id属性为null的元素可以从Set中删除.
评论
2 楼
mousepc
2011-09-24
你好,我想问一下。如果Set集合是在另一个集合中的,没办法初始化怎么办呢?
比如:private List<TrainingCourseClassAttendHistory> trainingCourseClassAttendHistory;在这个List集合中有Set<Xxx>集合,那第二个Set集合没办法初始化哦。
比如:private List<TrainingCourseClassAttendHistory> trainingCourseClassAttendHistory;在这个List集合中有Set<Xxx>集合,那第二个Set集合没办法初始化哦。
1 楼
phpxiaoxin
2009-01-14
很好,enum的时候用到了类型转换器
发表评论
-
Apache CXF开发Web Service 理解CXF Frontends之Code-First
2013-03-05 17:28 0CXF目前是 apache下面的一个顶级开源项目, C ... -
Hibernate和IBatis对比
2013-03-05 11:11 3200iBATIS数据映射器iBATIS被广泛认为是最简单的一种持 ... -
Hibernate二级缓存详解
2013-03-05 09:53 945Hibernate二级缓存详解 与Session相对的是, ... -
Struts 2 Hibernate Validation Tutorial
2013-03-01 15:40 1640The Hibernator Validator frame ... -
SiteMesh 过滤不装饰的页面
2013-03-01 11:49 6186要实现SiteMesh过滤不装饰页面,需要做两方面的设置1、 ... -
SiteMesh 2.X版本的简单使用
2013-03-01 11:28 1623SiteMesh 2.X版本的简单使用 1. ... -
Hibernate抓取策略以及如何避免cannot simultaneously fetch multiple bags异常
2013-02-28 16:28 1093在说解决cannot simultaneously fetc ... -
Struts2 json 不熟悉序列号 @JSON(serialize=false)
2013-02-26 16:22 1406JSON注释还支持如下几个域:name:指定Action属 ... -
Struts2 json 不熟悉序列号 @JSON(serialize=false)
2013-02-26 16:22 1052避免使用get开头的action方法 在属性get方法上面加 ... -
struts2学习:配置篇之namespace
2013-02-26 11:34 733把namespace单独拉出来讲一方面是因为它实际上不是一个 ... -
Struts2.1.6 部署 jboss6.0 报错
2013-02-21 10:58 9312010-03-01 22:43:52,546 ERROR ... -
MyEclipse反向工程异常解决(转)
2012-09-11 11:28 742http://www.cnblogs.com/zhaozhi- ... -
DynamicMethodInvocation 动态方法调用
2009-07-24 16:06 2059<constant name="struts. ... -
struts2 必须的6个包
2009-07-23 17:42 857commons-logging-1.0.4.jarfr ... -
struts1.2 spring 集成
2008-07-23 14:41 3912转载IBM上一篇文章:http://www.ibm.com/d ... -
struts2 拦截器
2008-07-21 16:43 1620转载于:http://blog.csdn.net/feng_s ... -
struts 文件下载
2008-07-21 15:56 3697最近用到了struts2的文件下载,找了些网上关于下载的文章, ... -
struts2 异常处理
2008-07-17 12:23 8292在学习struts2的过程中,想到了struts1的错误处理机 ... -
struts2 学习拾遗
2008-07-17 10:50 1624学习strut2过程中,碰到一些问题,找了一些文章,转载如下: ... -
struts 多模块开发
2008-07-15 14:58 1328struts1.1开始支持多模块的. 多模块开发是为了解决 ...
相关推荐
NULL 博文链接:https://cdxs2.iteye.com/blog/1931878
配合博文:http://blog.csdn.net/u011638419/article/details/41276445
这是一个struts2的类型转换器的案例,主要是写的如果将一个20110202这种类型的日期格式进行转换!
对于Struts1和Struts2中都讲到了自定义类型转换器。但是有些人可能对自定义类型转换器的运行原理不理解,这里进行简单介绍一下……
服务器可以接收到的来自用户的数据只能是字符串或者是字符串数组,而在服务器上的对象中 ,这些数据往往有多种不同的类型,如日期(Date) 整数(int) 浮点数... 要实现 上述的转换 ,Struts2中 提供了 converter。
使用struts2提供的转化器,实现Date类型的数据转换
这是一个关于struts2的类型转换 以及 拦截器 还有校验的例子
NULL 博文链接:https://takeme.iteye.com/blog/1662273
对于基本数据类型 strus2可以自动的将其转换成所需要的类型,但是我们自己定义的引用数据类型无法转换,本文详细介绍了strus2的自定义类型转换器
struts 2.0 自定义类型转换器 注册类型转换器 入门实例 简单实例
软件硕士张龙老师,对Struts2类型转换器的说明源代码,以及批量插入数据的源代码,不改动任何代码的情况下进行类型转换。
NULL 博文链接:https://hanazawakana.iteye.com/blog/1681564
(1) 编写一个自定义类型转换器,并基于应用程序进行全局配置,实现字符串参数与颜色值之间的转换,并将颜色值应用于视图当中。 (2) 根据实验四的图书管理系统,扩展图书新增功能,要求对新增页面表单中的每个...
传智播客struts2.1源代码_自定义类型转换器
struts2的类型转换器授课教案和例子源码 课时两课时 详细列举转换器的知识点 java培训学校的真实教案
可以详细了解struts2的流程,便于学习和研究struts2,大家可以交流学习。
struts2(时间日期类型转换器) 简洁 易懂
myeclipse平台下使用struts2.3框架搭建实例,理解struts2工作原理,了解struts2自定义类型转换,自定义拦截器,掌握struts2的mvc框架应用
1、 理解Struts2的类型转换类型 2、 理解局部类型转换器与全局类型转换器的区别 3、 掌握Struts2的自定义类型转换 4、 理解OGNL表达式语言