1.Overview
类型转化在struts2中的主要作用是把页面上符合ognl定义的控件的名字的输入值映射到action的相应字段中.以删除在servlet时代需要经常做的request.getParameter操作,并且利用ognl表达式甚至可以直接把页面上字段的值直接注入到action声明的对象中,是这个过程能够自动化,使得代码更加的简洁,更OO,可以说hibernate是处理对象到数据库的双向转化,struts2就是处理对象到html页面的双向转化.
2.Working Sample
[list]
[*]Action以及字段级别的类型转化
在action对应的目录下定义ActionClassName-conversion.properties
point = com.acme.PointConverter
[*]全局以及类级别的类型转化
xwork-conversion.properties在classpath
com.acme.Point = com.acme.PointConverter
[*]PointConverter必须实现TypeConverter或者直接继承StrutsTypeConverter类.
并且实现如下的双向转化
该接口中还有个performFallbackConversion 方法,用来实现转化失败后的一些必要的操作.
当转化出现错误的时候需要抛出 XWorkException或者TypeConversionException以便struts2可以捕获该异常.
[/list]
3.Built in Type Conversion Support(内建的转化)
String
boolean / Boolean
char / Character
int / Integer, float / Float, long / Long, double / Double
dates
arrays 数组数据可以单个转化数据
collections 如果不能确定collection中的元素的类型,默认传见一个String的ArrayList.
4.Relationship to Parameter Names
类型转化的最佳利用方式是直接在页面上定义user.name这样就能把input的数据直接注入到action.getUser().setName()方法中.
[list]
[*]Use complex OGNL expressions--struts2能够自动处理对象的创建,而不用手工的创建嵌套对象.
[*]Ognl语法支持创建带有不带参数构造函数的对象.
[*]user.name会调用getUser().setName()但是如果user为空,那么action还必须具有setUser方法.
[*]For lists and maps, use index notation, such as people[0].name or friends['patrick'].name.
[*]对于多选框,如果定义问people.name 则系统会自动传见多个person对象并且注入name属性.
[/list]
5.Creating a Type Converter
继承StrutsTypeConverter类,实现to,from双向转化操作并且通过ActionClassName-conversion.properties或者全局xwork-conversion.properties中加载改converter即可.
6.Advanced Type Conversion(高级类型转化)
[list]
[*]Null Property Handling(空指针处理)--自动对象嵌套关系创建.
实现规则
当ognl抛出空指针异常后,struts2能捕获该异常,并且自动创建相应的对象.
如果属性被声明为Collection or List,创建ArrayList并注入.
如果声明为Map,创建HashMap并且注入.
如果是javabean并且具有无参数构造函数,系统会利用ObjectFactory.buildBean方法创建该对象.
流程如下
person.name-->setUsers()-->getUsers().setName()
[/list]
7.Collection and Map Support
[list]
[*]系统支持在定义list或者collection中的对象类型.通过在Class-conversion.properties
定义Element_xxx=Class(xxx表示action中对应的字段名),美来定义action中的对象类型.
[*]可以通过annotation来支持上面的Element_xxx定义.
[*]定义集合索引方式.
在配置文件中定义KeyProperty_xxx=yyy xxx是集合字段的名字,yyy集合中类的某个需要当作索引的属性.下列举例
MyAction.java
foo.java
在文件MyAction-conversion.properties中定义
KeyProperty_fooCollection=id
fooCollection(22)将代表fooCollection中id为22,foo对象.
通过fooCollection(22).name可以直接设置该对象的其他属性的值.
fooCollection(22)如果返回空值,不会自动创建该对象,可以通过fooCollection.makeNew[0]=Phil直接创建该对象,如果该写法用于Set那么必须定义foo对象的equal和hashCode并且包含id之外的字段,以防止Set删除id字段为null的元素.
[*]类型转化着部分处理的代码感觉和ognl结合的比较紧密,需要结合ognl来研习.
[/list]
8.Type Conversion Error Handling
[list]
[*]类型转化错误提供了一种方式以区分用户输入错误和,输入类型转化错误.
[*]所有的类型转化错误的提示信息的格式可以通过重写xwork.default.invalid.fieldvalue来修改.
[*]也可以修改通过在Action.properties定义invalid.fieldvalue.xxx(xxx是字段名)来修改所需要显示的类型转化错误的信息.
[*]显示该错误信息的途径有
Globally, using the Conversion Error Interceptor
在validator文件中定义conversion validator来显示.
[/list]
类型转化在struts2中的主要作用是把页面上符合ognl定义的控件的名字的输入值映射到action的相应字段中.以删除在servlet时代需要经常做的request.getParameter操作,并且利用ognl表达式甚至可以直接把页面上字段的值直接注入到action声明的对象中,是这个过程能够自动化,使得代码更加的简洁,更OO,可以说hibernate是处理对象到数据库的双向转化,struts2就是处理对象到html页面的双向转化.
2.Working Sample
[list]
[*]Action以及字段级别的类型转化
在action对应的目录下定义ActionClassName-conversion.properties
point = com.acme.PointConverter
[*]全局以及类级别的类型转化
xwork-conversion.properties在classpath
com.acme.Point = com.acme.PointConverter
[*]PointConverter必须实现TypeConverter或者直接继承StrutsTypeConverter类.
并且实现如下的双向转化
public abstract Object convertFromString(Map context, String[] values, Class toClass);
public abstract String convertToString(Map context, Object o);
该接口中还有个performFallbackConversion 方法,用来实现转化失败后的一些必要的操作.
当转化出现错误的时候需要抛出 XWorkException或者TypeConversionException以便struts2可以捕获该异常.
[/list]
3.Built in Type Conversion Support(内建的转化)
String
boolean / Boolean
char / Character
int / Integer, float / Float, long / Long, double / Double
dates
arrays 数组数据可以单个转化数据
collections 如果不能确定collection中的元素的类型,默认传见一个String的ArrayList.
4.Relationship to Parameter Names
类型转化的最佳利用方式是直接在页面上定义user.name这样就能把input的数据直接注入到action.getUser().setName()方法中.
[list]
[*]Use complex OGNL expressions--struts2能够自动处理对象的创建,而不用手工的创建嵌套对象.
[*]Ognl语法支持创建带有不带参数构造函数的对象.
[*]user.name会调用getUser().setName()但是如果user为空,那么action还必须具有setUser方法.
[*]For lists and maps, use index notation, such as people[0].name or friends['patrick'].name.
[*]对于多选框,如果定义问people.name 则系统会自动传见多个person对象并且注入name属性.
[/list]
5.Creating a Type Converter
继承StrutsTypeConverter类,实现to,from双向转化操作并且通过ActionClassName-conversion.properties或者全局xwork-conversion.properties中加载改converter即可.
6.Advanced Type Conversion(高级类型转化)
[list]
[*]Null Property Handling(空指针处理)--自动对象嵌套关系创建.
实现规则
当ognl抛出空指针异常后,struts2能捕获该异常,并且自动创建相应的对象.
如果属性被声明为Collection or List,创建ArrayList并注入.
如果声明为Map,创建HashMap并且注入.
如果是javabean并且具有无参数构造函数,系统会利用ObjectFactory.buildBean方法创建该对象.
流程如下
person.name-->setUsers()-->getUsers().setName()
[/list]
7.Collection and Map Support
[list]
[*]系统支持在定义list或者collection中的对象类型.通过在Class-conversion.properties
定义Element_xxx=Class(xxx表示action中对应的字段名),美来定义action中的对象类型.
[*]可以通过annotation来支持上面的Element_xxx定义.
[*]定义集合索引方式.
在配置文件中定义KeyProperty_xxx=yyy xxx是集合字段的名字,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;
}
在文件MyAction-conversion.properties中定义
KeyProperty_fooCollection=id
fooCollection(22)将代表fooCollection中id为22,foo对象.
通过fooCollection(22).name可以直接设置该对象的其他属性的值.
fooCollection(22)如果返回空值,不会自动创建该对象,可以通过fooCollection.makeNew[0]=Phil直接创建该对象,如果该写法用于Set那么必须定义foo对象的equal和hashCode并且包含id之外的字段,以防止Set删除id字段为null的元素.
[*]类型转化着部分处理的代码感觉和ognl结合的比较紧密,需要结合ognl来研习.
[/list]
8.Type Conversion Error Handling
[list]
[*]类型转化错误提供了一种方式以区分用户输入错误和,输入类型转化错误.
[*]所有的类型转化错误的提示信息的格式可以通过重写xwork.default.invalid.fieldvalue来修改.
[*]也可以修改通过在Action.properties定义invalid.fieldvalue.xxx(xxx是字段名)来修改所需要显示的类型转化错误的信息.
[*]显示该错误信息的途径有
Globally, using the Conversion Error Interceptor
在validator文件中定义conversion validator来显示.
[/list]