這篇文章主要介紹了如何在Struts2中自定義一個類型轉(zhuǎn)換器,此處給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下:
站在用戶的角度思考問題,與客戶深入溝通,找到蓬溪網(wǎng)站設(shè)計與蓬溪網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋蓬溪地區(qū)。自定義類型轉(zhuǎn)換類
有這樣的一個前臺頁面:
對應(yīng)Action的部分代碼為:
private User user; // 這是一個復合類型 private String tip; public void setUsers(User user) { this.user = user; } public User getUser() { return user; }
我們希望用戶在前臺頁面輸入格式為“username|password”這樣的字符串,通過自定義的類型轉(zhuǎn)換器,將這樣“username|password”格式的字符串轉(zhuǎn)換為User類型。下面就說說如何實現(xiàn)自定義類型轉(zhuǎn)換器。
Struts2的類型轉(zhuǎn)換器實際上依然是基于OGNL框架的,在OGNL項目中有一個TypeConverter接口,這個接口就是自定義類型轉(zhuǎn)換器必須實現(xiàn)的接口。該接口的定義代碼如下:
// OGNL提供的類型轉(zhuǎn)換器接口 public interface TypeConverter { public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType); }
實現(xiàn)類型轉(zhuǎn)換器必須實現(xiàn)上面的TypeConverter,不過上面接口里的方法太過復雜,所以O(shè)GNL項目還為該接口提供了一個實現(xiàn)類:DefaultTypeConverter,通常都采用擴展該類來實現(xiàn)自定義類型轉(zhuǎn)換器。實現(xiàn)自定義類型轉(zhuǎn)換器需要重寫DefaultTypeConverter類的convertValue方法。
下面就是轉(zhuǎn)換為User類實例的轉(zhuǎn)換類:
public class UserConverter extends DefaultTypeConverter { public Object convertValue(Map context, Object value, Class toType) { if (toType == User.class) { // 當需要將字符串向User類型轉(zhuǎn)換時 // 系統(tǒng)的請求參數(shù)是一個字符串數(shù)組 String[] params = (String[])value; // 創(chuàng)建一個User實例 User user = new User(); // 只處理請求參數(shù)數(shù)組第一個數(shù)組元素,并將該字符串以'|'符號分割成兩個字符串 String[] userValues = params[0].split("\\|"); // 為User實例賦值 user.setName(userValues[0]); user.setPassword(userValues[1]); return user; } else if (toType == String.class) { // 當需要將User類型向字符串轉(zhuǎn)換時 User user = (User)value; return "<" + user.getName() + "|" + user.getPassword() + ">"; } return null; } }
convertValue方法的作用是非常簡單的,該方法負責完成類型的轉(zhuǎn)換,但是這種轉(zhuǎn)換是雙向的,根據(jù)參數(shù)toType來判斷目標類型,然后我們就可以實現(xiàn)兩個方向的轉(zhuǎn)換邏輯了。
注冊類型轉(zhuǎn)換器
有了類型轉(zhuǎn)換器是不夠的,因為Struts2框架還不知道何時使用這些類型轉(zhuǎn)換器,所以必須將類型轉(zhuǎn)換器注冊在Web應(yīng)用中,Struts2框架才可以正常使用該類型轉(zhuǎn)換器。
Struts2主要支持以下兩種注冊類型轉(zhuǎn)換器的方式:
注冊局部類型轉(zhuǎn)換器:局部類型轉(zhuǎn)換器僅僅對某個Action的屬性起作用
注冊全局類型轉(zhuǎn)換器:全局類型轉(zhuǎn)換器對所有Action的特定類型的屬性都會起作用
下面就來分別說說以上兩種注冊類型轉(zhuǎn)換器的方法。
局部類型轉(zhuǎn)換器
Struts2允許開發(fā)者通過局部類型轉(zhuǎn)換文件來指定類型轉(zhuǎn)換的相關(guān)配置信息。類型轉(zhuǎn)換文件就是一個普通的Properties(*.properties)文件。局部類型轉(zhuǎn)換文件的文件名應(yīng)為ActionName-conversion.properties形式,其中ActionName是需要使用該類型轉(zhuǎn)換文件的Action名,后面的-conversion.properties字符串則是固定的部分。類型轉(zhuǎn)換文件應(yīng)該放在和Action類文件相同的位置。
說完局部類型轉(zhuǎn)換文件,就接著說這個注冊局部類型轉(zhuǎn)換器。注冊局部類型轉(zhuǎn)換器只需要在局部類型轉(zhuǎn)換文件中增加以下一行配置即可:
=
將上面的
# 指定user屬性需要使用UserConverter類來完成類型轉(zhuǎn)換 user=com.jellythink.practise.UserConverter
全局類型轉(zhuǎn)換器
局部類型轉(zhuǎn)換器的局限性太明顯了,它只能對指定Action、指定屬性起作用。但是,如果應(yīng)用中有多個Action都包含了User類型的屬性,或者一個Action中包含了多個User類型的屬性,使用全局類型轉(zhuǎn)換器將更合適。
全局類型轉(zhuǎn)換器不是對指定Action的指定屬性起作用,而是對指定類型起作用。比如對所有類型為com.jellythink.practise.User類型的屬性起作用。
注冊全局類型轉(zhuǎn)換器應(yīng)該提供一個xwork-conversion.properties文件,該文件就是全局類型轉(zhuǎn)換文件,需要將該文件直接放在Web應(yīng)用的WEB-INF/classes路徑下即可。
全局類型轉(zhuǎn)換文件內(nèi)容由多項
com.jellythink.practise.User=com.jellythink.practise.UserConverter
“局部”VS“全局”
局部類型轉(zhuǎn)換只能對指定Action的指定屬性進行轉(zhuǎn)換,不管該Action的該屬性是數(shù)組也好,是集合類型也罷,該轉(zhuǎn)換器的轉(zhuǎn)換方法對該屬性只轉(zhuǎn)換一次。如果某個Action有個List
全局類型轉(zhuǎn)換器會對所有Action的特定類型進行轉(zhuǎn)換,如果一個Action的某個屬性是數(shù)組或集合類型,而數(shù)組或集合元素是需要該轉(zhuǎn)換器轉(zhuǎn)換的方法,那么全局類型轉(zhuǎn)換器將不是對該集合屬性整體進行轉(zhuǎn)換,而是對該集合屬性的每個元素進行轉(zhuǎn)換,也就是說,當該屬性是一個數(shù)組或集合時,該數(shù)組或集合中包含幾個該類型的元素,那么就會調(diào)用convertValue()方法幾次。
熟悉二者的區(qū)別以后,在以后工作中就的多多注意了;特別是數(shù)組和集合元素進行轉(zhuǎn)換時的區(qū)別。
基于Struts2的自定義類型轉(zhuǎn)換器
上面介紹了通過繼承DefaultTypeConverter類,在一個convertValue方法中,通過判斷toType參數(shù)來判斷轉(zhuǎn)換的方向,然后分別實現(xiàn)不同轉(zhuǎn)換方向的轉(zhuǎn)換邏輯。而在Struts2框架中,為了簡化類型轉(zhuǎn)換器的實現(xiàn),特別提供了一個StrutsTypeConverter抽象類,該類是DefaultTypeConverter類的子類。它已經(jīng)實現(xiàn)了DefaultTypeConverter類的convertValue方法;實現(xiàn)該方法時,它將以前在convertValue方法中通過判斷toType參數(shù)的方式來實現(xiàn)兩個不同方向的轉(zhuǎn)換變成了調(diào)用以下兩個不同的方法:
當把字符串轉(zhuǎn)換成復合類型時,調(diào)用convertFromString抽象方法
當把復合類型轉(zhuǎn)換成字符串時,調(diào)用convertToString抽象方法
而我們需要做的就是繼承StrutsTypeConverter抽象類,并且實現(xiàn)convertFromString和convertToString這兩個抽象方法。
修改后的代碼如下:
public class UserConverter extends StrutsTypeConverter { public Object convertFromString(Map context, String[] values, Class toClass) { User user = new User(); String[] userValues = values[0].split("\\|"); user.setName(userValues[0]); user.setPassword(userValues[1]); return user; } public String convertToString(Map context, Object o) { // 當需要將User類型向字符串轉(zhuǎn)換時 User user = (User)o; return "<" + user.getName() + "|" + user.getPassword() + ">"; } }
到此這篇關(guān)于如何在Struts2中自定義一個類型轉(zhuǎn)換器的文章就介紹到這了,更多相關(guān)的內(nèi)容請搜索創(chuàng)新互聯(lián)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持創(chuàng)新互聯(lián)!