Struts2中的類型轉換

1、Struts2內建的類型轉換

  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

    A.較爲特殊的有數組類型的轉換:

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

    B.對象的內的屬性轉換:

   一樣在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;
	}

    C.List集合元素轉換(已指定泛型對象)

 一樣在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

  D.指定Map元素類型轉換(已指定泛型對象)

在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全限類名;

2、註冊類型轉換

當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的特定類型起做用;其餘步驟類似;

3、基於Struts2的自定義類型轉換器

爲了簡化類型轉化器的實現,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()+">";
	}
}
相關文章
相關標籤/搜索