第 7 章 ? Struts2 類型轉(zhuǎn)換技術(shù)
在 Web 項(xiàng)目開(kāi)發(fā)中由于很多數(shù)據(jù)在頁(yè)面上顯示時(shí)候都是以字符串類型來(lái)顯示。而在控制層或者 model 層中開(kāi)發(fā)人員使用 Java 開(kāi)發(fā)時(shí)候,對(duì)于這些從頁(yè)面上傳入或者需要傳到頁(yè)面上顯示的數(shù)據(jù)開(kāi)發(fā)的類型不一定都是字符串類型。因此常常需要在視圖和非視圖之間進(jìn)行類型轉(zhuǎn)換。最明顯的例子就是顯示當(dāng)前日期??墒沁@些開(kāi)發(fā)工作往往是無(wú)關(guān)緊要或者說(shuō)是猶如“雞肋”,而很多開(kāi)發(fā)時(shí)間卻都白白浪費(fèi)在這上面。有感于此, Struts2 的設(shè)計(jì)者提供了類型轉(zhuǎn)換的功能。其實(shí)讀者如果是從本書第一章看到這里,應(yīng)該也估計(jì)的出類型轉(zhuǎn)換也是用攔截器來(lái)實(shí)現(xiàn)的。這里筆者使用 Struts2 類型轉(zhuǎn)換功能,看看在 Struts2 中到底是如何實(shí)現(xiàn)或者說(shuō)如何實(shí)現(xiàn)類型轉(zhuǎn)換。
7.1 ? Struts2 類型轉(zhuǎn)換使用介紹
Struts2 的類型轉(zhuǎn)換幾乎支持 Java 中各種數(shù)據(jù)類型的轉(zhuǎn)換。甚至開(kāi)發(fā)者還可以自定義自己的類型轉(zhuǎn)換功能。不過(guò)在筆者看來(lái),不推薦開(kāi)發(fā)人員開(kāi)發(fā)自定義的類型轉(zhuǎn)換功能。原因有二。一是遵循 IT 界著名名言“不重復(fù)發(fā)明輪子”,不在前人的成果上再次浪費(fèi)時(shí)間。二是類型轉(zhuǎn)換本身在開(kāi)發(fā)工作中就不應(yīng)該占用大量時(shí)間和人力。況且自定義自己的類型轉(zhuǎn)換,項(xiàng)目風(fēng)險(xiǎn)也有可能增加。從項(xiàng)目管理角度對(duì)時(shí)間、成本、風(fēng)險(xiǎn)的管理都存在負(fù)面效應(yīng)。
因此在本節(jié)中筆者具體介紹 Struts2 本身所具有的類型轉(zhuǎn)換功能。大致分為以下:
int 、 boolean 、 double 等 Java 基本類型轉(zhuǎn)換。
Date 類型轉(zhuǎn)換。
List 類型轉(zhuǎn)換。
Set 類型轉(zhuǎn)換。
數(shù)組類型轉(zhuǎn)換。
除了數(shù)組的類型轉(zhuǎn)換不大實(shí)用以外,其他幾種類型轉(zhuǎn)換都是比較常用的。而且筆者認(rèn)為 Date 類型轉(zhuǎn)換也是屬于單個(gè) Java 變量的轉(zhuǎn)換。而 List 、 Set 可以算作集合類型的轉(zhuǎn)換即多個(gè) Java 變量封裝成單個(gè)集合的類型轉(zhuǎn)換。下面就依次介紹有關(guān)知識(shí)點(diǎn)和一些需要注意的細(xì)節(jié)問(wèn)題。
7.1.1 ? 基本數(shù)據(jù)類型轉(zhuǎn)換功能
技術(shù)要點(diǎn)
本節(jié)代碼具體介紹 Java 基本數(shù)據(jù)類型和 Date 類型轉(zhuǎn)換的使用方式介紹。
基本類型轉(zhuǎn)換 Action 中使用方式。
基本類型轉(zhuǎn)換在視圖界面的使用方式。
演示代碼
使用的 Action 文件:
?
- <!------------------------文件名:AddMaterialAction.java----------------> ??
- public ? class ?AddMaterialAction? extends ?ActionSupport?{ ??
- ????????? //屬性類型需要類型轉(zhuǎn)換的對(duì)象 ??
- ????????? private ?Material?material; ??
- ??
- ????????? public ?Material?getMaterial()?{ ??
- ??????????????????? return ?material; ??
- ?????????} ??
- ??
- ????????? public ? void ?setMaterial(Material?material)?{ ??
- ??????????????????? this .material?=?material; ??
- ?????????} ??
- ??
- ????????? public ?String?execute()? throws ?Exception?{ ??
- ??????????????????? return ?SUCCESS; ??
- ?????????} ??
- }??
<!------------------------文件名:AddMaterialAction.java----------------> public class AddMaterialAction extends ActionSupport { //屬性類型需要類型轉(zhuǎn)換的對(duì)象 private Material material; public Material getMaterial() { return material; } public void setMaterial(Material material) { this.material = material; } public String execute() throws Exception { return SUCCESS; } }
?
配置文件中的導(dǎo)航定義:
?
- <!--------------------文件名:struts.xml---------------------> ??
- <!--?Action所在包定義?--> ??
- ?????????< package ?name= "C07.1.1" ? extends = "struts-default" >??????????????? ??
- ???????????????????<action?name= "addMaterial" ??
- ???????????????????????????? class = "com.action.AddMaterialAction" > ??
- ????????????????????????????<result?name= "input" >/jsp/addMaterial.jsp</result> ??
- ????????????????????????????<result?name= "success" >/jsp/showMaterial.jsp</result> ??
- ???????????????????</action> ??
- ?????????</ package >??
<!--------------------文件名:struts.xml---------------------> <!-- Action所在包定義 --> <package name="C07.1.1" extends="struts-default"> <action name="addMaterial" class="com.action.AddMaterialAction"> <result name="input">/jsp/addMaterial.jsp</result> <result name="success">/jsp/showMaterial.jsp</result> </action> </package>
?
類型轉(zhuǎn)換的數(shù)據(jù)輸入 JSP 文件:
?
- <!---------------------文件名:addMaterial.jsp-------------> ??
- ………… ??
- ?????????<!--?材料輸入表單?--> ??
- ????<table> ??
- ???????<s:form?id= "materialForm" ?action= "addMaterial" > ??
- ???????????<s:textfield?name= "material.material" ?label= "材料名" ></s:textfield> ??
- ???????????<s:textfield?name?= "material.bid" ?label= "價(jià)格" ></s:textfield> ??
- ???????????<s:textfield?name?= "material.mount" ?label= "庫(kù)存量" ></s:textfield> ??
- ???????????<s:datetimepicker?name?= "material.expireDate" ?label= "過(guò)期日期" ></s:datetimepicker> ??
- ???????????<s:submit?value= "提交" ></s:submit> ??
- ???????</s:form> ??
- ????</table>?? ??
- …………??
<!---------------------文件名:addMaterial.jsp-------------> ………… <!-- 材料輸入表單 --> <table> <s:form id="materialForm" action="addMaterial"> <s:textfield name="material.material" label="材料名"></s:textfield> <s:textfield name ="material.bid" label="價(jià)格"></s:textfield> <s:textfield name ="material.mount" label="庫(kù)存量"></s:textfield> <s:datetimepicker name ="material.expireDate" label="過(guò)期日期"></s:datetimepicker> <s:submit value="提交"></s:submit> </s:form> </table> …………
?
類型轉(zhuǎn)換的顯示數(shù)據(jù) JSP 文件:
?
- <!----------------------文件名:showMaterial.jsp--------------> ??
- ………… ??
- ????????????????<!--?材料數(shù)據(jù)顯示?--> ??
- ????????????<table>??????????? ??
- ????????????????材料名:?<s:property?value= "material.material" ?></s:property> ??
- ????????????????價(jià)格:???<s:property?value= "material.bid" ?></s:property> ??
- ????????????????庫(kù)存量:??<s:property?value= "material.mount" ?></s:property> ??
- ????????????????過(guò)期日期:?<s:property?value= "material.expireDate" ?></s:property>???????? ??
- ????????????</table>???????????? ??
- …………??
<!----------------------文件名:showMaterial.jsp--------------> ………… <!-- 材料數(shù)據(jù)顯示 --> <table> 材料名: <s:property value="material.material" ></s:property> 價(jià)格: <s:property value="material.bid" ></s:property> 庫(kù)存量: <s:property value="material.mount" ></s:property> 過(guò)期日期: <s:property value="material.expireDate" ></s:property> </table> …………
?
數(shù)據(jù)輸入如圖 7.1 。
圖 7.1 ? 各種基本類型數(shù)據(jù)輸入
顯示數(shù)據(jù)如圖 7.2 。請(qǐng)注意各種 Java 類型數(shù)據(jù)在顯示頁(yè)面和輸入頁(yè)面的格式和顯示不同之處。
圖 7.2 ? 各種基本類型數(shù)據(jù)顯示
代碼解釋
( 1 ) 在本示例中,筆者在頁(yè)面上輸入一個(gè) Material 對(duì)象的所有屬性值,并將它的屬性值顯示在頁(yè)面上。由于之前很多示例中已經(jīng)有過(guò) Material 這個(gè) JavaBean 對(duì)象代碼。這里就沒(méi)有寫出給讀者參閱。由以顯示的示例代碼也可知, Material 對(duì)象由材料名、價(jià)格、庫(kù)存量和材料過(guò)期日期四個(gè)屬性組成。恰好這四個(gè)屬性的數(shù)據(jù)類型分別是 String 、 double 、 int 、 date 四個(gè) Java 類型,因此由該示例可以明白 Struts2 的類型轉(zhuǎn)換是如何轉(zhuǎn)換這些 Java 類型。由于 Struts2 也是使用攔截器來(lái)進(jìn)行類型轉(zhuǎn)換,因此對(duì)這些基本的 Java 類型轉(zhuǎn)換根本不需要開(kāi)發(fā)人員編寫任何類型轉(zhuǎn)換代碼。
( 2 )在輸入數(shù)據(jù)的頁(yè)面,筆者使用 OGNL 和 Struts2 標(biāo)簽來(lái)建立一個(gè)數(shù)據(jù)輸入的表單。使用的 material 對(duì)象在 Action 中已定義完成,并建立 getter 、 setter 方法。這樣在 JSP 頁(yè)面可以設(shè)置該對(duì)象。在頁(yè)面中按“提交”按鈕后,就相當(dāng)于“ setMaterial () ”方法。在系統(tǒng)根據(jù) struts.xml 配置文件執(zhí)行 Action 之前, Struts2 自帶的類型轉(zhuǎn)換攔截器就已經(jīng)將 Material 對(duì)象中幾個(gè)屬性變量的類型由頁(yè)面上輸入時(shí)候的 String 類型轉(zhuǎn)換為 Material 對(duì)象屬性變量被定義的數(shù)據(jù)類型。
( 3 )在數(shù)據(jù)顯示頁(yè)面上顯示數(shù)據(jù)時(shí)候,實(shí)際上做的事情是上述操作的一個(gè)逆向操作。 Material 對(duì)象中每個(gè)屬性變量的數(shù)據(jù)類型又都轉(zhuǎn)換為頁(yè)面上需要顯示的 String 類型。
( 4 )實(shí)際上在開(kāi)發(fā)工作中,除非有根據(jù)特殊需求需要類型轉(zhuǎn)換之外。在 Struts2 中絕大部分類型轉(zhuǎn)換都已經(jīng)由 Struts2 自己完成。因此給開(kāi)發(fā)者節(jié)省了大量開(kāi)發(fā)時(shí)間。有時(shí)候根本沒(méi)有意識(shí)到數(shù)據(jù)類型已經(jīng)被轉(zhuǎn)換。除了 Java 基本類型轉(zhuǎn)換之外,有時(shí)候在頁(yè)面上需要批量輸入一些數(shù)據(jù),如果這些數(shù)據(jù)也像本示例的 Material 對(duì)象一樣,那么可以使用 Struts2 自帶的對(duì)集合類型的轉(zhuǎn)換功能來(lái)完成類型轉(zhuǎn)換,下面先介紹 List 類型集合的類型轉(zhuǎn)換。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
