1. 程式人生 > >走進Struts2(四)— 自定義轉換器

走進Struts2(四)— 自定義轉換器

儘管Struts2提供的內建型別轉換器能滿足絕大多數的需求,但是,有的時候還是需要使用自定義型別轉換器來實現特定的需求。因為Struts2不能自動完成 字串 到 引用型別 的 轉換

需求:實現指定格式的日期轉換 yyyy-MM-dd

1.準備 UserAcrion2類

@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;
	}

}
2.index.jsp
</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