走進Struts2(四)— 自定義轉換器
阿新 • • 發佈:2019-02-13
儘管Struts2提供的內建型別轉換器能滿足絕大多數的需求,但是,有的時候還是需要使用自定義型別轉換器來實現特定的需求。因為Struts2不能自動完成 字串 到 引用型別 的 轉換
需求:實現指定格式的日期轉換 yyyy-MM-dd
1.準備 UserAcrion2類
2.index.jsp@SuppressWarnings("serial") public class UserAction2 extends ActionSupport{ private String name; private Integer age; private Date birth; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public String addUser(){ System.out.println("User2"); return SUCCESS; } }
</head> <body> <s:debug></s:debug> <s:form action="addUser2" namespace="/user" method="get"> <s:textfield name="name" label="姓名" /> <!--<s:property value="%{[0].name}"/>--> <s:textfield name="age" label="年齡" /> <s:textfield name="birth" label="出生日期"/> <s:submit/> </s:form> </body> </html>
3.自定義型別轉換器需要 繼承 StrutsTypeConverter
public class DateConversion extends StrutsTypeConverter { private DateFormat df = null; private DateFormat getDateFormat() { if (df == null) { ServletContext context = ServletActionContext.getServletContext(); /** * 在 web.xml 定義 pattern 型別 */ String pattern = context.getInitParameter("pattern"); if (pattern == null || pattern.trim().isEmpty()) { pattern = "yyyy-MM-dd"; } df = new SimpleDateFormat(pattern); } return df; } @Override public Object convertFromString(Map arg0, String[] values, Class obj) { if (obj == Date.class) { if (values != null && values.length > 0) { String value = values[0]; try { System.out.println(getDateFormat().parseObject(value)); return getDateFormat().parseObject(value); } catch (ParseException e) { throw new RuntimeException(e); } } } return values; } @Override public String convertToString(Map arg0, Object obj) { if (obj instanceof Date) { Date date = (Date) obj; return getDateFormat().format(date); } return null; } }
4.進行配置
型別轉換配置方法有兩種:
一、基於欄位的配置
1.在欄位所在的 Model( Action / JavaBean) 的包下, 新建一個 ModelClassName-conversion.properties 檔案
2.輸入鍵值對: fieldName=型別轉換器的全類名.
檔名 UserAction2-conversion.properties
birth=cn.cil.conversion.DateConversion
PS:第一次使用該轉換器時建立例項,所以型別轉換器是單例項的!
二、基於型別的配置
把UserAction2只的屬性抽取組成一個javaBean。
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String addUser(){
System.out.println("User1");
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
在 src 下新建 xwork-conversion.properties待轉換的型別=型別轉換器的全類名
java.util.Date=cn.cil.conversion.DateConversion
PS:在當前 Struts2 應用被載入時建立例項
覆蓋預設的錯誤訊息:
1). 在對應的 Action 類所在的包中新建
ActionClassName.properties 檔案, ActionClassName 即為包含著輸入欄位的 Action 類的類名
2). 在屬性檔案中新增如下鍵值對: invalid.fieldvalue.fieldName=xxx
UserAction.properties
invalid.fieldvalue.birth=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u751F\u65E5