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> 

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