struts2-型別轉換器
阿新 • • 發佈:2018-12-06
struts2在接受資料後,會將接收到的資料轉換成對應的資料型別。這裡是struts2中型別轉換器的作用,而其中預設的型別轉換器有如下(struts-default.xml檔案中):
頁面資料提交,轉換器收到資料後執行convertValue()方法,將相應的string字串按照內部對應屬性型別進行轉換,在資料傳回頁面時,有經過轉換器將所以轉換成string字串。
在struts2中要實現資料回顯(格式錯誤時跳轉回提交頁面,顯示資料並提示錯誤)要藉助struts-tags的標籤,並在struts.xml對應頁面action下,加入name=”input”的頁面(struts2預設要求)。
<result name="input">/test.jsp</result>
test.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:form action="test/some" method="post">
<s:textfield name="date" label="date"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:submit value="submit"></s:submit>
</s:form>
</body>
</html>
如上,在資料格式錯誤時會有相應提示與資料回顯:
自定義的型別轉換器(時間型別轉換器):
1、參照原始碼
2、myDateConvert.java
public class myDateConvert extends DefaultTypeConverter {
//value接受的是String[],class是要被轉換的型別,因為頁面到服務端和服務端到頁面都要經過轉換器,所以內部是雙向邏輯。
@Override
public Object convertValue(Object value, Class toType) {
SimpleDateFormat sdf = null; //new一個時間格式空物件
try{
if(toType == Date.class){//頁面到服務端
String dateStr = ((String[])value)[0];//獲取要被轉換為date引數的第一個string字串
sdf = getSimpleDateFormat(dateStr);//通過方法獲取到對應的格式
ActionContext.getContext().getSession().put("sdf", sdf);//將格式存入session中,以便在回顯和頁面獲取資料時的格式轉換
return sdf.parse(dateStr);//返回按格式轉換的date值
}
else if(toType == String.class){//服務端到頁面
Date date = (Date)value;//回顯時資料單值,強轉date
sdf = (SimpleDateFormat)ActionContext.getContext().get("sdf");//session獲取格式
return sdf.format(date);//返回按格式轉換後的string字串
}
}catch(ParseException e){
e.printStackTrace();//這個解析異常只會在後臺丟擲,不會在回顯頁面提示,所以在獲取格式的方法中就丟擲型別轉換異常
}
return super.convertValue(value, toType);
}
private SimpleDateFormat getSimpleDateFormat(String dateStr) {
//根據這裡的格式進行判斷,若沒有相應格式即丟擲異常
SimpleDateFormat sdf = null;
if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", dateStr)){//用模組匹配來判斷格式
sdf = new SimpleDateFormat("yyyy-MM-dd");
}else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)){
sdf = new SimpleDateFormat("yyyy/MM/dd");
}else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)){
sdf = new SimpleDateFormat("yyyyMMdd");
}else {
throw new TypeConversionException();//若格式都不符合則丟擲異常
}
return sdf;
}
}
3、這是自定義的轉換器,要進行配置,為action指定轉換器。
通過區域性型別轉換註冊:
- 在指定action所在包下,新建properties檔案,action名-conversion.properties
- 內容:屬性=轉換器的全限定性類名
執行:
4、這裡資料回顯後的錯誤提示都是英文,於是可以自定義:
- 在對於action包下,新建action名.properties
- 內容:invalid.fieldvalue.變數名=錯誤提示資訊
5、測試執行: