原文來自搬磚工,如需轉載請註明出處
博主SSH框架專欄請戳這裏http://blog.csdn.net/column/details/14227.html
一、類型轉換的意義
所以的MVC框架,解決的都是表現層的解決方案,都需要收集用戶請求參數,並把參數提供給控制器。但是,在Web應用中所有的請求參數都是字符串類型的,Java是強類型的語言,如何將字符串轉換爲Java類型,這是框架要解決的一個問題。
例如,一個註冊頁需要輸入年齡、日期等。這時候就需要將日期、年齡字符串轉換爲相應類型。
二、Struts2的類型轉換器
Struts2提供了內置的類型轉換器,對於大部分類型,開發者無需自定義類型轉換器,使用內置的類型轉換器就可以完成我們需要的類型轉換。
內置類型轉換器有:
1.boolean和Boolean
2.char和Character
3.int和Integer
4.long和Long
5.float和Float
6.double和Double
7.date
比如我們在頁面輸入20,傳輸到後臺肯定是字符串類型。但是Struts框架的內置類型轉換可以把20轉換爲int型。但是如果我們轉換abc這樣的爲int是行不通的。
三、自定義類型轉換器的實現
1.需求分析
比如我們需要在頁面上輸入(2,3)這樣一個座標點,將該點轉換爲一個點對象類型。
2.實現
當內置類型轉換無法滿足我們的需求的時候,需要用到自定義類型轉換。Struts2的類型轉換時基於ONGL的,在ONGL中有一個接口TypeConverter,該接口中有一個方法converterValue,該方法很複雜。其中還有一個默認的實現類DefaultTypeConverter,通過該類來實現類型轉換。
package com.study.converter;
import java.util.Map;
import com.study.bean.Point;
import ognl.DefaultTypeConverter;
public class PointConverter extends DefaultTypeConverter{
public Object convertValue(Map context, Object value, Class toType) {
if(toType==Point.class){
String []strs = (String[])value;
String []xy = strs[0].split(",");
int x = Integer.valueOf(xy[0]);
int y = Integer.valueOf(xy[1]);
Point p = new Point();
p.setX(x);
p.setY(y);
return p;
}else if(toType==String.class){
Point p = (Point) value;
return "["+p.getX()+","+p.getY()+"]";
}else{
return null;
}
}
}
這就是轉換器的一個簡單實現,把頁面傳輸的值進行解析,最後轉換爲Point類型。然後要讓類型轉換器起作用,需要進行配置
struts2提供了兩種配置方法:
a.局部:首先創建文件命名如Actionname-conversion.properties,裏面的內容爲 屬性=類型轉換器(ponit=com.study.converter)需要寫在包下面
b.全局:首先創建文件命名如xwork-conversion.properties,內容爲com.study.bean.Ponit=com.study.converter。文件需要寫在src下面
3.Struts的實現
struts2中有一個StrutsTypeConverter類,它是繼承DefaultTypeConverter。使用它來自定義轉換器更加方便,示例代碼如下:
package com.study.converter;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.study.bean.Point;
public class PointConverter extends StrutsTypeConverter{
public Object convertFromString(Map map, String[] obj, Class toType) {
String []strs = obj;
String []xy = strs[0].split(",");
int x = Integer.valueOf(xy[0]);
int y = Integer.valueOf(xy[1]);
Point p = new Point();
p.setX(x);
p.setY(y);
return p;
}
public String convertToString(Map map, Object obj) {
Point p = (Point) obj;
return "["+p.getX()+","+p.getY()+"]";
}
}
4.類型轉換器的錯誤處理
Struts2提供了一個名爲conversionError的攔截器,如果類型轉換出現錯誤,攔截器負責將錯誤封裝成表單錯誤(filederror),並將錯誤信息放入ActionContext中。
如何那麼改變默認類型轉換錯誤的錯誤提示信息?
方法一:
首先創建一個資源文件Mess.properties,放在src下面
然後覆蓋xwork-core-2.3.31\com\opensymphony\xwork2\xwork-messages.properties裏面的屬性xwork.default.invalid.fieldvalue。即在Mess.properties中寫入如下參數
xwork.default.invalid.fieldvalue="{0}"參數轉換失敗.
然後指定我們的資源文件,在struts.xml中(不需要加文件後綴)
<constant name="struts.custom.i18n.resources" value="Mess"></constant>
方法二:
爲某個action的字段提供錯誤信息提示
定義Actionname.properties文件,添加配置——Invalid.fieldvalue.屬性名=提示信息
下篇文章學習Struts2的文件上傳功能