Struts2中的类型转换

    所有MVC框架都需要负责解析HTTP请求参数,并将请求参数传给控制器组件,而HTTP请求参数都是字符串类型,因此,MVC框架必须将这些字符串参数转换成相应的数据类型。

struts2提供了强大的类型转换机制,支持转换的类型有boolean、char、int、long、float、double、Date(日期格式使用用户请求所在Locale的SHORT格式)、数组、集合。有些特殊情况,需要把字符串转换成符合对象时,需要使用自定义类型转换器。

在OGNL项目中定义了一个TypeConverter接口,该接口是自定义转换器必须实现的接口,该接口提供了一个实现类:DefaultTypeConverter,通常采用扩展该类来实现自定义转换器,此时只需重写该类的convertValue方法。该方法定义如下:

public Object convertValue(Map context, Object value, Class toType),参数含义如下:

context:类型转换环境的上下文

value:需要转化的参数,随着转换方向的不同,该参数的值也不同。

toType:需要转换的目标类型,当toType是复合对象时,表明需要将字符串类型转为复合对象实例,当toType是String类型时,表明需要将复合对象实例转换成String类型。

对于DefaultTypeConverter转换器而言,它必须考虑到最通用的情况,因此它把所有请求参数都视为字符串数组,而非字符串。

为了简化实现,struts2提供了一个StrutsTypeConverter抽象类,该类是DefaultTypeConverter类的子类,已实现了DefaultTypeConverter类的convertValue方法。实现该方法时,它将两个不同转换方向替换成不同的方法——当需要把字符窜转换成复合合类型时,调用convertFromString方法,需要把复合类型转换成字符串类型时,调用convertToString方法。

1、Point类(需要转换的对象) 

  1. public class Point { 
  2.  
  3.     private int x; 
  4.     private int y; 
  5.  
  6.     public int getX() { 
  7.         return x; 
  8.     } 
  9.  
  10.     public void setX(int x) { 
  11.         this.x = x; 
  12.     } 
  13.  
  14.     public int getY() { 
  15.         return y; 
  16.     } 
  17.  
  18.     public void setY(int y) { 
  19.         this.y = y; 
  20.     } 
  21.  

2、LoginAction类:

  1. public class LoginAction extends ActionSupport { 
  2.  
  3.     private List<Point> points; 
  4.  
  5.     public List<Point> getPoints() { 
  6.         return points; 
  7.     } 
  8.  
  9.     public void setPoints(List<Point> points) { 
  10.         this.points = points; 
  11.     } 
  12.  
  13.     @Override 
  14.     public String execute() throws Exception { 
  15.         return SUCCESS; 
  16.     } 
  17.  

3、 PointConverter类(转换器):

  1. public class PointConverter extends StrutsTypeConverter { 
  2.  
  3.     @SuppressWarnings("rawtypes"
  4.     @Override 
  5.     public Object convertFromString(Map context, String[] values, Class toClass) { 
  6.         List<Point> points = new ArrayList<Point>(); 
  7.         for (String value : values) { 
  8.             Point point = new Point(); 
  9.             String[] paramValues = value.split(","); 
  10.             int x = Integer.parseInt(paramValues[0]); 
  11.             int y = Integer.parseInt(paramValues[1]); 
  12.             point.setX(x); 
  13.             point.setY(y); 
  14.             points.add(point); 
  15.         } 
  16.         return points; 
  17.     } 
  18.  
  19.     @SuppressWarnings({ "rawtypes""unchecked" }) 
  20.     @Override 
  21.     public String convertToString(Map context, Object o) { 
  22.         List<Point> points = (List<Point>) o; 
  23.         StringBuilder result = new StringBuilder(); 
  24.         result.append("{"); 
  25.         for (Point point : points) { 
  26.             int x = point.getX(); 
  27.             int y = point.getY(); 
  28.             result.append("[").append("x=").append(x).append(",y=").append(y) 
  29.                     .append("],"); 
  30.         } 
  31.         result.append("}"); 
  32.         result.deleteCharAt(result.length() - 2); 
  33.         return result.toString(); 
  34.     } 
  35.  

转换器写完后需要注册,包括全局转换器和局部转换器,局部类型转换器只对指定Action的特定属性起作用,文件命名为ActionName-conversion.properties,与对应Action位于同一目录下,-conversion.properties为固定部分;全局类型转换期对该类型的所有属性起作用,文件命名固定为xwork-conversion.properties,该文件内容由多想<propType>=<ConvertClass>组成,<propType>为需要转换的类的全名(包名+类名),<ConvertClass>为对应类型转换器的实现类(类的全名)。

4、LoginAction-conversion.properties文件:
  1. points=com.wgy.struts2.PointConverter 

5、struts.xml文件:

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!DOCTYPE struts PUBLIC 
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd"> 
  5.  
  6. <struts> 
  7.  
  8.     <package name="default" extends="struts-default"> 
  9.  
  10.         <action name="login" class="com.wgy.struts2.LoginAction"> 
  11.             <result name="success">/result.jsp</result> 
  12.         </action> 
  13.  
  14.     </package> 
  15.  
  16. </struts> 

6、index.jsp页面:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" 
  2.     pageEncoding="UTF-8"%> 
  3. <%@ taglib prefix="s" uri="/struts-tags"%> 
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  5. <html> 
  6. <head> 
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  8. <title>index</title> 
  9. </head> 
  10. <body> 
  11.     <h3> 
  12.         <font color="red">用逗号分割点的座标</font> 
  13.     </h3> 
  14.     <s:form action="login"> 
  15.         <s:textfield name="points" label="point1" /> 
  16.         <s:textfield name="points" label="point2" /> 
  17.         <s:textfield name="points" label="point3" /> 
  18.         <s:submit value="提交" /> 
  19.     </s:form> 
  20. </body> 
  21. </html> 

7、result.jsp页面:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" 
  2.     pageEncoding="UTF-8"%> 
  3. <%@ taglib prefix="s" uri="/struts-tags"%> 
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  5. <html> 
  6. <head> 
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  8. <title>result</title> 
  9. </head> 
  10. <body> 
  11.     points:<s:property value="points" /> <br />      
  12.     <s:debug /> 
  13. </body> 
  14. </html> 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章