struts2自定義類型轉換器
為什么需要類型轉換器
當在表單中輸入填入日期時, 格式有很多,比如可以輸入1990年1月1日, 也可以填1990-01-01等多種方法, 這時候使用自定義類型的轉換器可以將格式進行轉化, 變為Action類可讀的格式
類型轉換器的種類
1. 基于OGNL的類型轉換器
要創建基于ognl的類型轉換器, 必須實現DefaultTypeConverter 并重寫convertValue方法
在入口的jsp頁面表單中, 放入兩個文本框, 分別輸入一個數字,和一個日期, 由于用戶很可能不輸入正確的數字, 或者多種格式的日期,所以我們需要自定義類型轉換 ,還需要對錯誤的進行處理
<body>
<s:form action="action">
<s:textfield name="num" label="數字"></s:textfield>
<s:textfield name="birthday" label="生日"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
action類僅僅如此,不需要別的操作
public class Struts2Action extends ActionSupport{
Date birthday;
int num;
@Override
public String execute() throws Exception {
return Action.SUCCESS;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
再來寫我們的轉換器, 繼承DefaultTypeConverter
其中convertValue方法的三個參數分別表示為:
context 上下文對象
value 需要進行類型轉換的參數, 是一個數組
toType 需要轉成什么類.
方法中分為兩種清空,使用toType來區分是從字符串轉成日期,還是從日期轉成字符串,其中dfs數組用多個SimpleDateFormat來格式化用戶的輸入,如果都沒有到達用戶的輸入要求則會拋出TypeConversionException();
public class MyDateConverter extends DefaultTypeConverter{
//日期格式
final DateFormat[] dfs = {new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy.MM.dd")};
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
System.out.println("進入");
if (toType == Date.class){
String dateStr = ((String[])value)[0];
System.out.println("form:"+dateStr);
for (int i=0; i<dfs.length; i++){
try {
return dfs[i].parse(dateStr);
} catch (ParseException e) {
continue;
}
}
}else if (toType == String.class){
Date date = (Date)value;
return dfs[0].format(date);
}
throw new TypeConversionException();
}
}
完成了轉換器, 接著要將轉換器和action類建立聯系,不然他兩不就不認識了, 聯系起來有兩種方式,一種是全局范圍轉換器, 另一個是應用于特定類的轉換器
應用于特定類的轉換器配置如下:
在action類同包下創建文件:ClassName-conversion.properties (其中ClassName指的是action類名) 編輯內容: 屬性名=類型轉換器的限定名
全局范圍轉換器:
在src目錄下創建xwork-converter.properties文件, 編輯內容:需要轉換的類的限定名=類型轉換器限定名 (這里的需要轉換的類是java.util.Date)
配置struts.xml文件如下, 其中當輸入錯誤的信息就會action類就會返回input,將錯誤信息回顯到index.jsp中
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="action" class="defaultStruts2.Struts2Action">
<result name="success">success.jsp</result>
<result name="input">index.jsp</result>
</action>
</package>
</struts>
為了讓當輸入錯誤信息返回到index.jsp后,在頁面上顯示中問, 還需要修改錯誤的信息,步驟如下:
在Action同包下創建ClassName.properties文件(其中ClassName表示Action類,我這里是Struts2Action) 編輯文件如下 , \u是由于properties文件無法顯示中文的原因
invalid.fieldvalue.birthday=\u65E5\u671F\u9519\u8BEF
invalid.fieldvalue.num=\u6570\u5B57\u9519\u8BEF
最后的success.jsp顯示正確的信息:
<body>
<s:property value="num"/>
<s:property value="birthday"/>
<s:debug></s:debug>
</body>
錯誤結果:
正確結果:
2.基于struts2的類型轉換器
使用struts2的類型轉換器需要繼承StrutsTypeConverter類, 并實現兩個抽象方法convertFromString和convertToString, 其中第一個方法作用為將String => 對象, 第二個作用是對象 =》 String.
基于struts2的類型轉換器代碼如下, 感覺也就是把方法寫分開了, 其他都一樣
public class DateConverter extends StrutsTypeConverter{
//日期格式
final DateFormat[] dfs = {new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy.MM.dd")};
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
String dateStr = values[0];
for(int i =0 ;i<dfs.length; i++){
System.out.println(dateStr);
try {
return dfs[i].parse(dateStr); //轉成date類型
} catch (Exception e) {
continue;
}
}
throw new TypeConversionException();
}
@Override
public String convertToString(Map context, Object o) {
Date date = (Date)o;
String str = new SimpleDateFormat("yyyy-MM-dd").format(date);
return str;
}
}
智能推薦
自定義類型轉換器
自定義類型轉換器 字符串變成對象 自定義步驟 1 修改input.jsp頁面,實現Employee字符串變為POJO 2 Handler 3 自定義的轉化器(@Component) 4 springmvc的配置文件ConversionServiceFactoryBean 5 <mvc:annotation-driven>引用轉換器 6 debug ...
自己定義struts2中action類型轉換器
DateAction.java中代碼例如以下: struts2.xml: date.jsp: 代碼如上,假設在地址欄輸入: http://localhost:8080/struts2_itheima/dateAction? time=2011-01-04 控制臺和jsp都可以正常輸出: 可是假設地址欄輸入: http://localhost:8080/struts2_itheima/dateAct...
Struts2 轉換器應用
1. 為什么要使用轉換器? 答:所有頁面與控制器傳遞的數據均為String類型,而我們在對其進行處理時可能會用到各種數據類型,程序無法自動完成數據類型的轉換,需要我們在代碼中手動完成,這個過程稱為類型轉換。 2.在struts2中內置了類型轉換器,如果內置轉換器滿足不了我們的需求的話,那么我們就要自己創建屬于自己的類型轉換器了。 先講一個重要的接口ongl.TypeConverter,該接口里面只...
Struts2第五篇【類型轉換器、全局、局部類型轉換器】
前言 上篇博文已經講解了,Struts2為我們實現了數據自動封裝…由上篇的例子我們可以看出,表單提交過去的數據全都是String類型的,但是經過Struts自動封裝,就改成是JavaBean對應成員變量的類型了。 但是呢,日期類型只支持是yyyy-MM-dd這種格式的,因為我們在上個例子中直接使用的是Struts支持的格式,因此沒有報錯…本篇博文就是講解Struts如何...
Struts2框架之自定義參數類型轉換
在前端提交的表單中有時會遇到需要手動轉換的參數類型,比如日期格式,struts2默認的轉換器只能將yyyy-MM-dd格式的字符串轉成日期Date型,但是假設現在的需求是yyyy/MM/dd,這時我們就需要自定義轉換器。 1、日期轉換Demo 首先我們通過一個用戶注冊的Demo演示日期的轉換。 ①、項目目錄結構 ②、User.java類 ③、RegisterAction.java類 ④、strut...
猜你喜歡
SpriingMVC 04 類型轉換器---自定義類型轉換器
創建一個添加商品信息的應用程序,通過使用自定義類型的轉換器實現功能 1.目錄結構 2.注解控制器的應用 2.1 web.xml文件 , 導入jar 包(這里不在提醒) 2.2 DispatcherServlet-servlet.xml 文件 建議將 這個自定義轉換器代碼 放到 掃描器的上面, 我這里之前因為這給報了500,說是找不到 這個自定義轉換器 2.3 Controller 文件 2.4 自...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...