Struts2自定義類型轉換器分爲局部類型轉換器和全局類型轉換器
ognl的api地址: http://www.opensymphony.com/ognl/api/
ognl源碼在網上自行下載,我是在csdn裏下的
1. struts2內部支持的類型轉換
參考
http://ejb3.blogbus.com/logs/22922214.html
http://www.cnblogs.com/wushiqi54719880/archive/2011/07/09/2101773.html
可自動轉換的類型:
8個基本類型,Date(本地格式yyyy-MM-dd),array數組,List,Map類, set類
bean.firstname 賦值給Action中屬性名爲bean對象的firstname屬性
friends['patrick'].name 賦值給Map對象裏key爲'patrick' 的對象的name屬性
friends['patrick'] 賦值給Map對象裏key爲'patrick' 的值
注意:使用集合時,要注意使用泛型,如果不使用泛型,要額外寫配置文件.這裏不做詳述
參考http://hi.baidu.com/sqzhangling/item/b951bf8e39840e29100ef312
2. 自定義類型轉換器
類型轉換器的寫法:
寫一個類,類的要求: 實現TypeConverter接口或繼承DefaultTypeConverter類或繼承StrutsTypeConverter,然後覆蓋類中的方法.
org.apache.struts2.util.StrutsTypeConverter是
com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter的子類,
DefaultTypeConverter是 TypeConverter的實現類
如果是繼承DefaultTypeConverter,重寫convertValue方法, 該方法介紹如下:
public Object convertValue(Map<String, Object> context,Object value, Class toType) {
context: context under which the conversion is being done
value: an object to be converted to the given type
totype: class type to be converted to
return: converted value of the type given, or value ifthe value cannot be converted to the given type.
這個方法轉換是雙向的,例如頁面上<s:textfield name=”user”/>對應action中的user屬性:
那麼表單元素string->user的轉換:if(toType==User.class){把value轉換成String[],得到第1個元素,封裝成User對象,返回user };表單回填時從user->string的轉換: if(value instanceof User){return 字符串}
代碼參考 http://blog.csdn.net/furongkang/article/details/6921440
如果是繼承StrutsTypeConverter類,重寫convertFromString方法和convertToString方法,從方法名字就知道一個是從對象到字符串,一個是從字符串到對象.比上面的類更簡單,推薦是用這種.
/**
* 日期類型轉換器
*/
publicclass DateTypeConversion extends StrutsTypeConverter{
publicstaticfinal String dateType="yyyy/MM/dd";
publicstaticfinal SimpleDateFormat format=new SimpleDateFormat(dateType);
/**
* 從表單到Action中屬性的轉換
*/
@Override
public Object convertFromString(Map context, String[] values, Class toType) {
if(toType==java.util.Date.class){
try {
if(!””.equals(values[0].trim()))
returnformat.parse(values[0]);
} catch (ParseException e) {
e.printStackTrace();
}
}
returnnull;
}
/**
* 把Action某屬性轉換成字符串
*/
@Override
public String convertToString(Map context, Object value) {
if(value instanceof java.util.Date){
returnformat.format((java.util.Date)value);
}
returnnull;
}
}
a) 局部類型轉換器,
在action類所在的包下新建ActionClassName-conversion.properties文件,ActionClassName是類名,後面的-conversion.properties是固定的寫法,
如:HelloWorldAction-conversion.properties
properties文件裏面的內容爲:屬性名稱=類型轉換器的全類名(既包名.類名)
如:birthday=com.ljq.type.converter.DateTypeConverter
b) 全局類型轉換
將上面的類型轉換器註冊成全局類型轉換器,在src下新建文件:xwork-conversion.properties ,名稱是固定的,內容格式:java.util.Date=cn.itcast.converter.DateTypeConverter
還有關於基於註解的類型轉換器和上面的原理相同,在struts2的註解裏再介紹,也可先參考:
http://blog.sina.com.cn/s/blog_883da5580100w3bt.html
http://blog.csdn.net/xiaoping8411/article/details/4775936
3. struts2類型轉換錯誤處理
要求Action類繼承ActionSupport,否則無法添加錯誤信息!
在struts2-default.xml中package name="struts-default"的裏面可以找到
在<interceptor-stack name="defaultStack">裏有對上面這個攔截器的引用,如果轉換失敗,例如攔截器裏有異常拋出,那麼struts2會把錯誤信息封裝成fielderror放入ActionContext中,然後默認進入名爲input的視圖.
錯誤信息的國際化:
如果是自定義的轉換器,某個Action特定屬性轉換失敗:在ActionName_zh_CN.properties國際化資源文件中寫
invalid.fieldvalue.屬性名=提示信息即可
如果是struts2默認的類型轉換器,要改變轉換失敗後的英文提示信息,那麼在全局國際化資源文件中寫:
xwork.default.invalid.fieldvalue={0}字段類型轉換失敗!
4. struts2中怎麼設置日期類型的格式
struts.date.format=yyyy-MM-dd只能控制<s:date>標籤中format屬性的默認值
所以需要自己寫日期類型轉換器來實現,自定義的格式
全局的:java.util.Date=converter.MyDateDefaultTypeConverter
或局部的user.opTime=converter.MyDateDefaultTypeConverter
在頁面上顯示時可以使用<s:properties value=”birthday”/>標籤,填寫時也要寫成自定義的格式