struts2中的Action經過JSP中定義的name屬性來獲取頁面值,在頁面傳的值均爲String類型,在Action中須要對這些值進行類型轉換,在struts2中大部分的類型struts2都已經幫開發人員創建好,以下:css
1)boolean和Boolean:完成字符串和布爾值之間的轉換;html
2)char和Character:完成字符串和字符之間的轉換;java
3)int和Integer:完成字符串和整形值之間的轉換;數組
4)long和Long:完成字符串和長整形之間的轉換;ide
5)float和Float:完成字符串和浮點值之間的轉換;this
6)Date:完成字符串和雙精度浮點值之間的轉換;spa
在JSP中定義name相同的表單屬性:code
<form action=""> <table> <tr> <th width="200"><em>*</em> 用戶名稱1:</th> <td> <s:textfield type="text" cssClass="inputbox" id="user" name="user"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶名稱2:</th> <td> <s:textfield type="text" cssClass="inputbox" id="age" name="user"/> </td> </tr> <input name="submitbutton" id="submitbutton" type="button" value="保存" /> </table> </form>
在Action中獲取用戶名稱這個String[],定義字符串數組名字爲user便可以獲取值;注意要定義set和get方法;orm
//action其餘代碼省略 private String[] user; public String[] getUser() { return user; } public void setUser(String[] user) { this.user = user; }
一樣在JSP頁面中:經過user.userName和user.age的形式將參數值賦給Action中的User對象;xml
<form action=""> <table> <tr> <th width="200"><em>*</em> 用戶名稱:</th> <td> <s:textfield type="text" cssClass="inputbox" name="user.userName"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶年齡:</th> <td> <s:textfield type="text" cssClass="inputbox" id="age" name="user.age"/> </td> </tr> <input name="submitbutton" id="submitbutton" type="button" value="保存" /> </table> </form>
在Action中經過定義User user屬性而且設置set和get方法獲取;
//action其餘代碼省略 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }
一樣在JSP頁面中:經過集合名詞[集合下標].集合對象中的屬性的形式將參數值賦給Action中的集合;
<form action=""> <table> <tr> <th width="200"><em>*</em> 用戶名稱1:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userList[0].userName"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶年齡1:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userList[0].age"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶名稱2:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userList[1].userName"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶年齡2:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userList[1].age"/> </td> </tr> <input name="submitbutton" id="submitbutton" type="button" value="保存" /> </table> </form>
在Action中經過定義List<User> user屬性而且設置set和get方法獲取;
//action其餘代碼省略 private List<User> userList; public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList= userList; }
運行結果以下:若JSP頁面下標指定從1開始,struts2會默認將集合中的第一個設置爲null
在JSP頁面中name設置爲Map對象[Map的Key].泛型對象中的屬性值;
<form action=""> <table> <tr> <th width="200"><em>*</em> 用戶名稱1:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userMap['one'].userName"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶年齡1:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userMap['one'].age"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶名稱2:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userMap['two'].userName"/> </td> </tr> <tr> <th width="200"><em>*</em> 用戶年齡2:</th> <td> <s:textfield type="text" cssClass="inputbox" name="userMap['two'].age"/> </td> </tr> <input name="submitbutton" id="submitbutton" type="button" value="保存" /> </table> </form>
一樣在Action中經過定義Map<String, User> mapUser屬性而且設置set和get方法獲取;
可是這些都是已經爲struts2指定好具體的對象的狀況下,若是上面的List沒有指定具體的泛型,List User這樣的狀況該如何轉換類型呢?
1)在放置Action相同目錄下新建ActionName-conversion.properties文件ActionName爲Action的類名;
2)在ActionName-conversion.properties文件中指定key-value;
如爲List指定:Element_集合名詞=集合類型的完整限定名
Element_userList=com.shcredit.controller.type.User
爲Map指定:需同時指定Map的key屬性和value屬性
Key_<MapPropName>=<KeyType> Element_<MapPropName>=<ValueType>
MapPropName是Map類型的屬性名,KeyType和ValueType爲對應類型的quan全限類名;
當JSP頁面傳的爲一個字符串類型user,Action中的user確爲一個User 對象,這種狀況又該如何處理呢?
<form action=""> <table> <tr> <th width="200"><em>*</em> 用戶名稱和年齡:</th> <td> <s:textfield type="text" cssClass="inputbox" name="user"/> </td> </tr> <input name="submitbutton" id="submitbutton" type="button" value="保存" /> </table> </form>
//action其餘代碼省略 private User user; public User getUser() { return user; } public void setUser(User user) { this.user= user; }
1)ONGL提供了類型轉換器接口TypeConverter,自定義類型轉換器能夠實現該接口;實現該接口的convertValue方法比較複雜。
2)OGNL提供了DefaultTypeConverter實現類,這也是較爲經常使用的方法;
(局部類型轉換器)在跟Action相同目錄下新建ActionName-conversion.properties。在該文件下指定Action中須要進行類型轉換的name對應的轉換類;這樣JSP根據name中的name去Struts2中默認的類型轉換中去找,沒有找到會去該Action目錄下尋找對應的conversion.properties文件(若src下存在xwork-conversion.properties文件(全局)則局部類型轉換器優先),經過該文件指定對應的類型轉換器,該類型轉換器進行轉換後,Action經過set方法將返回值set進Action中;
user=com.shcredit.controller.type.UserConver
public class UserConver extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if(toType == User.class){ //系統的請求參數是一個字符串數組 String[] params = (String[])value; User user = new User(); String[] userValues = params[0].split(","); user.setUserName(userValues[0]); user.setAge(userValues[1]); return user; }else if(toType == String.class){ User user = (User)value; return "<"+user.getUserName()+","+user.getAge()+">"; } return null; } }
這樣雖然能解決問題,可是每個Action都須要去配置對應的ActionName-conversion.properties文件,有什麼辦法解決呢?
(全局類型轉換器)它不是對特定的Action起做用,而是對指定類型起做用。
1)在src下新建xwork-conversion.properties文件,爲須要進行類型轉換的類進行指定:
com.shcredit.controller.type.User=com.shcredit.controller.type.UserConver
它會對全部的Action的特定類型起做用;其餘步驟類似;
爲了簡化類型轉化器的實現,Struts2提供了一個StrutsTypeConverter抽象類,該類時DefaultTypeConverter的子類,該類已經實現了convertFromString方法(將字符串轉換成複合類型)和convertToString方法(將複合類型轉換爲字符串)。
public class StrutsUserConerter extends StrutsTypeConverter { @Override public Object convertFromString(Map arg0, String[] arg1, Class arg2) { User user = new User(); //只處理請求參數數組第一個數組元素 String[] userValues = arg1[0].split(","); user.setUserName(userValues[0]); user.setAge(userValues[1]); //返回轉換後的User實列 return user; } @Override public String convertToString(Map arg0, Object arg1) { User user = (User)arg1; return "<"+user.getUserName()+","+user.getAge()+">"; } }