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

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