Posted on 2011-09-15 14:39
ply 阅读(465)
评论(0) 编辑 收藏
web应用类型的转换分为两种情况:
1.从客房端的字符串到自定义类型的转换。
2.页面输出时从自定义类型到字符串的转换。
在struts2中分两种转换,一种是局部转换,另一种是全局类型转换。具体转换的实施需要一个转换类和一个自定义类。我们先来看局部类型转换。
局部类型转换
对于int等基本类型,struts2会自动完成类型转换,像age年龄,在输入页面是String型的,到Action后会自动转换成int型。而如果是转换成对象类型的话,就需要自定义类型转换。这样就需要一个自定义类。要定义一个转换类,需要继承ognl.DefaultTypeConverter这个类 ,这是个类型转换的类。代码如下:
1 public class PointConverter extends DefaultTypeConverter{
2 public Ojbect convertValue(Map context,Object value,Class tyType){//重写方法
3 if(Point.class==toType){
4 Point point = new Point();
5 String[] str = (String[])value;//将String转换成类的代码处理
6 return point;
7 }
8 if(String.class==toType){//说明由类转换成String
9 Point point = (Point)value;//将类转成String的代码处理
10 return String型的一个变量;
11 }
12 return null;
13 }
14 }
方法对数说明:1、Map context ——应用上正文
2、Object value ——是要进行类型转换的值。如果是从客户端到自定义的类,那么value是个字符串。注意:它是一个字符串的数组。因为:在表单中可以有多个文本域,而所有文本域可以是同一个名字,这时是考虑通用性而作为数组处理的。如果只有一个文本域,则数组只有一个元素,下标为0。注:jsp的servlet中接收多个相同名字的输入域用request.getParameterValues()方法。
3、class toType ——来指定向哪 一种类型转换,即是向类转换还是向客户端转换。
4、Point是一个类,即是我们的自定义类。不是系统内置的类型
1 if(类.class == toType){//说明由客户端向类转换
2 Point point = new Point();//向哪个类转换,就实例化这个类
3 String[] str = (String[])value;//因为是由客户端向类转换,所以此时value是一个String[]数组
4 String[] paramValues = str[0].split(",");
5 //下面部分代码就是进行转换处理
6 }
7 if(String.class == toType){//说明由类向客户端的String转换,此时value是一个对象
8 Point point = (Point)value;
9 //下面部分的代码就是进行转换处理;
10 }
if(类.class == toType){//说明由客户端向类转换
Point point = new Point();//向哪个类转换,就实例化这个类
String[] str = (String[])value;//因为是由客户端向类转换,所以此时value是一个String[]数组
String[] paramValues = str[0].split(",");
//下面部分代码就是进行转换处理
}
if(String.class == toType){//说明由类向客户端的String转换,此时value是一个对象
Point point = (Point)value;
//下面部分的代码就是进行转换处理;
}
自定义类、转换类、action都创建好之后,要通告struts2转换类在什么地方,并且告诉struts2是对谁进行转换。写一个文件:action文件名-conversion.properties,此属性文件要与action在同一包下,此文件说明对此action中的属性进行转化。
文件中的内容如下:
point = 转换类名
内容说明:
1、point是Action中的一个属性,转换类指明所使用哪个转换类对此属性进行转换
2、properties文件中的注释为“#”号,前面加“#”的行是被注释的
类型转换的流程
1、用户进行请求,根据请求名在struts.xml中寻找Action
2、在Action中,根据请求域中的名字去寻找对应的set方法。找到后在赋值之前会检查这个属性有没有自定义的类型转换。没有的话,按照默认进行转换;如果某个属性已经定义好了类型转换,则会去检查在Action同一目录下的 action文件名-conversion.properties 文件。
3、从文件中找到要转换的属性及其转换类。
4、然后进入转换类中,在此类中判断转换的方向。我们是先从用户请求开始的,所以这时先进入从字符串到类的转换。返回转换后的对象。流程返回Action。
5、将返回的对象赋值给Action中的属性,执行Action中的execute()
6、执行完execute()方法,根据struts.xml的配置转向页面
7、在jsp中显示内容时,根据页面中的属性名去调用相应的get方法,以便输出
8、在调用get方法之前,会检查有没有此属性的自定义类型转换。如果有,再次跳转到转换类当中。
9、在转换类中再次判断转换方向,进入由类到字符串的转换,完成转换后返回字符串。
10、将返回的值直接带出到要展示的页面当中去展示。