struts2之型別轉換
阿新 • • 發佈:2019-01-06
http沒有型別的概念。在html表單中,每一項表單輸入只可能是一個字串或者一個字元陣列,在伺服器端,必須把String轉為特定的資料型別。所以在struts2中,從一個表單到一個Action物件的過程中出現了型別轉換的概念。
struts2中有基本的資料轉換功能,如int、boolean等基本型別,日期格式,集合型別的轉換。我想用過的都很清楚,不再總結,在這裡就說一說自定義型別轉換假設需求:一種自定義的日期格式為“yy/MM/dd”,要求對其進行轉換。struts中預設的轉換格式為“yy-MM-dd”,但是如果要實現這種格式,就得自定義轉換器
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; /** * 自定義日期格式的型別轉換器 * @author zx * 2014-6-9 */ @SuppressWarnings("rawtypes") public class DateConvert extends StrutsTypeConverter{ private SimpleDateFormat dateFormat;//轉換日期格式的SimpleDateFormat物件 public DateConvert() {//建構函式 建立SimpleDateFormat物件 System.out.println("ConvertInit!!!"); dateFormat = new SimpleDateFormat("yy/MM/dd"); } /** * 將從頁面傳過來的日期格式進行封裝返回為Date型別 */ @Override public Object convertFromString(Map arg0, String[] values, Class toClass) { System.out.println("FromString!!!"); if(Date.class == toClass){ String value = values[0]; try { return dateFormat.parseObject(value); } catch (ParseException e) { e.printStackTrace(); } } return null; } /** * 將從後臺伺服器傳到頁面的Date型別轉為String型別 */ @Override public String convertToString(Map arg0, Object o) { System.out.println("ToString!!!"); if(o instanceof Date){ return dateFormat.format((Date)o); } return null; } }
接下來需要在struts2中配置所寫的轉換器,配置型別轉換器有兩種方式:
(1). 基於欄位的配置:> 在欄位所在的 Model(可能是 Action, 可能是一個 JavaBean) 的包下, 新建一個 ModelClassName-conversion.properties 檔案
> 在該檔案中輸入鍵值對: fieldName=型別轉換器的全類名.
> 第一次使用該轉換器時建立例項.
> 型別轉換器是單例項的!
(2). 基於型別的配置:
> 在 src 下新建 xwork-conversion.properties
> 鍵入: 待轉換的型別=型別轉換器的全類名.
> 在當前 Struts2 應用被載入時建立例項.
先看一下第一種方式:基於欄位配置
首先需要一個Action,在這裡即為Model
import java.util.Date;
public class DateAction {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String execute(){
System.out.println(date);
return "success";
}
}
接下來需要寫配置檔案,DateAction-conversion.properties 保證和DateAction(Model)在同一目錄下
內容為:date=xx.xx.DateConvert(全類名 )
第二種方式:基於型別的配置
這種方式當然也需要DateAction,只是配置檔案必須寫在src目錄下(和struts.xml同一目錄),
名字為 xwork-conversion.properties內容為:
java.util.data=xx.xx.DateConvert(全類名)
jsp頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<s:form action="date">
<s:textfield name="date" label="date"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
Action配置:
<action name="date" class="com.struts.date.DateAction">
<result name="success">/date.jsp</result>
</action>
結果:這兩種方式都會在struts2框架中註冊自定義轉換器,都能將“yy-MM-dd”型別的日期轉換為Date型別。
不同之處主要就是載入時機不同,基於欄位的配置是在第一次使用的時候載入,而基於型別的配置是在載入struts2時候載入,這就導致了型別配置檔案在載入的時候很可能servlet容器還沒有準備完成,比如,在初始化轉換器中得到的ServletContext為空,所以必須掌握兩種方式建立時機不同帶來的後果;還有一點就是很明顯的了,如果一個struts2專案中需要轉換的型別過多,基於欄位的配置檔案可能有多個,而基於型別的配置就只有一個。