Struts2自定義類型轉換

原理 java

struts2的自定義類型轉換機制爲複雜類型的輸入輸出處理提供了便捷.struts2已經爲咱們提供了幾乎全部的primitive類型以及經常使用類型(Date)的類型轉換器,咱們也能夠爲咱們自定義類添加自定義類型轉化器. apache

struts2爲咱們提供了一個類型轉化器的入口ognl.DefaultTypeConverter,或繼承org.apache.struts2.util.StrutsTypeConverter,因爲StrutsTypeConverter提供了更好的封裝,因此建議你們在寫轉換器時一般採用繼承StrutsTypeConverter方式來實現. ide

StrutsTypeConverter類實質上是DefaultTypeConverter的擴展 this

 publicabstractclass StrutsTypeConverter extendsDefaultTypeConverter spa

{ .net

} orm

StrutsTypeConverter中的兩個核心方法 對象

 publicabstract Object convertFromString(Map context, String[] values, Class toClass); 繼承

publicabstract String convertToString(Map context, Object o); ci

convertFromString方法用於從前臺頁面獲取字符串,將字符串轉化爲對象

convertToString方法用於將對象以字符串的方式輸出到頁面

咱們在寫struts2自定義類型轉換類的時候主要就是覆蓋上面兩個方法

分類

struts2自定義類型轉換從大的方面來說分兩種:

u      局部類型轉換

u      全局類型轉換

局部類型轉換又分爲三種:

²       普通實體bean的自定義類型轉換

²       基於領域模型的自定義類型轉換

²       基於模型驅動的自定義類型轉換

不管是全局類型轉換仍是局部類型轉換,轉換器與Action之間是用properties文件來關聯的,properties文件指明瞭轉換規則

       全局類型轉換規則:

       classpath下新建文件xwork-conversion.properties(固定名稱)

       其內容爲:目標轉換對象=轉換器類(包名+類名)

       局部類型轉換規則:

       在對應的Action的同級目錄下新建Action-conversion.properties(必定要與Action類名對應)

       其內容爲目標轉換對象=轉換器類(包名+類名)

       在局部類型轉換中又存在一種特殊狀況

       基於領域模型的自定義類型轉換

   它不但要在對應的Action的同級目錄下新建Action-conversion.properties(必定要與Action類名對應)文件,還需在引用模型同級目錄下建properties文件取名規則爲引用名- conversion.properties

這塊很差用文字描述,舉個列子:

需求是這樣的:

User類中有個Point對象的引用,如今要基於Point來作自定義類型轉換,這裏PointUser之間的這層關係就叫作領域模型,在操做User時須要對Point進行自定義類型轉換,這時就必須在User類的同級目錄下新建User-conversion.properties文件,在文件中指明point對象須要用什麼類來進行轉換.

咱們約定Point類的對象名就爲point,而對應的轉換類爲com.dl.convertor.PointConvertor,對應的Action類爲PointUserAtion, PointUserAtion中有一個User類型的屬性名爲user

那麼在PointUserAtion的同級目錄中會存在一個名爲PointUserAtion-conversion.properties的文件其內容爲:

user.point= com.dl.convertor.PointConvertor

//由於在Action中引用的對象名爲user而如今要處理的是user中的point屬性,因此這裏須要使用user.point來指明

一樣在User類的同級目錄會存在一個名爲User-conversion.properties的文件內容爲

point=com.dl.convertor.PointConvertor

//由於該文件只針對user,因此只需指明User中的point對象便可不需在添加user不然會出現預想不到的結果

針對局部類型轉換三種狀況的例子

  ²       普通實體bean類型轉換

   實體bean(Point)

/**

 *普通的javabean封裝座標

 */

publicclass Point {

   privateintx;

   privateinty;

//省略set get方法

}

對應的Action(PointAction)

publicclass PointAction extends ActionSupport{

   private Point point;

//省略set get方法

   public String execute() throws Exception {

      returnsuper.execute();

   }

}

對應的轉換類(PointConvertor)

publicclass PointConvertor extends StrutsTypeConverter{

   /**

    *從表單中的stringPoint對象

    *咱們約定以,來分隔這裏爲了嚴謹期間最好要進行輸入數據的驗證

    */

   @Override

   public Object convertFromString(Map context, String[] str, Class c) {

      Point point=null;

      if(str!=null||str.length>0){

        String[] s=str[0].split(",");

        point=new Point();

        int x=Integer.parseInt(s[0]);

        int y=Integer.parseInt(s[1]);

        point.setX(x);

        point.setY(y);

      }

      return point;

   }

   /**

    *從對象到字符串

    *好比頁面輸出

    */

   @Override

   public String convertToString(Map context, Object o) {

      Point point=(Point)o;

      return"("+point.getX()+","+point.getY()+")";

   }

}

須要作的配置:PointAction的同級目錄下新建PointAction-conversion.properties,文件內容爲

#目標轉換對象=轉換器

point=com.dl.convertor.PointConvertor



²       
領域模型自定義類型轉換

實體bean(Point,User)

 publicclass User {

   private String name;

   private Point point;

//省略set get方法

}

publicclass Point {

   privateintx;

   privateinty;

//省略set get方法

}

對應的Action(PointAction)

public class UserAction extends ActionSupport{

   private User user;

//省略set get方法

   @Override

   public String execute() throws Exception {

      return super.execute();

   }

}

對應的轉換類(PointConvertor)

publicclass PointConvertor extends StrutsTypeConverter{

   /**

    *從表單中的stringPoint對象

    *咱們約定以,來分隔這裏爲了嚴謹期間最好要進行輸入數據的驗證

    */

   @Override

   public Object convertFromString(Map context, String[] str, Class c) {

      Point point=null;

      if(str!=null||str.length>0){

        String[] s=str[0].split(",");

        point=new Point();

        int x=Integer.parseInt(s[0]);

        int y=Integer.parseInt(s[1]);

        point.setX(x);

        point.setY(y);

      }

      return point;

   }

   /**

    *從對象到字符串

    *好比頁面輸出

    */

   @Override

   public String convertToString(Map context, Object o) {

      Point point=(Point)o;

      return"("+point.getX()+","+point.getY()+")";

   }

}

須要作的配置:

UserAction的同級目錄下新建UserAction-conversion.properties,文件內容爲

#目標轉換對象=轉換器

user.point=com.dl.convertor.PointConvertor

User的同級目錄下新建User-conversion.properties,文件內容爲

point=com.dl.convertor.PointConvertor

        
²       
模型驅動自定義類型轉換
實體bean(Point)

/**

 *普通的javabean封裝座標

 */

publicclass Point {

   privateintx;

   privateinty;

//省略set get方法

}

對應的Action(PointModelDrivenAction)

/**

 * 基於模型驅動的自定義類型轉換

 * @author Administrator

 *

 */

@SuppressWarnings("serial")

public class PointModelDrivenAction extends ActionSupport implements ModelDriven<Point>{

   private Point point;

   public Point getPoint() {

      return point;

   }

   public void setPoint(Point point) {

      this.point = point;

   }

   public Point getModel() {

      return point;

   }

   @Override

   public String execute() throws Exception {

      return super.execute();

   }

}

:這裏切記要生成pointset get方法要不值不能自動進行封裝

對應的轉換類(PointConvertor)

publicclass PointConvertor extends StrutsTypeConverter{

   /**

    *從表單中的stringPoint對象

    *咱們約定以,來分隔這裏爲了嚴謹期間最好要進行輸入數據的驗證

    */

   @Override

   public Object convertFromString(Map context, String[] str, Class c) {

      Point point=null;

      if(str!=null||str.length>0){

        String[] s=str[0].split(",");

        point=new Point();

        int x=Integer.parseInt(s[0]);

        int y=Integer.parseInt(s[1]);

        point.setX(x);

        point.setY(y);

      }

      return point;

   }

   /**

    *從對象到字符串

    *好比頁面輸出

    */

   @Override

   public String convertToString(Map context, Object o) {

      Point point=(Point)o;

      return"("+point.getX()+","+point.getY()+")";

   }

}

須要作的配置:

PointModelDrivenAction的同級目錄下新建PointModelDrivenAction-conversion.properties,文件內容爲

#目標轉換對象=轉換器

point=com.dl.convertor.PointConvertor

User的同級目錄下新建User-conversion.properties,文件內容爲

point=com.dl.convertor.PointConvertor



相關文章
相關標籤/搜索