1. 程式人生 > >自己定義struts2中action類型轉換器

自己定義struts2中action類型轉換器

ansi work row 接受 4.0 open 技術 oos lang

DateAction.java中代碼例如以下:

package com.itheima.action;

import java.util.Date;

public class DateAction {

	private Date time;
	public Date getTime() {
		return time;
	}
	public void setTime(Date time) {
		this.time = time;
	}
	public String execute() {
		return "success";
	}
}

struts2.xml:

<action name="dateAction" class="com.itheima.action.DateAction">
	<result name="success">/date.jsp</result>
</action>

date.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!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>
	${time }
</body>
</html>

代碼如上,假設在地址欄輸入:

http://localhost:8080/struts2_itheima/dateAction?

time=2011-01-04

控制臺和jsp都可以正常輸出:

技術分享

可是假設地址欄輸入:

http://localhost:8080/struts2_itheima/dateAction?

time=20110104

控制臺輸出null,網頁則輸出

技術分享

這是由於此種輸入方式,time參數傳遞的是String類型。調用setTime(Date time)方法出錯,此時private Date time;獲取到的值為空。

可是jsp能原樣輸出是由於struts2底層當setTime(Date time)方法出錯時會自己主動獲取參數的值原樣輸出

解決以上問題的方式是創建自己定義類型轉換器:

DateTypeConverter.java:

package com.itheima.type.converter;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
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) {
		/*
		 	value:被轉換的數據,因為struts2須要接受全部的請求參數,比方復選框
		 	toType:將要轉換的類型
		 */
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmdd");
		if(toType == Date.class) {
			/*
			 *	因為struts2須要接受全部的請求參數。比方復選框,這就導致一個參數名稱相應多個值。
			 *	所以框架採用getParamterValues方法獲取參數值,這就導致獲取到的為字符串數組
			 *	所以value為字符串數組
			 */
			String[] strs = (String[])value;
			Date time = null;
			try {
				time = dateFormat.parse(strs[0]);
			} catch (ParseException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
			return time;
		} else if(toType == String.class){
			Date date = (Date)value;
			String time = dateFormat.format(date);
			return time;
		}
		return null;
	}

	
}

然後在DateAction所在包下創建DateAction-conversion.properties文件。這裏DateAction為所要進行參數類型轉換的action,其它格式固定,即:XXX-conversion.properties

DateAction-conversion.properties內容例如以下:

time=com.itheima.type.converter.DateTypeConverter
項目樹:

技術分享

====================================================================================================

以上的是針對某一個action的局部類型轉換器。

也能夠創建全局類型轉換器,這裏僅僅須要改動資源文件:

在WEB-INF/classes文件夾下創建xwork-conversion.properties,在該文件裏配置的內容為:

待轉換的類型=類型轉換期的全類名

本例:

java.util.Date=com.itheima.type.converter.DateTypeConverter
這樣全部的action都會擁有該類型轉換器

自己定義struts2中action類型轉換器