ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 研磨Struts2 之 第十二章 类型转换器【私塾在线原创】

研磨Struts2 之 第十二章 类型转换器【私塾在线原创】

原创 Linux操作系统 作者:不知道010 时间:2012-02-28 16:26:39 0 删除 编辑
在Web应用中,页面提交请求的参数都是字符串类型的。但是在以前的学习中,我们都是直接在Action中按照需要来定义属性的类型,比如private int age,也没有出错,照样运行啊,而且还能正确运行呢,这是怎么回事情呢?
这就是由Struts2的类型转换框架默默的帮助我们完成的功能,只要用户输入的数据能合理的转换为需要的属性的类型,Struts2的类型转换框架就会在execute方法执行之前,替我们将参数转换为合适的类型。
因此,前面的示例中,在注册页面输入了帐号、名称和年龄,点击提交过后,类型转换的框架会把提交的年龄的这个字符串的值,转换成为int类型。然后这个int值才会被赋值给Action的int类型的age属性,所以就不会出错了。
Struts2已经内置了基本数据类型及其包装类和其他一些常见的用于表示数字/日期类型的类型转换器,包括:
int/Integer:整数型
short/Short:短整数型
long/Long:长整型
float/Float:浮点型
double/Double:双精度型
boolean/Boolean:布尔型
byte/Byte:字节型
char/Character:字符型
BigInteger:大整数型
BigDecimal:大浮点数型
Date:日期型
枚举类型往往被人们忽略,其实Struts2的Action中也可以直接使用枚举类型,其对应的参数值只需要对应枚举定义时的定义名即可。
比如有如下的枚举定义,示例代码如下:

java代码:
public enum ColorEnum {
red,blue,green;
}


在Action引用的时候,只需传入枚举的定义名(red,blue或green)即可,示例代码如下:

java代码:
public class ConverterAction extends ActionSupport {
private ColorEnum color;
public ColorEnum getColor() {
return color;
}
public void setColor(ColorEnum color) {
this.color = color;
}
}


自定义类型转换器的实现非常简单,写一个类,继承StrutsTypeConverter抽象类,该类在org.apache.struts2.util包内,这个抽象类有两个方法需要我们实现:
public Object convertFromString(Map context, String[] values, Class toClass),实现字符串向对象的转换,它有三个参数:
context:转换上下文,可以在里面引用各种对象,比如:可以通过context.get(ValueStack.VALUE_STACK)来引用值栈。
values:用户输入的字符串。
toClass:将要被转换成的对象类型。
public String convertToString(Map context, Object o) 方法,实现对象向字符串的转 , 它有两个参数
context:同上,也是转换的上下文。

java代码:
o:需要被转换的对象。
/**
 * 长方形向字符串转换
 */
public Object convertFromString(Map context, String[] values, Class toClass) {
//用户输入,比如16:9
String userInput = values[0];
String[] arr = userInput.split(":");
//在真正的格式转换之前,先把所有的用户输入可能的错误拦截住
if (arr.length!=2){
throw new TypeConversionException("请输入正确的长方形格式如,width:height");
}
try{
Rectangle rectangle = new Rectangle();
int width = Integer.parseInt(arr[0]);
int height = Integer.parseInt(arr[1]);
rectangle.setWidth(width);
rectangle.setHeight(height);
return rectangle;
}catch(RuntimeException e){
throw new TypeConversionException("请输入正确的长方形格式如,width:height",e);
}
}
/**
 * 字符串向长方形转换
 */
public String convertToString(Map context, Object o) {
Rectangle rectangle = (Rectangle) o;
return "长方形:宽"+rectangle.getWidth()+",高"+rectangle.getHeight();
}
在全局级别 注册自定义类型转换器
首先要注册这个自定义类型转换器处理。在src下建立一个xwork-conversion.properties文件,这个文件中用“全类名=这个类对应的类型转换器全类名”,来建立类和类型转换器的关系,对于我们来说,只有一行:

java代码:
cn.javass.convert.Rectangle=cn.javass.convert.RectangleConverter
注册完了之后,整个项目所有的长方形,都可以用自定义的类型转换器来处理了。
类级别 注册自定义类型转换器
还有更灵活的做法,可以在Action类上注册它的某个属性使用哪个类型转换器。
维持RectangleConverter自定义类型转换器的写法不变,现在删掉xwork-conversion.properties文件,以保证只有类级类型转换器起作用。
在使用了RectangleConverter的Action同包下建立一个Action名-conversion.properties的文件,里面用“属性名=属性引用的类型转换器”的形式,来指定属性和它引用的类型转换器,对于上面的示例来说,在ConverterAction-conversion.properties只需要一行:

java代码:
rectangle=cn.javass.convert.RectangleConverter
 
类级类型转换器的引用会覆盖全局级类型转换器的引用。
 
视频配套PPT,视频地址【 研磨Struts2视频课程】 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26715408/viewspace-717297/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-28

  • 博文量
    15
  • 访问量
    6110