原理
struts2的自定義類型轉換機制為復雜類型的輸入輸出處理提供了便捷.struts2已經為我們提供了幾乎所有的primitive類型以及常用類型(如Date)的類型轉換器,我們也可以為我們自定義類添加自定義類型轉化器.
struts2為我們提供了一個類型轉化器的入口: ognl.DefaultTypeConverter,或繼承org.apache.struts2.util.StrutsTypeConverter,由于StrutsTypeConverter提供了更好的封裝,所以建議大家在寫轉換器時通常采用繼承StrutsTypeConverter方式來實現.
StrutsTypeConverter類實質上是DefaultTypeConverter的擴展
publicabstractclass StrutsTypeConverter extends DefaultTypeConverter { } |
StrutsTypeConverter中的兩個核心方法
publicabstract Object convertFromString(Map context, String[] values, Class toClass); publicabstract String convertToString(Map context, Object o); |
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來做自定義類型轉換,這里Point與User之間的這層關系就叫做領域模型,在操作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{ /** *從表單中的string到Point對象 *我們約定以,來分隔這里為了嚴謹期間最好要進行輸入數據的驗證 */ @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{ /** *從表單中的string到Point對象 *我們約定以,來分隔這里為了嚴謹期間最好要進行輸入數據的驗證 */ @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(); } } 注:這里切記要生成point的set get方法要不值不能自動進行封裝 |
對應的轉換類(PointConvertor)
publicclass PointConvertor extends StrutsTypeConverter{ /** *從表單中的string到Point對象 *我們約定以,來分隔這里為了嚴謹期間最好要進行輸入數據的驗證 */ @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 |
至此Struts2的自定義類型轉換你基本已經掌握了,還不趕緊動手練練.遇到什么問題,請及時遇我聯系
QQ:184675420 Blog:http://www.aygfsteel.com/sxyx2008/
Email:sxyx2008@gmail.com
demo下載:http://www.aygfsteel.com/Files/sxyx2008/struts2typeconvertor.zip
電子文檔下載:點我下載電子版文檔.pdf