Struts2类型转换(一)----常规类型,自定义类型,错误处理

Struts2的类型转换是基于OGNL表达式的.有良好的扩展性.


WEB应用接收到表单提交的数据都是String类型的,Struts2可方便的转换为 常规类型(数值,日期) / 自定义类型(User,Point类).


如果转换中出现异常,conversionError拦截器会自动处理该异常.

  伦理片 http://www.dotdy.com/

----------------------------------------------------------------------------------------------------

 

一, 常规类型的转换:

比如表单提交的信息有 用户名,生日, 年龄, Action中对应的数据类型分别是 String, Date, int.  没什么好说的, Struts2会自动完成.

Struts2内建了常用的类型转换器,如String ,boolean,char,int,long,float,double,Date, 数组(假定元素是String类型), 集合(假定元素是String类型,用ArrayList封装)

 

二,自定义类型的转换(方法一):   这种方法用用来转换复杂对象

ONGL项目中有一个TypeConverter接口,是实现转换器必须实现的接口,这个接口有点复杂,所以OGNL还提供了该街接口的一个实现类ognl.DefaultTypeConverter 通过继承该类重写convertValue方法 ,实现自定义类型的转换 . 

方法是这样的convertValue(final Map context, final Object value, final Class toType)

      第一个参数:context 是类型转换环境的上下文

      第二个参数 : value 是须要转换的参数,方向不同,value的类型也是不同的.

      第三个参数 : toType是转换后的目标类型,

      返回值是 : 转换后的目标类型, 方向不同,类型也是不同的.

 

Struts2自己有一个抽象类继承自 DefaultTypeConverter类,是StrutsTypeConverter .就是转换的两个分别对应两个抽象方法, 其实都一样,换汤不换药,百变不离其中.所以我们也可以继承 StrutsTypeConverter类.

 

下面做一个自定义类型转换的实例:

1. 表单是这样的:   输入一个用 豆号分隔的两个数字, 代表一个坐标点的X,Y值 .

 

2.Point 对象如下 ,用来封装表单信息.

Java代码   收藏代码
  1. package ssh.org.util;  
  2. public class Point  
  3. {  
  4.     private int x;  
  5.     private int y;  
  6. }  
Java代码   收藏代码
  1. public class LoginAction extends ActionSupport  
  2. {  
  3.     private Point               point;  
  4.     set,get方法略...  
  5.   
  6.     @Override  
  7.     public String execute() throws Exception  
  8.     {  
  9.         return "success";  
  10.     }  
  11. }  

 

3.实现自定义类型转换器 ,我们自己写一个转换类PointConverter

Java代码   收藏代码
  1. package ssh.org.util;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import ognl.DefaultTypeConverter;  
  6.   
  7. public class PointConverter extends DefaultTypeConverter  
  8. {  
  9.   
  10.     @Override  
  11.     public Object convertValue(final Map context, final Object value, final Class toType)  
  12.     {  
  13.         if (Point.class == toType)  //从表单字符串转换为 Point对象  
  14.         {  
  15.             final Point point = new Point();  
  16.             final String[] str = (String[]) value;  
  17.             final String[] param = str[0].split(",");  
  18.   
  19.             final int x = Integer.parseInt(param[0]);  
  20.             final int y = Integer.parseInt(param[1]);  
  21.   
  22.             point.setX(x);  
  23.             point.setY(y);  
  24.   
  25.             return point;  
  26.         }  
  27.         if (String.class == toType) //从对象转换为字符串  
  28.         {  
  29.             final Point point = (Point) value;  
  30.             final int x = point.getX();  
  31.             final int y = point.getY();  
  32.   
  33.             final String result = "[x=" + x + ",y=" + y + "]";  
  34.             return result;  
  35.   
  36.         }  
  37.         return null;  
  38.     }  
  39. }  

 

4. 把上面的类型转换器PointConverter注册在struts2应用中,Struts2框架才可以正常使用该 转换器.

有3种方法,任选其中一种就行 .

           1)  注册局部类型转换器 , 假定请求的LoginAction 来处理  , 我们就要篇写  LoginAction-conversion.properties文件 .本文件要与LoginAction.java放再同一文件夹        

Properties代码   收藏代码
  1. #本文件名是:LoginAction-conversion.properties  
  2. #注册局部的类型转换器的属性文件, 只针对指定名称的Action起作用  
  3. #文件名必须 是action类名 + -conversion.properties  
  4. #指定LoginAction的point属性由ssh.org.util.PointConverter类完成转换,point是成员属性,不是类  
  5. #本文件要与LoginAction.java放再同一文件夹  
  6. point=ssh.org.util.PointConverter  

 

            2) 注册全局类型转换器 .       

Properties代码   收藏代码
  1. #本文件名是 xwork-conversion.properties  
  2. #注册全局的类型转换的属性文件 , 对所有有ssh.org.util.Point类型成员属性的Action都起作用  
  3. #文件名必须是 xwork-conversion.properties  
  4. #该文件放在classPath根路径,也就是src包下面,与struts.xml再一起  
  5. #指定ssh.org.util.Point类(带包名)   的类型类转换器为ssh.org.util.PointConverter  
  6. ssh.org.util.Point=ssh.org.util.PointConverter  

 

            3) 使用JDK1.5的注解 来注册类型转换器,目前还无例子, 暂时略...

 

5 结果页面 success.jsp   :

Html代码   收藏代码
  1. 点对象point:<s:property value="point"/><br>  
 

 

三,自定义类型的转换(方法二): 这种简单,不须要自己写类型转换器,不用写转换器注册文件* -conversion.properties .


1 表单是这样地:      第一个文本框是X坐标,第二个文本框是Y坐标, 与方法二中一个文本输入x,y不同了.

Html代码   收藏代码
  1. <form action="login.action" >  
  2.     point3.x:<input type="text" name="point3.x"/>  
  3.     point3.y:<input type="text" name="point3.y"/>  
  4.     <input type="submit" value="提交"/>   
  5. </form>  
  6. ogin.action是class LoginAction类在struts.xml配置的name  
 

2 LoginAction 类

Java代码   收藏代码
  1. public class LoginAction extends ActionSupport  
  2. {  
  3.     private Point               point3;  
  4.     set,get方法略...  
  5.   
  6.     @Override  
  7.     public String execute() throws Exception  
  8.     {  
  9.         return "success";  
  10.     }  
  11. }  

 

3 Point 对象如下 ,用来封装表单信息.

Java代码   收藏代码
  1. package ssh.org.util;  
  2. public class Point  
  3. {  
  4.     private int x;  
  5.     private int y;  
  6. }  

4 结果页面 success.jsp   :

Html代码   收藏代码
  1. 点对象point:<s:property value="point3"/><br>  

 

--------------------------------------------------------------------------------------------------------

 

 

类型转换错误的处理  

 

conversionError拦截器被注册在默认的拦截器栈中, 也是在struts-default.xml

Xml代码   收藏代码
  1. <interceptor-stack name="defaultStack">  
  2.                <!--类型转换错误的拦截器 -->  
  3.                 <interceptor-ref name="conversionError"/>  
  4.                 <!--数据校验的拦截器 -->  
  5.                 <interceptor-ref name="validation">  
  6.                     <param name="excludeMethods">input,back,cancel,browse</param>  
  7.                 </interceptor-ref>  
  8. </interceptor-stack>  
 

流程是: 

1  转换出错

2  被 conversionError拦截

3  将错误信息放入ActionContext中

4  读Action的局部资源文件 Action名称.properties  取得单个字段(成员属性)的提示信息

5  跳转到input逻辑视图,显示提示信息  ,要struts.xml中 <result name="input">/login/login.jsp</result> 这要指定 input逻辑视图.

 

本例子,处理请求的action 名称为LoginAction.java.

LoginAction.properties 文件 必须与LoginAction.java同名(扩展名不同) ,并放在同一文件 夹内

Properties代码   收藏代码
  1. #局部资源文件   
  2. #文件名为LoginAction.properties,   
  3. #必须与LoginAction.java同名(扩展名不同) ,并放在一起  
  4. # invalid.fieldvalue.成员属性=提示信息  
  5.   
  6. invalid.fieldvalue.point=输入坐标不正确  
  7. invalid.fieldvalue.point2=输入坐标不正确  
  8. invalid.fieldvalue.point3=输入坐标不正确  
  9. invalid.fieldvalue.birthday=生日不正确  

 

结果1   下面的表单是用Struts2标签写的, 出错误时,会自动显示错信息:

 

 

结果2   下面的表单是用HTML标签写的, 显示错误信息要加<s:fielderror ></s:fielderror>标签 :效果如下:

 

 

 

 

 

-----------------------------------------------------------------------------------------------------------


附件中是总个工程文件 ,包括上面的演示代码, 由于jar包较少,打包后大小为2M,就全打包上传了. 开发环境 Eclipse 3.3 + 支持属性文件中文自动编码的插件(忘记名称了)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值