struts2 自定义类型转换
2013-09-22 23:07
399 查看
struts2的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2已经为我们提供了几乎所有的primitive类型以及常用类型(如Date)的类型转换器,我们也可以为我们自定义类添加自定义类型转化器.struts2为我们提供了一个类型转化器的入口: ognl.DefaultTypeConverter,或继承org.apache.struts2.util.StrutsTypeConverter,由于StrutsTypeConverter提供了更好的封装,所以建议大家在写转换器时通常采用继承StrutsTypeConverter方式来实现.StrutsTypeConverter类实质上是DefaultTypeConverter的扩展
StrutsTypeConverter中的两个核心方法
convertFromString方法用于从前台页面获取字符串,将字符串转化为对象
convertToString方法用于将对象以字符串的方式输出到页面
我们在写struts2自定义类型转换类的时候主要就是覆盖上面两个方法
分类struts2自定义类型转换从大的方面来讲分两种:
u局部类型转换u全局类型转换局部类型转换又分为三种:
普通实体bean的自定义类型转换基于领域模型的自定义类型转换基于模型驱动的自定义类型转换无论是全局类型转换还是局部类型转换,转换器与Action之间是用properties文件来关联的,properties文件指明了转换规则
全局类型转换规则:
在classpath下新建文件xwork-conversion.properties(固定名称)
其内容为:目标转换对象=转换器类(包名+类名)
局部类型转换规则:
在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)
其内容为: 目标转换对象=转换器类(包名+类名)
在局部类型转换中又存在一种特殊情况
基于领域模型的自定义类型转换
它不但要在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)文件,还需在引用模型同级目录下建properties文件取名规则为引用名- conversion.properties
这块不好用文字描述,举个列子:
需求是这样的:在User类中有个Point对象的引用,现在要基于Point来做自定义类型转换,这里Point与User之间的这层关系就叫做领域模型,在操作User时需要对Point进行自定义类型转换,这时就必须在User类的同级目录下新建User-conversion.properties文件,在文件中指明point对象需要用什么类来进行转换.
我们约定Point类的对象名就为point,而对应的转换类为com.dl.convertor.PointConvertor,对应的Action类为PointUserAtion, PointUserAtion中有一个User类型的属性名为user
那么在PointUserAtion的同级目录中会存在一个名为PointUserAtion-conversion.properties的文件其内容为:
同样在User类的同级目录会存在一个名为User-conversion.properties的文件内容为
针对局部类型转换三种情况的例子 普通实体bean类型转换实体bean(Point)
对应的Action(PointAction)
对应的转换类(PointConvertor)
需要做的配置:在PointAction的同级目录下新建PointAction-conversion.properties,文件内容为
领域模型自定义类型转换实体bean(Point,User)
对应的Action(PointAction)
对应的转换类(PointConvertor)
需要做的配置:
在UserAction的同级目录下新建UserAction-conversion.properties,文件内容为
在User的同级目录下新建User-conversion.properties,文件内容为
模型驱动自定义类型转换
实体bean(Point)
对应的Action(PointModelDrivenAction)
对应的转换类(PointConvertor)
需要做的配置:
在PointModelDrivenAction的同级目录下新建PointModelDrivenAction-conversion.properties,文件内容为
在User的同级目录下新建User-conversion.properties,文件内容为
publicabstractclass StrutsTypeConverter extends DefaultTypeConverter { } |
publicabstract Object convertFromString(Map context, String[] values, Class toClass); publicabstract String convertToString(Map context, Object o); |
convertToString方法用于将对象以字符串的方式输出到页面
我们在写struts2自定义类型转换类的时候主要就是覆盖上面两个方法
分类struts2自定义类型转换从大的方面来讲分两种:
u局部类型转换u全局类型转换局部类型转换又分为三种:
普通实体bean的自定义类型转换基于领域模型的自定义类型转换基于模型驱动的自定义类型转换无论是全局类型转换还是局部类型转换,转换器与Action之间是用properties文件来关联的,properties文件指明了转换规则
全局类型转换规则:
在classpath下新建文件xwork-conversion.properties(固定名称)
其内容为:目标转换对象=转换器类(包名+类名)
局部类型转换规则:
在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)
其内容为: 目标转换对象=转换器类(包名+类名)
在局部类型转换中又存在一种特殊情况
基于领域模型的自定义类型转换
它不但要在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)文件,还需在引用模型同级目录下建properties文件取名规则为引用名- conversion.properties
这块不好用文字描述,举个列子:
需求是这样的:在User类中有个Point对象的引用,现在要基于Point来做自定义类型转换,这里Point与User之间的这层关系就叫做领域模型,在操作User时需要对Point进行自定义类型转换,这时就必须在User类的同级目录下新建User-conversion.properties文件,在文件中指明point对象需要用什么类来进行转换.
我们约定Point类的对象名就为point,而对应的转换类为com.dl.convertor.PointConvertor,对应的Action类为PointUserAtion, PointUserAtion中有一个User类型的属性名为user
那么在PointUserAtion的同级目录中会存在一个名为PointUserAtion-conversion.properties的文件其内容为:
user.point= com.dl.convertor.PointConvertor //因为在Action中引用的对象名为user而现在要处理的是user中的point属性,所以这里需要使用user.point来指明 |
point=com.dl.convertor.PointConvertor //因为该文件只针对user,所以只需指明User中的point对象即可不需在添加user否则会出现预想不到的结果 |
/***普通的javabean封装坐标*/publicclass Point {privateintx;privateinty;//省略set get方法} |
publicclass PointAction extends ActionSupport{private Point point;//省略set get方法public String execute() throws Exception {returnsuper.execute(); }} |
publicclass PointConvertor extends StrutsTypeConverter{/***从表单中的string到Point对象*我们约定以,来分隔这里为了严谨期间最好要进行输入数据的验证*/@Overridepublic Object convertFromString(Map context, String[] str, Class c) { Point point=null;if(str!=null||str.length>0){ String[] s=str[0].split(","); point=new Point();int x=Integer.parseInt(s[0]);int y=Integer.parseInt(s[1]); point.setX(x); point.setY(y); }return point; }/***从对象到字符串*比如页面输出*/@Overridepublic String convertToString(Map context, Object o) { Point point=(Point)o;return"("+point.getX()+","+point.getY()+")"; }} |
#目标转换对象=转换器point=com.dl.convertor.PointConvertor |
领域模型自定义类型转换实体bean(Point,User)
publicclass User {private String name;private Point point;//省略set get方法} |
publicclass Point {privateintx;privateinty;//省略set get方法} |
public class UserAction extends ActionSupport{ private User user; //省略set get方法 @Override public String execute() throws Exception { return super.execute(); } } |
publicclass PointConvertor extends StrutsTypeConverter{/***从表单中的string到Point对象*我们约定以,来分隔这里为了严谨期间最好要进行输入数据的验证*/@Overridepublic Object convertFromString(Map context, String[] str, Class c) { Point point=null;if(str!=null||str.length>0){ String[] s=str[0].split(","); point=new Point();int x=Integer.parseInt(s[0]);int y=Integer.parseInt(s[1]); point.setX(x); point.setY(y); }return point; }/***从对象到字符串*比如页面输出*/@Overridepublic String convertToString(Map context, Object o) { Point point=(Point)o;return"("+point.getX()+","+point.getY()+")"; }} |
在UserAction的同级目录下新建UserAction-conversion.properties,文件内容为
#目标转换对象=转换器user.point=com.dl.convertor.PointConvertor |
point=com.dl.convertor.PointConvertor |
模型驱动自定义类型转换
实体bean(Point)
/***普通的javabean封装坐标*/publicclass Point {privateintx;privateinty;//省略set get方法} |
/** * 基于模型驱动的自定义类型转换 * @author Administrator * */ @SuppressWarnings("serial") public class PointModelDrivenAction extends ActionSupport implements ModelDriven<Point>{ private Point point; public Point getPoint() { return point; } public void setPoint(Point point) { this.point = point; } public Point getModel() { return point; } @Override public String execute() throws Exception { return super.execute(); } } 注:这里切记要生成point的set get方法要不值不能自动进行封装 |
publicclass PointConvertor extends StrutsTypeConverter{/***从表单中的string到Point对象*我们约定以,来分隔这里为了严谨期间最好要进行输入数据的验证*/@Overridepublic Object convertFromString(Map context, String[] str, Class c) { Point point=null;if(str!=null||str.length>0){ String[] s=str[0].split(","); point=new Point();int x=Integer.parseInt(s[0]);int y=Integer.parseInt(s[1]); point.setX(x); point.setY(y); }return point; }/***从对象到字符串*比如页面输出*/@Overridepublic String convertToString(Map context, Object o) { Point point=(Point)o;return"("+point.getX()+","+point.getY()+")"; }} |
在PointModelDrivenAction的同级目录下新建PointModelDrivenAction-conversion.properties,文件内容为
#目标转换对象=转换器point=com.dl.convertor.PointConvertor |
point=com.dl.convertor.PointConvertor |
相关文章推荐
- Struts2的自动类型转换及自定义类型转换
- Struts2之自定义局部类型转换器、全局类型转换器
- struts2_自定义类型转换失败的提示信息
- Struts2自定义类型转换
- Struts2之自定义局部类型转换器、全局类型转换器
- struts2自定义类型转换
- Struts2的类型转换及输入校验(自定义类型转换器)
- struts2实现Date类型转换和自定义类型转换器
- Struts2的自定义类型转换和简单的输入校验
- Struts2自定义类型转换
- Struts2的自动类型转换及自定义类型转换
- struts2的自定义类型转换和异常处理
- 4.1.4: Struts2的类型转换---自定义类型转换器
- Struts2类型转换----常规类型,自定义类型,错误处理
- Struts2之自定义局部类型转换器、全局类型转换器
- 4.1.6: Struts2的类型转换---基于Struts2的自定义类型转换器
- Struts2之自定义局部类型转换器、全局类型转换器
- Struts2类型转换和自定义类型
- Struts2学习之2(请求参数的封装,类型转换,输入验证,自定义拦截器)
- Struts2的自动类型转换及自定义类型转换