最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Struts2學(xué)習(xí)教程之自定義類型轉(zhuǎn)換器的方法

 更新時(shí)間:2018年05月03日 10:06:37   作者:果凍想  
類型轉(zhuǎn)換器的作用是將請(qǐng)求中的字符串或字符串?dāng)?shù)組參數(shù)與action中的對(duì)象進(jìn)行相互轉(zhuǎn)換。下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之自定義類型轉(zhuǎn)換器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

為什么要在struts2中類型轉(zhuǎn)換器?

:struts2 只能夠?qū)ava中的8種原態(tài)類型以及String、Date等常用類型提供自動(dòng)轉(zhuǎn)換。

但是這絕對(duì)不能滿足我們的需求,如果我們想將頁面的數(shù)據(jù)整合成一個(gè)javabean。到Action中去時(shí)Action得到的是一個(gè)對(duì)象,那么這個(gè)需求就需要我們使用類型轉(zhuǎn)換器。

大部分時(shí)候,使用Struts2框架提供的內(nèi)建的類型轉(zhuǎn)換器和基于OGNL的類型轉(zhuǎn)換器,就能滿足大部分的類型轉(zhuǎn)換需求;但是也存在一些特殊的情況下,可能需要將一個(gè)指定格式的字符串轉(zhuǎn)換成一個(gè)復(fù)合對(duì)象,此時(shí)就需要使用自定義類型轉(zhuǎn)換器。比如,客戶端傳送一個(gè)"jelly|123456"這樣的字符串到服務(wù)器,我們需要將這個(gè)字符串轉(zhuǎn)換成一個(gè)User類型實(shí)例,其中“jelly”作為用戶名,“123456”作為用戶密碼。

自定義類型轉(zhuǎn)換類

有這樣的一個(gè)前臺(tái)頁面:

<form action="login" method="post">
 用戶:<input type="text" name="userinfo"><br>
 <input type="submit" value="轉(zhuǎn)換">
</form>

對(duì)應(yīng)Action的部分代碼為:

private User user; // 這是一個(gè)復(fù)合類型
private String tip;
public void setUsers(User user)
{
 this.user = user;
}

public User getUser()
{
 return user;
}

我們希望用戶在前臺(tái)頁面輸入格式為“username|password”這樣的字符串,通過自定義的類型轉(zhuǎn)換器,將這樣“username|password”格式的字符串轉(zhuǎn)換為User類型。下面就說說如何實(shí)現(xiàn)自定義類型轉(zhuǎn)換器。

Struts2的類型轉(zhuǎn)換器實(shí)際上依然是基于OGNL框架的,在OGNL項(xiàng)目中有一個(gè)TypeConverter接口,這個(gè)接口就是自定義類型轉(zhuǎn)換器必須實(shí)現(xiàn)的接口。該接口的定義代碼如下:

// OGNL提供的類型轉(zhuǎn)換器接口
public interface TypeConverter
{
 public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);
}

實(shí)現(xiàn)類型轉(zhuǎn)換器必須實(shí)現(xiàn)上面的TypeConverter,不過上面接口里的方法太過復(fù)雜,所以O(shè)GNL項(xiàng)目還為該接口提供了一個(gè)實(shí)現(xiàn)類:DefaultTypeConverter,通常都采用擴(kuò)展該類來實(shí)現(xiàn)自定義類型轉(zhuǎn)換器。實(shí)現(xiàn)自定義類型轉(zhuǎn)換器需要重寫DefaultTypeConverter類的convertValue方法。

下面就是轉(zhuǎn)換為User類實(shí)例的轉(zhuǎn)換類:

public class UserConverter extends DefaultTypeConverter
{
 public Object convertValue(Map context, Object value, Class toType)
 {
 if (toType == User.class)
 {
  // 當(dāng)需要將字符串向User類型轉(zhuǎn)換時(shí)
  // 系統(tǒng)的請(qǐng)求參數(shù)是一個(gè)字符串?dāng)?shù)組
  String[] params = (String[])value;

  // 創(chuàng)建一個(gè)User實(shí)例
  User user = new User();

  // 只處理請(qǐng)求參數(shù)數(shù)組第一個(gè)數(shù)組元素,并將該字符串以'|'符號(hào)分割成兩個(gè)字符串
  String[] userValues = params[0].split("\\|");

  // 為User實(shí)例賦值
  user.setName(userValues[0]);
  user.setPassword(userValues[1]);

  return user;
 }
 else if (toType == String.class)
 {
  // 當(dāng)需要將User類型向字符串轉(zhuǎn)換時(shí)
  User user = (User)value;
  return "<" + user.getName() + "|" + user.getPassword() + ">";
 }
 return null;
 }
}

convertValue方法的作用是非常簡(jiǎn)單的,該方法負(fù)責(zé)完成類型的轉(zhuǎn)換,但是這種轉(zhuǎn)換是雙向的,根據(jù)參數(shù)toType來判斷目標(biāo)類型,然后我們就可以實(shí)現(xiàn)兩個(gè)方向的轉(zhuǎn)換邏輯了。

注冊(cè)類型轉(zhuǎn)換器

有了類型轉(zhuǎn)換器是不夠的,因?yàn)镾truts2框架還不知道何時(shí)使用這些類型轉(zhuǎn)換器,所以必須將類型轉(zhuǎn)換器注冊(cè)在Web應(yīng)用中,Struts2框架才可以正常使用該類型轉(zhuǎn)換器。

Struts2主要支持以下兩種注冊(cè)類型轉(zhuǎn)換器的方式:

  • 注冊(cè)局部類型轉(zhuǎn)換器:局部類型轉(zhuǎn)換器僅僅對(duì)某個(gè)Action的屬性起作用
  • 注冊(cè)全局類型轉(zhuǎn)換器:全局類型轉(zhuǎn)換器對(duì)所有Action的特定類型的屬性都會(huì)起作用

下面就來分別說說以上兩種注冊(cè)類型轉(zhuǎn)換器的方法。

局部類型轉(zhuǎn)換器

Struts2允許開發(fā)者通過局部類型轉(zhuǎn)換文件來指定類型轉(zhuǎn)換的相關(guān)配置信息。類型轉(zhuǎn)換文件就是一個(gè)普通的Properties(*.properties)文件。局部類型轉(zhuǎn)換文件的文件名應(yīng)為ActionName-conversion.properties形式,其中ActionName是需要使用該類型轉(zhuǎn)換文件的Action名,后面的-conversion.properties字符串則是固定的部分。類型轉(zhuǎn)換文件應(yīng)該放在和Action類文件相同的位置。

說完局部類型轉(zhuǎn)換文件,就接著說這個(gè)注冊(cè)局部類型轉(zhuǎn)換器。注冊(cè)局部類型轉(zhuǎn)換器只需要在局部類型轉(zhuǎn)換文件中增加以下一行配置即可:

<propName>=<ConverterClass>

將上面的<propName>替換成需要進(jìn)行類型轉(zhuǎn)換的屬性、<ConverterClass>替換成類型轉(zhuǎn)換器的實(shí)現(xiàn)類即可。對(duì)于上面實(shí)現(xiàn)的UserConverter類,需要在局部類型轉(zhuǎn)換文件中這樣配置:

# 指定user屬性需要使用UserConverter類來完成類型轉(zhuǎn)換
user=com.jellythink.practise.UserConverter

全局類型轉(zhuǎn)換器

局部類型轉(zhuǎn)換器的局限性太明顯了,它只能對(duì)指定Action、指定屬性起作用。但是,如果應(yīng)用中有多個(gè)Action都包含了User類型的屬性,或者一個(gè)Action中包含了多個(gè)User類型的屬性,使用全局類型轉(zhuǎn)換器將更合適。

全局類型轉(zhuǎn)換器不是對(duì)指定Action的指定屬性起作用,而是對(duì)指定類型起作用。比如對(duì)所有類型為com.jellythink.practise.User類型的屬性起作用。

注冊(cè)全局類型轉(zhuǎn)換器應(yīng)該提供一個(gè)xwork-conversion.properties文件,該文件就是全局類型轉(zhuǎn)換文件,需要將該文件直接放在Web應(yīng)用的WEB-INF/classes路徑下即可。

全局類型轉(zhuǎn)換文件內(nèi)容由多項(xiàng)<propType>=<ConvertClass>項(xiàng)組成,將propType替換成需要進(jìn)行類型轉(zhuǎn)換的類型,將ConvertClass替換成類型轉(zhuǎn)換器的實(shí)現(xiàn)類即可。對(duì)于上面實(shí)現(xiàn)的UserConverter類,需要在全局類型轉(zhuǎn)換文件中這樣配置:

com.jellythink.practise.User=com.jellythink.practise.UserConverter

“局部”VS“全局”

局部類型轉(zhuǎn)換只能對(duì)指定Action的指定屬性進(jìn)行轉(zhuǎn)換,不管該Action的該屬性是數(shù)組也好,是集合類型也罷,該轉(zhuǎn)換器的轉(zhuǎn)換方法對(duì)該屬性只轉(zhuǎn)換一次。如果某個(gè)Action有個(gè)List<User>類型的屬性u(píng)sers,那么局部類型轉(zhuǎn)換器將只調(diào)用一次convertValue()方法,該方法把users請(qǐng)求參數(shù)一次性地轉(zhuǎn)換為一個(gè)List<User>集合對(duì)象。

全局類型轉(zhuǎn)換器會(huì)對(duì)所有Action的特定類型進(jìn)行轉(zhuǎn)換,如果一個(gè)Action的某個(gè)屬性是數(shù)組或集合類型,而數(shù)組或集合元素是需要該轉(zhuǎn)換器轉(zhuǎn)換的方法,那么全局類型轉(zhuǎn)換器將不是對(duì)該集合屬性整體進(jìn)行轉(zhuǎn)換,而是對(duì)該集合屬性的每個(gè)元素進(jìn)行轉(zhuǎn)換,也就是說,當(dāng)該屬性是一個(gè)數(shù)組或集合時(shí),該數(shù)組或集合中包含幾個(gè)該類型的元素,那么就會(huì)調(diào)用convertValue()方法幾次。

熟悉二者的區(qū)別以后,在以后工作中就的多多注意了;特別是數(shù)組和集合元素進(jìn)行轉(zhuǎn)換時(shí)的區(qū)別。

基于Struts2的自定義類型轉(zhuǎn)換器

上面介紹了通過繼承DefaultTypeConverter類,在一個(gè)convertValue方法中,通過判斷toType參數(shù)來判斷轉(zhuǎn)換的方向,然后分別實(shí)現(xiàn)不同轉(zhuǎn)換方向的轉(zhuǎn)換邏輯。而在Struts2框架中,為了簡(jiǎn)化類型轉(zhuǎn)換器的實(shí)現(xiàn),特別提供了一個(gè)StrutsTypeConverter抽象類,該類是DefaultTypeConverter類的子類。它已經(jīng)實(shí)現(xiàn)了DefaultTypeConverter類的convertValue方法;實(shí)現(xiàn)該方法時(shí),它將以前在convertValue方法中通過判斷toType參數(shù)的方式來實(shí)現(xiàn)兩個(gè)不同方向的轉(zhuǎn)換變成了調(diào)用以下兩個(gè)不同的方法:

  • 當(dāng)把字符串轉(zhuǎn)換成復(fù)合類型時(shí),調(diào)用convertFromString抽象方法
  • 當(dāng)把復(fù)合類型轉(zhuǎn)換成字符串時(shí),調(diào)用convertToString抽象方法

而我們需要做的就是繼承StrutsTypeConverter抽象類,并且實(shí)現(xiàn)convertFromString和convertToString這兩個(gè)抽象方法。

修改后的代碼如下:

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)
 {
  // 當(dāng)需要將User類型向字符串轉(zhuǎn)換時(shí)
  User user = (User)o;
  return "<" + user.getName() + "|" + user.getPassword() + ">";
 }
}

總結(jié)

這篇文章對(duì)Struts2中的自定義類型轉(zhuǎn)換器進(jìn)行了詳細(xì)的總結(jié),總體思路如下:

  • 自定義類型轉(zhuǎn)換器需要繼承Struts2框架的某個(gè)抽象類
  • 實(shí)現(xiàn)自定義的類型轉(zhuǎn)換器類
  • 注冊(cè)自定義類型轉(zhuǎn)換器類

就這幾步就搞定了自定義類型轉(zhuǎn)換器嘍。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • IntelliJ?IDEA如何集成maven

    IntelliJ?IDEA如何集成maven

    這篇文章主要介紹了IntelliJ?IDEA如何集成maven問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Eclipse+Java+Swing+Mysql實(shí)現(xiàn)工資管理系統(tǒng)

    Eclipse+Java+Swing+Mysql實(shí)現(xiàn)工資管理系統(tǒng)

    這篇文章主要介紹了Eclipse+Java+Swing+Mysql實(shí)現(xiàn)工資管理系統(tǒng),對(duì)正在工作或者學(xué)習(xí)的你有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-01-01
  • Java編程刪除鏈表中重復(fù)的節(jié)點(diǎn)問題解決思路及源碼分享

    Java編程刪除鏈表中重復(fù)的節(jié)點(diǎn)問題解決思路及源碼分享

    這篇文章主要介紹了Java編程刪除鏈表中重復(fù)的節(jié)點(diǎn)問題解決思路及源碼分享,具有一定參考價(jià)值,這里分享給大家,供需要的朋友了解。
    2017-10-10
  • 淺談Java設(shè)計(jì)模式之開放封閉原則

    淺談Java設(shè)計(jì)模式之開放封閉原則

    本篇文章主要介紹了淺談Java設(shè)計(jì)模式之開放封閉原則,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java中Stream流對(duì)多個(gè)字段進(jìn)行排序的方法

    Java中Stream流對(duì)多個(gè)字段進(jìn)行排序的方法

    我們?cè)谔幚頂?shù)據(jù)的時(shí)候經(jīng)常會(huì)需要進(jìn)行排序后再返回給前端調(diào)用,比如按照時(shí)間升序排序,前端展示數(shù)據(jù)就是按時(shí)間先后進(jìn)行排序,下面這篇文章主要給大家介紹了關(guān)于Java中Stream流對(duì)多個(gè)字段進(jìn)行排序的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Java泛型的簡(jiǎn)單實(shí)例

    Java泛型的簡(jiǎn)單實(shí)例

    這篇文章介紹了Java泛型的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-10-10
  • Java通過Socket實(shí)現(xiàn)簡(jiǎn)單多人聊天室

    Java通過Socket實(shí)現(xiàn)簡(jiǎn)單多人聊天室

    這篇文章主要為大家詳細(xì)介紹了Java通過Socket實(shí)現(xiàn)簡(jiǎn)單多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 使用JPA主鍵@Id,@IdClass,@Embeddable,@EmbeddedId問題

    使用JPA主鍵@Id,@IdClass,@Embeddable,@EmbeddedId問題

    這篇文章主要介紹了使用JPA主鍵@Id,@IdClass,@Embeddable,@EmbeddedId問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中的類初始化解析

    Java中的類初始化解析

    這篇文章主要介紹了Java中的類初始化解析,類的初始化是一個(gè)Java類生命周期中的其中一個(gè)階段,初始化是類加載的最后一個(gè)階段,也正是在初始化階段,才會(huì)真正開始執(zhí)行類中所寫的Java代碼,需要的朋友可以參考下
    2023-08-08
  • 詳解Java8中的lambda表達(dá)式、::符號(hào)和Optional類

    詳解Java8中的lambda表達(dá)式、::符號(hào)和Optional類

    這篇文章主要介紹了Java8中的lambda表達(dá)式、::符號(hào)和Optional類,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

安西县| 涞源县| 津市市| 湟中县| 太仓市| 旬阳县| 富川| 台江县| 甘孜县| 峨眉山市| 铁岭县| 武定县| 彰武县| 汶川县| 榕江县| 中江县| 万宁市| 开江县| 房产| 互助| 信丰县| 泰和县| 丹阳市| 青神县| 济宁市| 府谷县| 商南县| 宁远县| 绥滨县| 无棣县| 揭东县| 梧州市| 凤台县| 穆棱市| 乡城县| 翁牛特旗| 常州市| 元朗区| 康平县| 安顺市| 余庆县|