我們都知道,在發出的Http請求資訊中,所有的請求參數都是字元串類型的。但是我們在背景處理這些資料時,可能需要将某些參數轉化成相應的資料類型後才進行業務邏輯的處理。
在Struts2架構中,提供了内建的類型轉換器。這些轉換基本能夠滿足我們日常開發需要。
字元串參數轉換成目标資料類型 |
Boolean和boolean:完成字元串和布爾值之間的轉換 |
Character和char:完成字元串和字元值之間的轉換 |
Integer 和 int:完成字元串和整形值之間的轉換 |
Long 和 long:完成字元串和長整型值之間的轉換 |
Float 和 float:完成字元串和單精度浮點型值之間的轉換 |
Double 和 double:完成字元串和雙精度浮點型值之間的轉換 |
Date:完成字元串和日期型值之間的轉換 |
對象:完成字元串和POJO類型的值之間的轉換,基于ONGL表達式實作預設轉換。 |
數組:預設情況下隻能轉換成字元串數組。如果需要轉換成對象數組,則需要實作自定義的轉換器。 |
集合:預設情況下是轉換成字元串的集合。如果使用ONGL表達式,可轉換成對象集合。 |
對一些資料基本類型的轉換我們很好了解。下面我們就舉例來看看如何使用ONGL表達式完成對象、數組、集合的轉換。
字元串與對象之間的轉換
我們在頁面使用ONGL表達式${屬性名.屬性名…}的形式來表達:
1:此請求參數在Action中将要轉換的對象屬性。
2:在Action處理完畢後的響應頁面中擷取Action的屬性值。
如:
<form action="login.action"> <label>使用者名:</label><input type="text" name="user.userName" /><br> <label>密碼:</label><input type="text" name="user.password" /><br> <input type=submit value="登入" /> </form> |
此代碼片斷中user.userName與user.password分别對應着Action對象user中的usrName和password屬性。
public class LoginAction { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public class User { private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute() throws Exception { System.out.println(user.userName); //輸出頁面上輸入的使用者名的值 } } |
在點選”登入”按鈕後,請求發送到伺服器。Struts2架構會将請求參數中的user.userName與user.password請求參數轉化成user對象對應的屬性。這就完成了字元串到對象類型之間的轉換。
字元串與字元串數組之間的轉換
我們在頁面使用ONGL表達式${屬性名}的形式來表達此請求參數在Action中将要轉換的對象屬性。如:
<form action="login.action"> <label>使用者名:</label><input type="text" name="userNames" /><br> <label>使用者名:</label><input type="text" name="userNames" /><br> <input type=submit value="登入" /> </form> |
此代碼片斷中user.userName與user.password分别對應着Action對象userNames中的usrName和password屬性。
public class LoginAction { private String[] userNames; public String[] getUserNames() { return userNames; } public void setUserNames(String[] userNames) { this.userNames = userNames; } public String execute() throws Exception { System.out.println(this.getUserNames()[0]); return "success"; } } |
我們在頁面使用ONGL表達式${屬性名[序号].屬性名…}的形式來表達在Action處理完畢後的響應頁面中擷取Action的屬性值。如:
<h1><s:property value="userNames[0]"/>您好!歡迎來到冒險世界。</h1> |
注意:如果隻是用ONGL表達式${屬性名}的形式來輸出資訊,則輸出的是整個字元串數組中的元素資訊,每個元素之間使用“,”隔開。
字元串與集合之間的轉換
字元串與List<T>類型之間的轉換
我們在頁面使用ONGL表達式${屬性名[序号].屬性名…}的形式來表達:
1:此請求參數在Action中将要轉換的對象屬性。
2:在Action處理完畢後的響應頁面中擷取Action的屬性值。
如:
<form action="login.action"> <label>使用者名:</label><input type="text" name="users[0].userName" /><br> <label>密碼:</label><input type="text" name="user[0].password" /><br> <input type=submit value="登入" /> </form> |
此代碼片斷中user.userName與user.password分别對應着Action對象userNames中的usrName和password屬性。
public class LoginAction { private List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } public String execute() throws Exception { User user = users.get(0); System.out.println(user.userName); //輸出頁面上輸入的使用者名的值 } } |
字元串與List類型之間的轉換
在不知道List集合中元素類型的情況下,Struts2也将不知道将頁面的請求參數轉換成何種對象類型放入List集合中的。為了解決這樣的問題,Struts2使用一個類型轉換器注冊檔案(.properties檔案)來指定集合中的元素類型。在此檔案中增加以下資訊:
Element_集合類型的屬性名=集合類型中元素類型的全限定名。
如:Element_Users=org.struts2.samples.User
這樣Struts2在轉換時,就可以像字元串與List<T>類型之間的轉換一樣來轉換請求參數了。
字元串與Map<String,T>類型之間的轉換
我們在頁面使用ONGL表達式${屬性名[“key”].屬性名…}的形式來表達:
1:此請求參數在Action中将要轉換的對象屬性。
2:在Action處理完畢後的響應頁面中擷取Action的屬性值。
如:
<form action="login.action"> <label>使用者名:</label><input type="text" name="users[‘one’].userName"/><br> <label>密碼:</label><input type="text" name="user[‘one’].password" /><br> <input type=submit value="登入" /> </form> |
此代碼片斷中user.userName與user.password分别對應着Action對象userNames中的usrName和password屬性。
public class LoginAction { private Map<String,User> users; public Map<String, User> getUsers() { return users; } public void setUsers(Map<String, User> users) { this.users = users; } public String execute() throws Exception { User user =users.get("one"); System.out.println(user.userName); //輸出頁面上輸入的使用者名的值 } } |
字元串與Map類型之間的轉換
這種處理方式和處理List類型的集合一樣,隻需要在轉換器的注冊檔案中指定Map中Value值的類型即可。我們一般都是使用String類型作為key的類型,如果我們需要使用别的類型作為Map中的Key則可以在檔案中指定key的類型。如:
Key_users=java.Lang.Long//key對應的類型
Element_users=org.struts2.samples.User//value對應的類型
字元串與Set<T>或Set類型之間的轉換
為了更好的支援Set類型,Struts2允許為Set集合類型中的元素指定索引屬性。
我們隻需要在轉換器的注冊檔案中指定集合元素的索引屬性。
索引屬性是Set集合中元素對應的某個屬性名。
當然如果Action的屬性類型是Set類型的話,不要忘記了指定Element_屬性名的值。下面我們就以Set類型的屬性轉換為例:
Element_users=org.struts2.samples.User
KeyProperty_users=username
在指定了索引屬性後,我們可以在頁面使用ONGL表達式${屬性名(‘索引值’).屬性名…}的形式來通路Set集合元素中的值
public class LoginAction { private Map<String,User> users; public Map<String, User> getUsers() { return users; } public void setUsers(Map<String, User> users) { this.users = users; } public String execute() throws Exception { User user =users.get("one"); System.out.println(user.userName); //輸出頁面上輸入的使用者名的值 } } |
<body> <h1><s:property value="users('scott').userName"/>您好!歡迎來到冒險世界。</h1> </body> |
我們在了解了上面諸多類型轉換後,如果還不能滿足我們的轉換需求。則可以自定義符合我們轉換需求的自定義轉換器。
在Struts2中有兩種方式可以實作自定義轉換器。
1:實作TypeConverter接口或者繼承DefaultTypeConverter類。
2:繼承Struts2的内建抽象類StrutsTypeConverter。
具體資訊請查閱相關資料。