第 6 章 ? Struts2 非 JSP 視圖技術(shù)
在之前的章節(jié)中,筆者的代碼示例都是用 JSP 來實(shí)現(xiàn)的。其實(shí) Struts2 不僅僅支持 JSP 這一種視圖技術(shù)。作為 MVC 架構(gòu)中 view 層技術(shù), velocity 和 FreeMarker 視圖技術(shù)也是很優(yōu)秀的,近年來很多 Web 系統(tǒng)項(xiàng)目的架構(gòu)師和開發(fā)者都開始放棄使用 JSP 作為 view 層顯示技術(shù)轉(zhuǎn)向使用 velocity 和 FreeMarker 。因此筆者覺得有必要介紹 Struts2 框架是如何支持這兩種視圖技術(shù)的。希望本章能讓讀者作為“敲門磚”,敲開這兩種視圖技術(shù)的學(xué)習(xí)“大門”。
6.1 ? velocity 視圖技術(shù)使用介紹
velocity 翻譯成中文就是“速度”的意思,它的縮寫“ v ”就是物理學(xué)中代表速度的符號(hào)。由它的名字可以想象出它的設(shè)計(jì)者對(duì)它有什么期望吧。畢竟有時(shí)候使用 JSP 來實(shí)現(xiàn) view 層對(duì)于開發(fā)者來說是件很麻煩又費(fèi)時(shí)的事情。 velocity 就是為開發(fā)者節(jié)約大量 view 層開發(fā)時(shí)間而準(zhǔn)備的視圖技術(shù)。它使用模板文件來顯示視圖界面。除了它自身的書寫格式外,模板文件中其他代碼就是普通的 html 代碼。因此它也是實(shí)現(xiàn)松耦合,讓美工和開發(fā)人員各司其職進(jìn)行 view 層開發(fā)。下面通過示例來介紹它在 Struts2 中的使用方式。
技術(shù)要點(diǎn)
本節(jié)代碼說明 velocity 在 Struts2 中使用方式。
velocity 基本語義和書寫格式說明。
模板文件 vm 介紹 。
Struts2 中如何使用 velocity 。
演示代碼
顯示數(shù)據(jù)的 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>材料價(jià)格(單位:元)</td> ??
- ??????????<td>材料庫存量(單位:個(gè))</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>材料價(jià)格(單位:元)</td> <td>材料庫存量(單位:個(gè))</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; } }
?
配置文件對(duì) Action 的配置內(nèi)容:
- <!--------------文件名: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>
?
對(duì)支持中文字符的字符編碼集設(shè)置:
- <!---------------文件名:struts.properties-------> ??
- #支持本地化的資源文件名定義 ??
- struts.i18n.encoding=gb2312??
<!---------------文件名:struts.properties-------> #支持本地化的資源文件名定義 struts.i18n.encoding=gb2312
?
示例效果顯示如圖 6.1 。
?
圖 6.1 ? velocity 顯示效果圖
代碼解釋
( 1 )本節(jié)示例是將一些裝修材料用 list 形式顯示在頁面上。如之前筆者講述的實(shí)例完全可以由 JSP 來完成。而該示例是使用 velocity 技術(shù)來實(shí)現(xiàn)。讀者也可以將其理解為一種和 JavaScript 相同的腳本語言。它的語義和語法中有以下幾個(gè)注意點(diǎn)。
“ # ”標(biāo)識(shí):該標(biāo)識(shí)用來表明 velocity 中的控制語句。比如“ #if ”、“ #foreach ”等,都是用來控制流程轉(zhuǎn)向的。
“ $ ”標(biāo)識(shí):該標(biāo)識(shí)來表示對(duì)象或變量。比如示例中的“ $Material ”。如果這些對(duì)象還有自己的屬性,則可以在其后面再加“ . ” , 如示例中的“ $Material .material ”。
“ {} ”標(biāo)識(shí):該標(biāo)識(shí)用來為某對(duì)象或變量賦具體的值。比如“ {frank} ”
“!”標(biāo)識(shí):假設(shè)某變量值為 null 或者還沒被定義。則在該變量前加上“!”,這樣在頁面上調(diào)用該變量之處一律顯示為空白即“ ”。
“ # ”標(biāo)識(shí): velocity 語言的注釋標(biāo)識(shí)。
( 2 ) velocity 模板文件后綴名都是“ vm ”結(jié)尾。該類型文件中除了可以書寫 velocity 自己的語言代碼之外,也可以使用 HTMl 語言的標(biāo)簽。在本示例中查看 show.vm 文件就可以知道它和 JSP 文件還是很相像的。而且 Struts2 的標(biāo)簽也可以在 vm 文件中使用, 只需要在原有標(biāo)簽前加“ #s ”就可以了,參數(shù)之間使用 “” 分隔。如果讀者需要在 vm 文件中引入其他文件,這些被引入文件是 JSP 或者 vm 類型的話,將會(huì)顯示文件中的定義的各種動(dòng)態(tài)數(shù)據(jù)。如果是其他類型的文件被引入的話,只是顯示這些文件的文本即靜態(tài)引入。一般是使用“ #inclue (“文件名”)”格式進(jìn)行 引入。如果需要引入多個(gè)文件則在“()”中以“,”相隔。還有個(gè)引入文件的書寫代碼格式是“ #parse ”,這個(gè)只能引入 vm 類型文件,而且只能引入一個(gè)。不過這樣引入也有一個(gè)好處,那就是被引入 vm 文件中不僅可以使用它自己定義的變量也可以使用引入它的 vm 文件中的變量。這樣引入文件和被引入文件關(guān)系有點(diǎn)像 JAVA 中父類和子類關(guān)系。還有如果想讓界面中顯示 velocity 中這些標(biāo)識(shí),而不被 velocity 解析,那可以在它們前面加上“ \ ”。比如想顯示“ $ ”,則可以寫成“ \$ ”,這樣在“ $ ”后面的內(nèi)容, velocity 不會(huì)將其解析成 velocity 的變量而只是普通文本。
另外需要注意的時(shí)候, velocity 只會(huì)按照 gettXXX() 解析變量,例如 Material.material 實(shí)際上找到的 Material.getMaterial() 方法,讀者可以試著在 Action 寫一個(gè)變量而不使用 getXXX() 方法,看看會(huì)不會(huì)在 vm 中取到值,答案是變量照樣會(huì)被輸出。
( 3 )在 Struts2 中使用 velocity 技術(shù),首先要在項(xiàng)目中導(dǎo)入 velocity 的 jar 包,具體 jar 包名請(qǐng)讀者參考項(xiàng)目示例。在該示例中 Action 無需過多說明。值得說的是 struts.xml 文件,比如在示例代碼中筆者用黑體注明了 result 的返回類型必須是“ velocity ”,這樣才可以調(diào)用 vm 模板文件。然后就可以像使用 JSP 一樣使用 vm 文件顯示 Action 的定義的材料 list 數(shù)據(jù)。
注意:由于 velocity 缺省顯示中文字符用的字符編碼集合是“ ISO-88591 ”。如果開發(fā)中使用的項(xiàng)目字符編碼集合不是“ ISO-88591 ”,則需要在 struts.properties 中定義“ struts.i18n.encoding ”為開發(fā)中使用的字符編碼集。比如在本示例中筆者就定義為“ gb2312 ”。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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