struts2類型轉換

1.先給一個PointBean,要求對這個bean進行類型轉換

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

2.兩種轉換器, 第一個側重於告訴大家轉換原理, 第二個側重具體實踐

  1. package edu.hust.common;
  2. import java.util.Map;
  3. import ognl.DefaultTypeConverter;
  4. import edu.hust.bean.Point;
  5. //較爲底層的一個轉換方法,一般項目中不直接繼承DefaultTypeConverter實現轉換,因爲還有StrutsTypeConverter(繼承自DefaultTypeConverter)進行了更好的封裝。使我們更方便使用。
  6. //這裏的例子爲了大家理解這個機制。
  7. public class Converter extends DefaultTypeConverter {
  8.     @SuppressWarnings("unchecked")
  9.     @Override
  10.     public Object convertValue(Map context, Object value, Class toType) {
  11.         /*
  12.          * toType: 當客戶端提交數據時,要求String類型轉換爲自定義類型進行業務處理or存儲(eg:String轉爲Point類);
  13.          * 當客戶端接收數據時,要求自定義類型轉換爲String類型進行顯示輸出。
  14.          * toType起到了類型判斷的作用。
  15.          */
  16.         //String轉換爲Point(Point爲被轉換(toType)類型, 也即目標類型)
  17.         if (Point.class == toType) {
  18.             Point point = new Point();
  19.             
  20.             //String[] paramValues = ((String)value).split(",");建議這一句用下面兩句去替代。
  21.             /*
  22.              * 爲什麼要將value轉換爲String[]呢?
  23.              * 我們在做表單時可以給2個or多個text的name屬性賦予相同的值(即相同名字)。這樣的話,server端接收name屬性對應的表單屬性時,接收過來的是一個數組(eg: 在Servlet中是用req.getParameterValues()接收這個數組的)。
  24.              * 方法接口爲:public String[] getParameterValues(String name);
  25.              */
  26.             String[] strTxt = (String[]) value;
  27.             String[] paramValues = strTxt[0].split(",");
  28.             
  29.             
  30.             int x = Integer.parseInt(paramValues[0]);
  31.             int y = Integer.parseInt(paramValues[1]);
  32.             
  33.             point.setX(x);
  34.             point.setY(y);
  35.             
  36.             return point;
  37.         }
  38.         //String爲目標類型(當然不轉換toString()方法會被調用,但我們不希望這樣)
  39.         if (String.class == toType) {
  40.             Point point = (Point)value;
  41.             int x = point.getX();
  42.             int y = point.getY();
  43.             String result = x + "," + y;
  44.             return result;
  45.         }
  46.         return null;
  47.     }
  48. }
  1. package edu.hust.common;
  2. import java.util.Map;
  3. import org.apache.struts2.util.StrutsTypeConverter;
  4. import edu.hust.bean.Point;
  5. public class Converter2 extends StrutsTypeConverter {
  6.     @SuppressWarnings("unchecked")
  7.     @Override
  8.     public Object convertFromString(Map context, String[] values, Class toClass) {
  9.         Point point = new Point();
  10.         
  11.         String[] paramValues = values[0].split(",");
  12.         
  13.         
  14.         int x = Integer.parseInt(paramValues[0]);
  15.         int y = Integer.parseInt(paramValues[1]);
  16.         
  17.         point.setX(x);
  18.         point.setY(y);
  19.         
  20.         return point;
  21.     }
  22.     @SuppressWarnings("unchecked")
  23.     @Override
  24.     public String convertToString(Map context, Object o) {
  25.         Point point = (Point)o;
  26.         int x = point.getX();
  27.         int y = point.getY();
  28.         String result = "[x座標:" + x + "],[y座標:" + y +"]";
  29.         return result;
  30.     }
  31. }

3.action:請詳細閱讀下面這個action的中的註釋

  1. package edu.hust.action;
  2. import java.util.Date;
  3. import com.opensymphony.xwork2.ActionSupport;
  4. import edu.hust.bean.Point;
  5. public class ConverterAction extends ActionSupport {
  6.     
  7.     /*
  8.      * 如何讓ConvertorAction知道Convertor類,並調用其中convertValue()方法進行類型轉換呢?: 需要在ConvertorAction類所在的保內建立一個資源文件:ConvertorAction-conversion.properties.
  9.      * 
  10.      * 在這個類中進行setter,getter方法時,ConvertorAction類會自動檢測所在包內有沒有(屬性類型轉換的)資源文件存在。如果存在則優先執行*.properties文件。
  11.      * 在*.properties文件中調用edu.hust.common.Convertor類進行類型轉換後,再執行setter,getter方法。
  12.      * 
  13.      * 對於int,Date類型,struts2自動進行轉化。不必我們去寫轉化代碼。但如果我們也手工寫了轉化代碼,則優先使用我們的轉化代碼。如果我們沒有定義轉化,struts2自動轉化。
  14.      * 對於自動轉換的類型,struts2也會進行輸入校驗。對於int,Date類型的,如果我們輸入字符串去提交,struts2自動校驗並根據反射技術,把錯誤打印到對應輸入表單之上(這裏就必須使用struts2的表單,不能使用el進行輸出)。
  15.      * 在這裏我們不推薦使用struts2的自動驗證,其一其功能有限,其二其錯誤輸出信息只是給程序員看的,而會讓使用者一頭霧水。
  16.      * 解決方法:找到自動提示的錯誤信息,將錯誤信息內容覆蓋爲我們希望看到的--通過資源文件。
  17.      * 
  18.      * 注:在result頁面顯示的時候,注意用<s:property>標籤顯示和用el顯示的區別(區別很大)。
  19.      *
  20.      * */
  21.     
  22.     private static final long serialVersionUID = 1L;
  23.     
  24.     private Point point;
  25.     private int age;
  26.     private String username;
  27.     private Date date;
  28.     public Point getPoint() {
  29.         return point;
  30.     }
  31.     public void setPoint(Point point) {
  32.         this.point = point;
  33.     }
  34.     public int getAge() {
  35.         return age;
  36.     }
  37.     public void setAge(int age) {
  38.         this.age = age;
  39.     }
  40.     public String getUsername() {
  41.         return username;
  42.     }
  43.     public void setUsername(String username) {
  44.         this.username = username;
  45.     }
  46.     public Date getDate() {
  47.         return date;
  48.     }
  49.     public void setDate(Date date) {
  50.         this.date = date;
  51.     }
  52.     @Override
  53.     public String execute() throws Exception {
  54.         return SUCCESS;
  55.     }
  56.     
  57. }

4.類型轉換的局部資源配置文件ConverterAction-conversion.properties

  1. # 局部的 --> 類型轉換資源文件
  2. # 這個資源文件的文件名是有規定的: 
  3. # 前半部分:ConvertorAction --> 必須與對應的Action一致。
  4. # 後半部分:-conversion.properties --> 固定格式,不能修改。
  5. # 書寫內容:你對ConvertorAction中的哪個屬性進行轉換
  6. # 對ConvertorAction類中的point對象屬性,用edu.hust.common.Convertor類進行轉換
  7. # 局部convertion.properties和全局convertion.properties同時定義了對某一類型的轉換時,局部有效、全局無效。
  8. point = edu.hust.common.Converter

類型轉換的全局資源配置文件xwork-conversion.properties

  1. # 全局的 --> 類型轉換資源文件
  2. # 這個資源文件的文件名是固定的,不能修改。 
  3. # 對整個的PointBean進行轉換,無論哪裏用到Point類(即只要調用了PointBean),轉換就會執行。
  4. # 局部convertion.properties和全局convertion.properties同時定義了對某一類型的轉換時,局部有效、全局無效。
  5. edu.hust.bean.Point = edu.hust.common.Converter2

5.最後是struts.xml和jsp頁面, 這些和普通struts2無異

  1. <%@ page contentType="text/html;charset=GBK"%>
  2. <%@ taglib prefix="s" uri="/struts-tags" %>
  3. <s:form action="converter" method="post">
  4.     <s:textfield name="point" label="point" />
  5.     <s:textfield name="age" label="age" />
  6.     <s:textfield name="username" label="username" />
  7.     <s:textfield name="date" label="date" />
  8.     <s:submit label="submit" />
  9. </s:form>
  1. <!DOCTYPE struts PUBLIC
  2.           "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  3.           "http://struts.apache.org/dtds/struts-2.0.dtd">
  4. <struts>
  5.     <package name="struts2" extends="struts-default">
  6.         <action name="converter" class="edu.hust.action.ConverterAction">
  7.             <result>/result.jsp</result>
  8.         </action>
  9.     </package>
  10. </struts>
  1. <%@ page contentType="text/html;charset=GBK"%>
  2. <%@ taglib prefix="s" uri="/struts-tags" %>
  3. <html>
  4.     <head><title>Login Page</title></head>
  5.     <body bgcolor="#99ffff">
  6.         <!-- 如果使用了*.properties進行類型轉化,你會發現用el輸出和用s標籤輸出效果完全不同, 建議使用s標籤 -->
  7.         
  8.         <h2>使用s標籤顯示</h2>
  9.         point: <s:property value="point" /><br>
  10.         age: <s:property value="age" /><br>
  11.         username: <s:property value="username" /><br>
  12.         date: <s:property value="date" /><br><br>
  13.         
  14.         <h2>使用el顯示</h2>
  15.         point: ${point}<br>
  16.         age: ${age}<br>
  17.         username: ${username}<br>
  18.         date: ${date}<br>
  19.     </body>
  20. </html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章