Struts2的類型轉換器
一、概述
在B/S應用中,將字符串請求參數轉換為相應的數據類型,是MVC框架提供的功能,而Struts2是很好的MVC框架實現者,理所當然,提供了類型轉換機制。
Struts2的類型轉換是基于OGNL表達式的,只要我們把HTML輸入項(表單元素和其他GET/POET的參數)命名為合法的OGNL表達式,就可以充分利用Struts2的轉換機制。
除此之外,Struts2提供了很好的擴展性,開發者可以非常簡單的開發自己的類型轉換器,完成字符串和自定義復合類型之間的轉換。總之,Struts2 的類型轉換器提供了非常強大的表現層數據處理機制,開發者可以利用Struts2的類型轉換機制來完成任意的類型轉換。
二、實現自定義類型轉換器
實現TypeCoverter接口,或者繼承DefaultTypeConverter實現類(該類實現了TypeCoverter接口),通過繼承該實現類來實現自己的類型轉換器。重寫convertValue方法即可。
為了簡化類型轉換器的實現,Struts2提供了一個StrutsTypeConverter抽象類,這個抽象類是DefaultConverter的子類。實現了方法,并提供了2個不同轉換方向的方法:Object
convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。
三、注冊應用
實現了自定義類型轉換器之后,將該類型轉換器注冊在Web應用中,Struts2框架才可以正常使用該類型轉換器。
關于類型轉換器的注冊方式,主要有3中:
A、注冊局部類型轉換器:僅僅對某個Action的屬性起作用。
B、注冊全局類型轉換器:對所有Action的特定類型的屬性都會生效。
C、使用JDK1.5的注釋來注冊類型轉換器:通過注釋方式來生成類型轉換器。
1、局部類型轉換器
提供如下格式的文件
文件名: ActionName-conversion.properties
內容:多個propertyName(屬性名)=類型轉換器類(含包名),如 date=com.aumy.DateConverter
存放位置:和ActionName類相同路徑。
2、全局類型轉換器
提供如下格式的文件
文件名: xwork-conversion.properties
內容: 多個“復合類型=對應類型轉換器”項組成,如 java.Util.Date=com.aumy.DateConverter
存放位置:WEB-INF/classes/目錄下。
四、應用示例
由于Struts2對日期轉換顯示時,會顯示日期和時間,現在項目只需要顯示日期,所以采用自定義的類型轉換器來實現日期顯示。
1、類型轉換類
public class DateConverter extends StrutsTypeConverter {
private static String DATE_TIME_FOMART_IE = "yyyy-MM-dd HH:mm:ss";
private static String DATE_TIME_FOMART_FF = "yy/MM/dd hh:mm:ss";
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Date date = null;
String dateString = null;
if (values != null && values.length > 0) {
dateString = values[0];
if (dateString != null) {
// 匹配IE瀏覽器
SimpleDateFormat format = new SimpleDateFormat(DATE_FOMART_IE);
try {
date = format.parse(dateString);
} catch (ParseException e) {
date = null;
}
// 匹配Firefox瀏覽器
if (date == null) {
format = new SimpleDateFormat(DATE_FOMART_FF);
try {
date = format.parse(dateString);
} catch (ParseException e) {
date = null;
}
}
}
}
return date;
}
@Override
public String convertToString(Map context, Object o) {
// 格式化為date格式的字符串
Date date = (Date) o;
String dateTimeString=DateUtils.formatDate(date);
}
} </pre><pre class="brush:java; toolbar: true; auto-links: false;"> public class DateConverter extends StrutsTypeConverter {
private static String DATE_TIME_FOMART_IE = "yyyy-MM-dd HH:mm:ss";
private static String DATE_TIME_FOMART_FF = "yy/MM/dd hh:mm:ss";
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Date date = null;
String dateString = null;
if (values != null && values.length > 0) {
dateString = values[0];
if (dateString != null) {
// 匹配IE瀏覽器
SimpleDateFormat format = new SimpleDateFormat(DATE_FOMART_IE);
try {
date = format.parse(dateString);
} catch (ParseException e) {
date = null;
}
// 匹配Firefox瀏覽器
if (date == null) {
format = new SimpleDateFormat(DATE_FOMART_FF);
try {
date = format.parse(dateString);
} catch (ParseException e) {
date = null;
}
}
}
}
return date;
}
@Override
public String convertToString(Map context, Object o) {
// 格式化為date格式的字符串
Date date = (Date) o;
String dateTimeString=DateUtils.formatDate(date);
}
} </pre>注:DateUtils.formatDate(date);是調用該項目一個基礎包的公用方法,如果單獨使用,直接用日期格式化代碼代替。<span> </span><br style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;padding-top:0px;" />
2、xwork-conversion.properties配置文件
java.util.Date=com.aumy2008.converter.DateConverter