第 6 章 ? Struts2 非 JSP 視圖技術
在之前的章節中,筆者的代碼示例都是用 JSP 來實現的。其實 Struts2 不僅僅支持 JSP 這一種視圖技術。作為 MVC 架構中 view 層技術, velocity 和 FreeMarker 視圖技術也是很優秀的,近年來很多 Web 系統項目的架構師和開發者都開始放棄使用 JSP 作為 view 層顯示技術轉向使用 velocity 和 FreeMarker 。因此筆者覺得有必要介紹 Struts2 框架是如何支持這兩種視圖技術的。希望本章能讓讀者作為“敲門磚”,敲開這兩種視圖技術的學習“大門”。
6.1 ? velocity 視圖技術使用介紹
velocity 翻譯成中文就是“速度”的意思,它的縮寫“ v ”就是物理學中代表速度的符號。由它的名字可以想象出它的設計者對它有什么期望吧。畢竟有時候使用 JSP 來實現 view 層對于開發者來說是件很麻煩又費時的事情。 velocity 就是為開發者節約大量 view 層開發時間而準備的視圖技術。它使用模板文件來顯示視圖界面。除了它自身的書寫格式外,模板文件中其他代碼就是普通的 html 代碼。因此它也是實現松耦合,讓美工和開發人員各司其職進行 view 層開發。下面通過示例來介紹它在 Struts2 中的使用方式。
技術要點
本節代碼說明 velocity 在 Struts2 中使用方式。
velocity 基本語義和書寫格式說明。
模板文件 vm 介紹 。
Struts2 中如何使用 velocity 。
演示代碼
顯示數據的 vm 模板文件代碼:
- <!---------------文件名:?show.vm---------> ??
- <html> ??
- ????<head> ??
- ????<title>Velocity使用范例</title> ??
- ????<meta?http-equiv= "content-type" ?content= "text/html;?charset=GB2312" /> ??
- ????</head> ??
- ?????<body> ??
- ???????<h3?align= "left" > ??
- ????????????Velocity使用范例 ??
- ????????</h3> ??
- ???????<h1>裝修材料信息列表</h1> ??
- ?<table?border> ??
- ????????<tr?align= "center" > ??
- ??????????<td>材料名</td> ??
- ??????????<td>材料價格(單位:元)</td> ??
- ??????????<td>材料庫存量(單位:個)</td> ??
- ????????</tr> ??
- ????????#foreach($Material?in?$mList) ??
- ??????????????<tr?align= "center" > ??
- ??????????????????<td>$Material.material</td> ??
- ??????????????????<td>$Material.bid</td> ??
- ??????????????????<td>$Material.mount</td> ??
- ?????????????</tr> ??
- ???????#end ??
- ???????</table> ??
- ????</body> ??
- </html>??
<!---------------文件名: show.vm---------> <html> <head> <title>Velocity使用范例</title> <meta http-equiv="content-type" content="text/html; charset=GB2312"/> </head> <body> <h3 align="left"> Velocity使用范例 </h3> <h1>裝修材料信息列表</h1> <table border> <tr align="center"> <td>材料名</td> <td>材料價格(單位:元)</td> <td>材料庫存量(單位:個)</td> </tr> #foreach($Material in $mList) <tr align="center"> <td>$Material.material</td> <td>$Material.bid</td> <td>$Material.mount</td> </tr> #end </table> </body> </html>
?
Struts2 的使用 velocity 的 Action 代碼:
- <!----------文件名:VelocityAction.java-------> ??
- public ? class ?VelocityAction? extends ?ActionSupport{ ??
- ????????? private ?List?mList; ??
- ……… ??
- ????????? public ?String?execute()? throws ?Exception{ ??
- ???????????????????mList?=? new ?ArrayList(); ??
- ??????????????????? for ( int ?i= 0 ;i< 4 ;i++){ ??
- ????????????????????????????Material?m?=? new ?Material(); ??
- ????????????????????????????m.setMaterial( "材料" +(i+ 1 )); ??
- ????????????????????????????m.setMount( 10 *(i+ 1 )); ??
- ????????????????????????????m.setBid( 1.0 +(i+ 1 )); ??
- ????????????????????????????mList.add(m);???????????????????? ??
- ???????????????????} ??
- ??????????????? return ?SUCCESS;????????????? ??
- ?????????} ??
- }??
<!----------文件名:VelocityAction.java-------> public class VelocityAction extends ActionSupport{ private List mList; ……… public String execute() throws Exception{ mList = new ArrayList(); for(int i=0;i<4;i++){ Material m = new Material(); m.setMaterial("材料"+(i+1)); m.setMount(10*(i+1)); m.setBid(1.0+(i+1)); mList.add(m); } return SUCCESS; } }
?
配置文件對 Action 的配置內容:
- <!--------------文件名:struts.xml-------------> ??
- ……… ??
- < package ?name= "C06.1" ? extends = "struts-default" > ??
- ???????????????????<action?name= "velocity" ??
- ???????????????????????????? class = "action.VelocityAction" > ??
- ????????????????????????????<result?name= "success" ?type= "velocity" >/velocity/show.vm</result> ??
- ???????????????????</action> ??
- </ package >??
<!--------------文件名:struts.xml-------------> ……… <package name="C06.1" extends="struts-default"> <action name="velocity" class="action.VelocityAction"> <result name="success" type="velocity">/velocity/show.vm</result> </action> </package>
?
對支持中文字符的字符編碼集設置:
- <!---------------文件名:struts.properties-------> ??
- #支持本地化的資源文件名定義 ??
- struts.i18n.encoding=gb2312??
<!---------------文件名:struts.properties-------> #支持本地化的資源文件名定義 struts.i18n.encoding=gb2312
?
示例效果顯示如圖 6.1 。
?
圖 6.1 ? velocity 顯示效果圖
代碼解釋
( 1 )本節示例是將一些裝修材料用 list 形式顯示在頁面上。如之前筆者講述的實例完全可以由 JSP 來完成。而該示例是使用 velocity 技術來實現。讀者也可以將其理解為一種和 JavaScript 相同的腳本語言。它的語義和語法中有以下幾個注意點。
“ # ”標識:該標識用來表明 velocity 中的控制語句。比如“ #if ”、“ #foreach ”等,都是用來控制流程轉向的。
“ $ ”標識:該標識來表示對象或變量。比如示例中的“ $Material ”。如果這些對象還有自己的屬性,則可以在其后面再加“ . ” , 如示例中的“ $Material .material ”。
“ {} ”標識:該標識用來為某對象或變量賦具體的值。比如“ {frank} ”
“!”標識:假設某變量值為 null 或者還沒被定義。則在該變量前加上“!”,這樣在頁面上調用該變量之處一律顯示為空白即“ ”。
“ # ”標識: velocity 語言的注釋標識。
( 2 ) velocity 模板文件后綴名都是“ vm ”結尾。該類型文件中除了可以書寫 velocity 自己的語言代碼之外,也可以使用 HTMl 語言的標簽。在本示例中查看 show.vm 文件就可以知道它和 JSP 文件還是很相像的。而且 Struts2 的標簽也可以在 vm 文件中使用, 只需要在原有標簽前加“ #s ”就可以了,參數之間使用 “” 分隔。如果讀者需要在 vm 文件中引入其他文件,這些被引入文件是 JSP 或者 vm 類型的話,將會顯示文件中的定義的各種動態數據。如果是其他類型的文件被引入的話,只是顯示這些文件的文本即靜態引入。一般是使用“ #inclue (“文件名”)”格式進行 引入。如果需要引入多個文件則在“()”中以“,”相隔。還有個引入文件的書寫代碼格式是“ #parse ”,這個只能引入 vm 類型文件,而且只能引入一個。不過這樣引入也有一個好處,那就是被引入 vm 文件中不僅可以使用它自己定義的變量也可以使用引入它的 vm 文件中的變量。這樣引入文件和被引入文件關系有點像 JAVA 中父類和子類關系。還有如果想讓界面中顯示 velocity 中這些標識,而不被 velocity 解析,那可以在它們前面加上“ \ ”。比如想顯示“ $ ”,則可以寫成“ \$ ”,這樣在“ $ ”后面的內容, velocity 不會將其解析成 velocity 的變量而只是普通文本。
另外需要注意的時候, velocity 只會按照 gettXXX() 解析變量,例如 Material.material 實際上找到的 Material.getMaterial() 方法,讀者可以試著在 Action 寫一個變量而不使用 getXXX() 方法,看看會不會在 vm 中取到值,答案是變量照樣會被輸出。
( 3 )在 Struts2 中使用 velocity 技術,首先要在項目中導入 velocity 的 jar 包,具體 jar 包名請讀者參考項目示例。在該示例中 Action 無需過多說明。值得說的是 struts.xml 文件,比如在示例代碼中筆者用黑體注明了 result 的返回類型必須是“ velocity ”,這樣才可以調用 vm 模板文件。然后就可以像使用 JSP 一樣使用 vm 文件顯示 Action 的定義的材料 list 數據。
注意:由于 velocity 缺省顯示中文字符用的字符編碼集合是“ ISO-88591 ”。如果開發中使用的項目字符編碼集合不是“ ISO-88591 ”,則需要在 struts.properties 中定義“ struts.i18n.encoding ”為開發中使用的字符編碼集。比如在本示例中筆者就定義為“ gb2312 ”。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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