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

struts2之日期型別轉換

一,概述

struts2中預設會對1995-07-08這種日期型別的資料進行型別轉換,轉換為Date型別,但是有時使用者在jsp頁面提交表單時提交的是19950708、1995年07月08日這種型別的話,那麼就會轉換出錯。解決方法當然就是自定義型別轉換器了。

二,自定義區域性型別轉換器

1)註冊頁面提交資料
<form action="${pageContext.request.contextPath }/user_register" method="post">
    	使用者名稱:<input type="text" name="user.username"/><br/>
    	密碼:<input type="password" name="user.pwd"/><br/>
    	年齡:<input type="text" name="user.age"/><br/>
    	生日<input type="text" name="user.birth"/><br/>
    	<input type="submit" value="註冊"/><br/>
    </form>
2)對應的JavaBean
package com.bighuan.d_type;

import java.util.Date;

public class User {

	private String username;
	private String pwd;
	private int age;
	private Date birth;

	public User() {

	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}

}

3)acting類
package com.bighuan.d_type;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{

	
	private User user;
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}



	public String register(){
		System.out.println(user.getUsername());
		System.out.println(user.getPwd());
		System.out.println(user.getAge());
		System.out.println(user.getBirth());
		
		return SUCCESS;
	}
	
}
4)配置action,使用的是全域性配置,註冊成功跳轉到index.jsp.
<package name="type" extends="struts-default">
		<global-results>
			<result name="success">/index.jsp</result>
		</global-results>

		<action name="user_*" class="com.bighuan.d_type.UserAction"
			method="{1}">
		</action>

	</package>
5)自定義轉換器類,要繼承StrutsTypeConverter類.
package com.bighuan.d_type;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;
import org.omg.CORBA.StructMemberHelper;


/**
 * 自定義型別轉換器
 * @author bighuan
 *
 */
public class MyConverter extends StrutsTypeConverter {
	// 新需求: 要求專案中要支援的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日..

		// 先定義專案中支援的轉換的格式
		DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"),
				new SimpleDateFormat("yyyyMMdd"),
				new SimpleDateFormat("yyyy年MM月dd日") };
	/**
	 * 把String轉換為指定的型別 【String To Date】
	 * 
	 * @param context
	 *            當前上下文環境
	 * @param values
	 *            jsp表單提交的字串的值
	 * @param toClass
	 *            要轉換為的目標型別
	 */
	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		// 判斷: 內容不能為空
		if(values.length== 0 || values == null){
			return null;
		}
		// 判斷型別必須為Date
		if(Date.class != toClass){
			return null;
		}
		
		// 迭代:轉換失敗繼續下一個格式的轉換; 轉換成功就直接返回
				for (int i=0; i<df.length; i++) {
					try {
						return df[i].parse(values[0]);
					} catch (Exception e) {
						continue;
					}
				}
		return null;
	}

	@Override
	public String convertToString(Map arg0, Object arg1) {
		// TODO Auto-generated method stub
		return null;
	}

}

6)配置區域性轉換器,命名格式為:Action名稱-conversion.properties.Action就是為那個Action類準備轉換器的那個Action的名字.當前轉換器的名字為UserAction-conversion.properties, 裡面的內容為:
user.birth=com.bighuan.d_type.MyConverter
需要注意的是,轉換器必須和目標轉換器類(UserAction)在同一個包下,轉換器的命名格式是有一定規則的,必須是Action名稱-conversion.properties.

三,自定義全域性型別轉換器

1)上面那種方式只對UserAction有效,如果其他的Action也要進行型別轉換的話,還要寫過一個區域性型別轉換器.但是使用全域性型別轉換器就只要配置一個即可. 2)在src目錄下,新建一個xwork-conversion.properties,名稱固定哦,就是這個名字.properties檔案內容為:
java.util.Date=com.bighuan.d_type.MyConverter
這樣一個全域性型別轉換器就完成了.