客戶端發送過來的數據都是以String[]的形式保存的。在struts2里面僅僅很少的數據類型轉換支持,例如原生的數據類型。還有常見的String或者Date類型。struts無法知道我們會使用哪種數據類型。所以它提供一些實現自定義類型轉換的類。具體的轉換過程如下:
首先我們要定義好我們需要的數據類型。例如定義一個User類型。User類代碼如下:
package com.struts2.customtype; public class User { private String name; private String surname; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } }
然后定義action類來處理請求:
package com.struts2.customaction; import com.opensymphony.xwork2.ActionSupport; import com.struts2.customtype.User; public class UserAction extends ActionSupport{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { // TODO Auto-generated method stub return ActionSupport.SUCCESS; } }
接着我們就來定義自定義類型轉換器,這個轉換器需要繼承一個類叫:DefaultTypeConverter類。它是由obgl這個包提供的。我們要重寫里面的convertValue方法,然后這個方法會被struts調用。代碼如下:
package com.struts2.conversion; import java.lang.reflect.Member; import java.util.Map; import java.util.StringTokenizer; import com.struts2.customtype.User; import ognl.DefaultTypeConverter; public class UserConversion extends DefaultTypeConverter{ @Override public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType) { // TODO Auto-generated method stub if(toType==User.class){ String[] param=(String[]) value; StringTokenizer st= new StringTokenizer(param[0], ";"); String name=st.nextToken(); String surname=st.nextToken(); User user=new User(); user.setName(name); user.setSurname(surname); return user; } else if (toType==String.class) { User user=(User) value; return "your name is : "+user.getSurname()+" "+user.getName(); } return null; } }
我在convertValue方法里面實現了轉換的過程,就是判斷如果是字符串類型就將字符串分割成兩部分,一部分是用戶名,一部分是密碼。然后將分割好的兩個字符串賦予一個新new出來的User對象。然后將這個user對象return回去。這樣就實現了一個轉換。
后面代碼原理一樣。
這樣我們就寫好了一個我們自己的類型轉換器。
現在我們寫了三個類。這三個類現在還是毫無關系的。那么如何將他們關聯起來呢?struts讓我們在自定義action 的包下建一個properties文件。這個文件名字有要求的。文件名為:aactionname-conversion.properties
然后我們在這個文件里面填寫對應的鍵值對,field=actionconvert.Class。 field就是你的action 里面要被轉換的屬性的名字。actionconvert.Class就是你自己寫的那個轉換器類。寫完之后保存。這樣一個類型轉換過程就完成了!
效果圖如下:


