struts2 自定義類型轉換器
Struts2的類型轉換是基于OGNL表達式的,由于請求的參數都是字符串,而JAVA 本身屬于強類型的的語言,這樣就需要把請求參數字符串轉換成其他類型。
Struts2的類型轉換器都需要實現一個TypeConverter接口,該接口位于ognl.jar包內,也是就Struts2框架的轉換器使用了OGNL技術。該接口定義了一個convertValue()方法,實現該接口的類型轉換器實現類都需要重寫該方法來進行類型轉換。OGNL還提供了一個實現TypeConverter接口的類DefaultTypeConverter,開發者只要繼承該類,就可以開發類型轉換器的實現類。
二、Struts2自定義類型轉換器分為局部類型轉換器和全局類型轉換器
(1)局部類型轉換器
如果頁面傳來一個參數reg.action?birthday=2010-11-12到后臺action,然后屬性用date類型是可以接收到的,但是如果傳的是20101112這樣類型的字符串,用date類型是獲取不到,并且會出現錯誤的,struts2提供了一種類型轉換器供我們使用。
以下為局部類型轉換器的開發步驟
a.首先要寫一個類來繼承DefaultTypeConverter
b.然后覆蓋convertValue這個方法,在里面進行數據轉型
c.在action類所在的包下放置ActionClassName-conversion.properties文件,ActionClassName是類名,后面的-conversion.properties是固定的寫法,
如:HelloWorldAction-conversion.properties
d.Properties文件里面的內容為:屬性名稱=類型轉換器的全類名(既包名.類名)
如:birthday=com.ljq.type.converter.DateTypeConverter
(2)全局類型轉換器
如果業務需求所有的日期都要轉換,則可以使用全局類型轉換器,只要在src根目錄下面放置xwork-conversion.properties文件,并且properties文件中的內容為:
待轉換的類型=類型轉換器的全類名
如:java.util.Date = com.type.Converter.DateTypeConverter 即可
代碼
Action類
package com.ljq.action;
import java.util.Date;
public class HelloWorldAction {
// 日期
private Date birthday;
// 枚舉
private Gender gender;
public String execute() {
return "success";
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
System.out.println("birthday="+birthday);
this.birthday = birthday;
}
// 自定義枚舉
public enum Gender {
MAN,WOMEN
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
System.out.println("gender="+gender);
this.gender = gender;
}
}
日期類型轉換器
package com.ljq.type.converter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
/**
* 日期自定義類型轉換器
*
* @author jiqinlin
*
*/
public class DateTypeConverter extends DefaultTypeConverter {
@SuppressWarnings("unchecked")
@Override//其中,context是類型轉換環境的上下文,value是需要轉換的參數,toType 是轉換后的目標類型。
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
try {
if (toType == Date.class) { // 當字符串向Date類型轉換時,這時value的來源是從url或者表單提交
String[] params = (String[]) value;
return sdf.parseObject(params[0]);// Request.getParameterValues() ,轉換為string數組是因為像復選框之類的組件可以提交的值是一個數組//解析成日期格式(注意:這里的日期一定要是util包下的日期)
} else if (toType == String.class) {//當Date轉換成字符串時,這時value的來源是action類,因此value不要強轉為數組形式(注意:使用EL表達式向頁面輸出是該if不會被執行,只有使用OGNL表達式向頁面輸出是才會進入此if語句)
Date date=(Date)value;
return sdf.format(date);//轉換為字符串
}
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return null;
}
}
枚舉類型轉換器
package com.ljq.type.converter;
import java.util.Map;
import com.ljq.action.HelloWorldAction.Gender;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
/**
* 枚舉自定義類型轉換器
*
* @author jiqinlin
*
*/
public class GenderTypeConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
if(toType==Gender.class){ //當字符串向Gender類型轉換時
String[] params=(String[])value;
return Gender.valueOf(params[0]);
}else if (toType==String.class) { //當Gender轉換成字符串時
Gender gender=(Gender)value;
return gender.toString();
}
return null;
}
}
配置類型轉換器
測試路徑
日期
http://localhost:8083/struts2/control/employee/list_execute.do?birthday=20110315 23:34:55
枚舉
http://localhost:8083/struts2/control/employee/list_execute.do?gender=WOMEN
局部類型轉換器: HelloWorldAction-conversion.properties
birthday=com.ljq.type.converter.DateTypeConverter
gender=com.ljq.type.converter.GenderTypeConverter
全局類型轉換器: xwork-conversion.properties
java.util.Date=com.ljq.type.converter.DateTypeConverter
在頁面打印日期和枚舉的值
birthday=${birthday }
gender=${gender }
參考鏈接:
http://blog.csdn.net/gzx2080205/article/details/6340056
http://blog.163.com/taodengwen@126/blog/static/87199341201282712417646/
智能推薦
自己定義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】(2)Struts2校驗框架、Struts2攔截器、Struts2轉換器
一、Struts2校驗框架 輸入校驗幾乎是任何一個系統都需要開發的功能模塊,我們無法預料用戶如何輸入,但是必須全面考慮用戶輸入的各種情況,尤其需要注意那些非正常輸入。Struts2提供了功能強大的輸入校驗機制,通過Struts2內建的輸入校驗器,在應用程序中無需書寫任何代碼,即可完成大部分的校驗功能,并可以同時完成客戶端和服務器端的校驗。 如果應用的輸入校驗規則特別,Struts2也允許通過重寫v...
Struts2(12)_Struts2 攔截器
本系列博客匯總在這里:Struts2 匯總 攔截器 一、struts 攔截器介紹 二、自定義攔截器 三、攔截器和攔截器棧的配置 四、排除 Action 的攔截 源碼工程文件為:struts2_14 一、struts 攔截器介紹 Struts2 的核心就是攔截器,param,modelDriven,validation,servletAPI 等等這些都是攔截器完成的功能。 服務器啟動時實例化 Str...
Struts2框架之自定義參數類型轉換
在前端提交的表單中有時會遇到需要手動轉換的參數類型,比如日期格式,struts2默認的轉換器只能將yyyy-MM-dd格式的字符串轉成日期Date型,但是假設現在的需求是yyyy/MM/dd,這時我們就需要自定義轉換器。 1、日期轉換Demo 首先我們通過一個用戶注冊的Demo演示日期的轉換。 ①、項目目錄結構 ②、User.java類 ③、RegisterAction.java類 ④、strut...
Struts2 自定義攔截器
1. 什么是攔截器 攔截器是Struts2最強大的特性之一,是Struts2的核心之一,Struts2中的很多功能都是由攔截器完成的,是AOP編程思想的一個應用形式。 自定義一個攔截器需要三步: 1 .自定義一個實現Interceptor接口(或者繼承自AbstractInterceptor)的類。 2 .在struts.xml中注冊上一步中定義的攔截器。 3 .在需要使用的Action中引用上述...
猜你喜歡
struts2中自定義攔截器
struts2里在struts-default.xml文件中有個叫defaultStack的攔截器棧這是默認的攔截器棧,我們之前的參數封裝params和servlet-config攔截器都包含在這里面。當這里面的攔截器滿足不了我們的需求時,我們可以自定義攔截器或攔截器棧,并將其設置為默認攔截器棧。 這里我們自定義一個登陸驗證攔截器,除了登陸動作以外,其他動作全部攔截,那么此時我們需要一個叫Meth...
struts2自定義攔截器
第一步:寫action 第二步:寫攔截器 第三步:配置web.xml 第四步:配置struts2.xml 第五步:登錄頁面(login.jsp) 第六步:主頁面(main.jsp) 登錄界面: 直接進入主頁面 登錄后才能顯示商品信息...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...