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