struts2之日期型別轉換
阿新 • • 發佈:2019-02-13
一,概述
struts2中預設會對1995-07-08這種日期型別的資料進行型別轉換,轉換為Date型別,但是有時使用者在jsp頁面提交表單時提交的是19950708、1995年07月08日這種型別的話,那麼就會轉換出錯。解決方法當然就是自定義型別轉換器了。二,自定義區域性型別轉換器
1)註冊頁面提交資料2)對應的JavaBean<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>
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類
4)配置action,使用的是全域性配置,註冊成功跳轉到index.jsp.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; } }
<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
這樣一個全域性型別轉換器就完成了.