Struts2 自定义类型转换 原理 struts2 的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2 已经为我们提供了几乎所有的 primitive 类型以及常用类型 ( 如 Date) 的类型转换器, 我们也可以为我们自定义类添加自定义类型转化器. struts2 为我们提供了一个类型转化器的入口 : ognl.defaulttypeconverter, 或继承 org.apache.struts2.util.strutstypeconverter, 由于 StrutsTypeConverter 提供了更好的封装, 所以建议大家在写转换器时通常 采用继承 StrutsTypeConverter 方式来实现. StrutsTypeConverter 类实质上是 DefaultTypeConverter 的扩展 public abstract class StrutsTypeConverter extends DefaultTypeConverter { StrutsTypeConverter 中的两个核心方法 public abstract Object convertfromstring(map context, String[] values, Class toclass); public abstract String converttostring(map context, Object o); 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 的同级目录中会存在一个名为 User-conversion.properties 内容应该是这样的 PointUserAtion-conversion.properties 的文件其内容为 : user.point= com.dl.convertor.pointconvertor // 因为在 Action 中引用的对象名为 user 而现在要处理的是 user 中的 point 属性, 所以这里需要使用 user.point 来指明 同样在 User 类的同级目录会存在一个名为 User-conversion.properties 的文件内容为 // 因为该文件只针对 user, 所以只需指明 User 中的 point 对象即可不需在添 加 user 否则会出现预想不到的结果
针对局部类型转换三种情况的例子 普通实体 bean 类型转换 实体 bean(point) * 普通的 javabean 封装坐标 public class Point { private int x; private int y; 对应的 Action(PointAction) public class PointAction extends ActionSupport{ private Point point; public String execute() throws Exception { return super.execute(); 对应的转换类 (PointConvertor) public class PointConvertor extends StrutsTypeConverter{ * 从表单中的 string 到 Point 对象 * 我们约定以, 来分隔这里为了严谨期间最好要进行输入数据的验证 public 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); * 从对象到字符串 * 比如页面输出 public String converttostring(map context, Object o) { Point point=(point)o; return "("+point.getx()+","+point.gety()+")"; 需要做的配置 : 在 PointAction 的同级目录下新建 PointAction-conversion.properties, 文件内容为 # 目标转换对象 = 转换器 领域模型自定义类型转换 实体 bean(point,user) public class User { private String name; private Point point;
public class Point { private int x; private int y; 对应的 Action(PointAction) public class UserAction extends ActionSupport{ private User user; public String execute() throws Exception { return super.execute(); 对应的转换类 (PointConvertor) public class PointConvertor extends StrutsTypeConverter{ * 从表单中的 string 到 Point 对象 * 我们约定以, 来分隔这里为了严谨期间最好要进行输入数据的验证 public 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);
* 从对象到字符串 * 比如页面输出 public String converttostring(map context, Object o) { Point point=(point)o; return "("+point.getx()+","+point.gety()+")"; 需要做的配置 : 在 UserAction 的同级目录下新建 UserAction-conversion.properties, 文件内容为 # 目标转换对象 = 转换器 user. 在 User 的同级目录下新建 User-conversion.properties, 文件内容为 模型驱动自定义类型转换 实体 bean(point) * 普通的 javabean 封装坐标 public class Point { private int x; private int y; 对应的 Action(PointModelDrivenAction)
* 基于模型驱动的自定义类型转换 * @author Administrator * @SuppressWarnings("serial") public class PointModelDrivenAction extends ActionSupport implements ModelDriven<Point>{ private Point point; public Point getpoint() { public void setpoint(point point) { this.point = point; public Point getmodel() { public String execute() throws Exception { return super.execute(); 注 : 这里切记要生成 point 的 set get 方法要不值不能自动进行封装 对应的转换类 (PointConvertor) public class PointConvertor extends StrutsTypeConverter{ * 从表单中的 string 到 Point 对象 * 我们约定以, 来分隔这里为了严谨期间最好要进行输入数据的验证 public 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); * 从对象到字符串 * 比如页面输出 public String converttostring(map context, Object o) { Point point=(point)o; return "("+point.getx()+","+point.gety()+")"; 需要做的配置 : 在 PointModelDrivenAction 的同级目录下新建 PointModelDrivenAction-conversion.properties, 文件内容为 # 目标转换对象 = 转换器 在 User 的同级目录下新建 User-conversion.properties, 文件内容为 至此 Struts2 的自定义类型转换你基本已经掌握了, 还不赶紧动手练练. 遇到什么问题, 请及时遇我联系 QQ:184675420 Blog: http://www.blogjava.net/sxyx2008/ Email:sxyx2008@gmail.com demo 下载 :http://www.blogjava.net/files/sxyx2008/struts2typeconvertor.zip