亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Struts2學習教程之自定義類型轉換器的方法

2024-07-14 08:40:35
字體:
來源:轉載
供稿:網友

前言

為什么要在struts2中類型轉換器?

:struts2 只能夠對java中的8種原態類型以及String、Date等常用類型提供自動轉換。

但是這絕對不能滿足我們的需求,如果我們想將頁面的數據整合成一個javabean。到Action中去時Action得到的是一個對象,那么這個需求就需要我們使用類型轉換器。

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

自定義類型轉換類

有這樣的一個前臺頁面:

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

對應Action的部分代碼為:

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

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

Struts2的類型轉換器實際上依然是基于OGNL框架的,在OGNL項目中有一個TypeConverter接口,這個接口就是自定義類型轉換器必須實現的接口。該接口的定義代碼如下:

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

實現類型轉換器必須實現上面的TypeConverter,不過上面接口里的方法太過復雜,所以OGNL項目還為該接口提供了一個實現類:DefaultTypeConverter,通常都采用擴展該類來實現自定義類型轉換器。實現自定義類型轉換器需要重寫DefaultTypeConverter類的convertValue方法。

下面就是轉換為User類實例的轉換類:

public class UserConverter extends DefaultTypeConverter{ public Object convertValue(Map context, Object value, Class toType) { if (toType == User.class) {  // 當需要將字符串向User類型轉換時  // 系統的請求參數是一個字符串數組  String[] params = (String[])value;  // 創建一個User實例  User user = new User();  // 只處理請求參數數組第一個數組元素,并將該字符串以'|'符號分割成兩個字符串  String[] userValues = params[0].split("//|");  // 為User實例賦值  user.setName(userValues[0]);  user.setPassword(userValues[1]);  return user; } else if (toType == String.class) {  // 當需要將User類型向字符串轉換時  User user = (User)value;  return "<" + user.getName() + "|" + user.getPassword() + ">"; } return null; }}

convertValue方法的作用是非常簡單的,該方法負責完成類型的轉換,但是這種轉換是雙向的,根據參數toType來判斷目標類型,然后我們就可以實現兩個方向的轉換邏輯了。

注冊類型轉換器

有了類型轉換器是不夠的,因為Struts2框架還不知道何時使用這些類型轉換器,所以必須將類型轉換器注冊在Web應用中,Struts2框架才可以正常使用該類型轉換器。

Struts2主要支持以下兩種注冊類型轉換器的方式:

  • 注冊局部類型轉換器:局部類型轉換器僅僅對某個Action的屬性起作用
  • 注冊全局類型轉換器:全局類型轉換器對所有Action的特定類型的屬性都會起作用

下面就來分別說說以上兩種注冊類型轉換器的方法。

局部類型轉換器

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

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

<propName>=<ConverterClass>

將上面的<propName>替換成需要進行類型轉換的屬性、<ConverterClass>替換成類型轉換器的實現類即可。對于上面實現的UserConverter類,需要在局部類型轉換文件中這樣配置:

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

全局類型轉換器

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

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

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

全局類型轉換文件內容由多項<propType>=<ConvertClass>項組成,將propType替換成需要進行類型轉換的類型,將ConvertClass替換成類型轉換器的實現類即可。對于上面實現的UserConverter類,需要在全局類型轉換文件中這樣配置:

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

“局部”VS“全局”

局部類型轉換只能對指定Action的指定屬性進行轉換,不管該Action的該屬性是數組也好,是集合類型也罷,該轉換器的轉換方法對該屬性只轉換一次。如果某個Action有個List<User>類型的屬性users,那么局部類型轉換器將只調用一次convertValue()方法,該方法把users請求參數一次性地轉換為一個List<User>集合對象。

全局類型轉換器會對所有Action的特定類型進行轉換,如果一個Action的某個屬性是數組或集合類型,而數組或集合元素是需要該轉換器轉換的方法,那么全局類型轉換器將不是對該集合屬性整體進行轉換,而是對該集合屬性的每個元素進行轉換,也就是說,當該屬性是一個數組或集合時,該數組或集合中包含幾個該類型的元素,那么就會調用convertValue()方法幾次。

熟悉二者的區別以后,在以后工作中就的多多注意了;特別是數組和集合元素進行轉換時的區別。

基于Struts2的自定義類型轉換器

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

  • 當把字符串轉換成復合類型時,調用convertFromString抽象方法
  • 當把復合類型轉換成字符串時,調用convertToString抽象方法

而我們需要做的就是繼承StrutsTypeConverter抽象類,并且實現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類型向字符串轉換時  User user = (User)o;  return "<" + user.getName() + "|" + user.getPassword() + ">"; }}

總結

這篇文章對Struts2中的自定義類型轉換器進行了詳細的總結,總體思路如下:

  • 自定義類型轉換器需要繼承Struts2框架的某個抽象類
  • 實現自定義的類型轉換器類
  • 注冊自定義類型轉換器類

就這幾步就搞定了自定義類型轉換器嘍。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类老女人| 欧美多人乱p欧美4p久久| 国产精品老牛影院在线观看| 久久亚洲一区二区三区四区五区高| 国产视频久久久久| 国产美女被下药99| 一区二区三区无码高清视频| 51视频国产精品一区二区| 久久久久久久亚洲精品| 国产精品91久久| 丝袜情趣国产精品| 国产精品69精品一区二区三区| 国产精品美女网站| 亚洲xxxxx性| 日韩成人在线视频观看| 欧美性猛交xxxx乱大交蜜桃| 亚洲欧洲日韩国产| 日韩久久免费视频| 国产一区二区三区高清在线观看| 97免费在线视频| 欧美精品videossex88| 中文精品99久久国产香蕉| 欧美xxxx14xxxxx性爽| 最近2019好看的中文字幕免费| 国产美女高潮久久白浆| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩欧美国产黄色| 国产成人综合精品| 久久免费高清视频| 精品国产精品三级精品av网址| 国产视频精品自拍| 疯狂蹂躏欧美一区二区精品| 日韩在线中文字幕| 亚州欧美日韩中文视频| 日韩在线观看免费高清| 久久久久久国产精品三级玉女聊斋| 欧洲美女7788成人免费视频| 欧美一级高清免费播放| 精品国产精品自拍| 国产精品久久久久久久久久久久| 亚洲人成在线电影| 亚洲女人天堂色在线7777| 在线亚洲午夜片av大片| 亚洲一区二区三区在线视频| 国产精品黄视频| 91丨九色丨国产在线| 精品少妇一区二区30p| 国产69精品久久久久9999| 欧美日韩电影在线观看| 亚洲成人网av| 国产欧美一区二区三区久久人妖| 操日韩av在线电影| 日韩欧美视频一区二区三区| 国产成人自拍视频在线观看| 91精品久久久久久久久久| 成人有码在线视频| 国产中文字幕91| 国产成人91久久精品| 亚洲小视频在线观看| 欧美激情一区二区三区在线视频观看| 日韩免费在线观看视频| 亚洲欧美日韩中文在线| 国产亚洲欧美另类中文| 秋霞成人午夜鲁丝一区二区三区| 国产成人精品视频| 欧美一级电影免费在线观看| 欧美在线观看www| 最近2019好看的中文字幕免费| 国产中文字幕亚洲| 日本久久中文字幕| 永久555www成人免费| 91黑丝高跟在线| 日韩成人av网址| 亚洲毛片一区二区| 精品视频久久久| 亚洲国产三级网| 国产精品午夜视频| www.久久久久久.com| 亚洲精品成人网| 国产精品久久久久久久久久久久久久| 91精品视频在线看| 中文字幕亚洲一区二区三区| 亚洲综合自拍一区| 久久精品国产成人精品| 久久久精品2019中文字幕神马| 2020国产精品视频| 欧美激情综合色综合啪啪五月| 91福利视频网| 中文字幕亚洲欧美日韩在线不卡| 亚洲一区二区日本| 国产91在线视频| 免费99精品国产自在在线| 清纯唯美日韩制服另类| 国产精品9999| 亚洲人成网站色ww在线| 欧美丝袜一区二区三区| 69av视频在线播放| 中文字幕国产精品久久| 久久精品视频网站| 97免费在线视频| 中文字幕精品网| 久久久久久久亚洲精品| 亚洲xxxx做受欧美| 高清欧美性猛交| 久久久综合免费视频| 欧美精品一区二区免费| 亚洲精品美女免费| 最近2019中文字幕一页二页| 夜夜嗨av一区二区三区免费区| 国产精品久久电影观看| 欧美激情性做爰免费视频| 欧美在线亚洲一区| 久久国产精品久久久久久久久久| 成人精品网站在线观看| 国产日韩欧美在线视频观看| 欧美夫妻性生活xx| 欧美日韩国产一中文字不卡| 伦伦影院午夜日韩欧美限制| 日韩欧美高清在线视频| 日本最新高清不卡中文字幕| 精品亚洲夜色av98在线观看| 欧美日韩中文字幕在线视频| 亚洲色图在线观看| 国产免费一区视频观看免费| 91精品久久久久久久久中文字幕| 91在线国产电影| 91精品91久久久久久| 在线亚洲欧美视频| 欧美极品少妇与黑人| 中文字幕久久久av一区| 国产午夜精品一区二区三区| xxxx欧美18另类的高清| 91精品视频在线免费观看| 午夜精品久久久久久久男人的天堂| 中文字幕免费国产精品| 欧美性猛交99久久久久99按摩| 一本色道久久88综合日韩精品| 夜夜嗨av一区二区三区四区| 久久精品中文字幕免费mv| 国产精选久久久久久| 久久精品久久久久久| 国产精品v日韩精品| 91中文字幕在线观看| 精品人伦一区二区三区蜜桃网站| 成人在线免费观看视视频| 亚洲人精品午夜在线观看| 伦伦影院午夜日韩欧美限制| 黑人极品videos精品欧美裸| 91国偷自产一区二区三区的观看方式| 2019中文字幕在线免费观看| 欧美日韩不卡合集视频| 亚洲精品短视频| 日韩风俗一区 二区| 欧美成年人在线观看| 欧美日韩国产激情| 91久久综合亚洲鲁鲁五月天| 久久精品91久久久久久再现| 国产精品国模在线| 91久久在线播放| 成人做爰www免费看视频网站| 亚洲国产精品系列| 久久久久国产视频| 亚洲性视频网址| 国产丝袜一区二区|