1. 程式人生 > >struts2之型別轉換

struts2之型別轉換

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專案中需要轉換的型別過多,基於欄位的配置檔案可能有多個,而基於型別的配置就只有一個。