雖然struts會有自動的處理方式,讓數據能夠顯示出來,但數據並沒有傳遞到action中對應的變量中。
比如一個action中有一個Date的成員變量,其名字爲birthday.
你可以在result中訪問到birthday數據成員,但是並非傳遞給變量birthday的數據.
對此,我們也需要定義類型轉換器,以便讓傳入的數據能夠正確的轉換成我們需要的格式。
package cn.dzr.converter;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class DateTypeConverter extends DefaultTypeConverter
{
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try
{
if(toType == Date.class)
{
String[] params = (String[])value;
return sdf.parse(params[0]);
}
else if(toType == String.class)
{
Date date = (Date)value;
return sdf.format(date);
}
}
catch(ParseException e)
{
}
return null;
}
}
如上就是一個簡單的類型轉換器。
對於該類,需要注意兩個地方,
第一是其父類爲
com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
struts2中提供了多個類型轉換器,但是以此轉換器爲上品,所以通常情況下,請選擇該類。
第二則是if(toType == Date.class)
{
String[] params = (String[])value;
return sdf.parse(params[0]);
}
else if(toType == String.class)
{
Date date = (Date)value;
return sdf.format(date);
}
在這段轉換代碼中,開始時候是通過string數組傳遞參數。這主要是考慮兼容性。因爲傳遞給action的數據,
可能具有多個值。比如用戶選擇興趣愛好,就可能存在多個值。當我們接受到用戶的瀏覽器請求的時候,可能其帶來
的參數就是一個字符串數組,而不是一個簡單的字符串。
所以,這裏通過數組的形式來處理這個字符串轉向日期格式的問題。
這裏的下面還有一個字符串轉爲日期的操作。
這種情況被稱爲雙向轉換器,因爲當你需要在JSP頁面中顯示你的非String數據的時候,也許你需要按照自己
要求,輸出日期的格式。
好了,在完成了類型轉換器類的編寫好。
我們就需要註冊該類型轉換器,讓其針對某個變量產生作用。我們這裏是局部的類型轉換器。
其具體的步驟如下:
在我們需要使用類型轉換器的action的包下
新建一個文件,文件名爲 actionname-conversion.properties
其內容爲
變量名= 類型轉換器的全路徑
如上面的例子,需要將其應用在cn.dzr.action.HelloWorldAction這個類中的birthday成員。
那麼,就需要在cn.dzr.action包下新建文件
HelloWorldAction-conversion.properties
其內容則是
birthday=cn.dzr.converter.DateTypeConverter
到此,類型轉換器就已經成功的註冊了。