- JavaWeb從入門到精通(視頻實戰版)
- 常倬林等編著
- 1677字
- 2018-12-31 19:36:07
6.7 在Struts中使用Velocity
的模板語言。在WebWork早期版本中是默認的模板編寫語言,不過升級Struts2后更加推薦使用FreeMarker,因為它有比Velocity更好的錯誤報告,支持JSP Tag,還有其他一些細微優點。當然,它們都是JSP很好的替代品。由Velocity編寫的文件后綴名為“.vm”。(請參考第5章中關于Velocity Result的介紹)。
本節介紹Velocity在Struts2中是如何應用的,Velocity的詳細使用方法請參考Velocity文檔。Velocity是apache基金會支持的一個項目,可以訪問它的網站http://velocity.apache.org/來學習它。
6.7.1 最簡單的應用
開始使用velocity,首先需要保證所有的依賴都已經被加入到工程的CLASSPATH。其次,struts-default.xml中要配置好VelocityResult,它將映射action和模板。這里給出的例子功能與6.6節給出的基本一樣,只是把登錄功能改成注冊功能。具體步驟如下:
1)在web.xml文件配置關于Struts2和velocity,具體內容如實例6-23所示。
【實例6-23】web.xml配置文件:web.xml
01 <filter> 02 <filter-name>struts2</filter-name> 03 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 04 </filter> 05 <!--FilterDispatcher用來初始化Struts2并且處理所有的Web請求--> 06 <filter-mapping> 07 <filter-name>struts2</filter-name> 08 <url-pattern>/*</url-pattern> 09 </filter-mapping> 10 <servlet> 11 <servlet-name>velocity</servlet-name> 12 <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet- 13 class> 14 </servlet> 15 <servlet-mapping> 16 <servlet-name>velocity</servlet-name> 17 <url-pattern>*.vm</url-pattern> 18 </servlet-mapping> 19 <welcome-file-list> 20 <welcome-file>index.jsp</welcome-file> 21 </welcome-file-list> 22 </web-app>
【代碼剖析】上述代碼的第6行到第9行實現對Struts2核心過濾器的配置,接著配置類velocity,該類支持在velocity中進行一些配置。
2)利用velocity模板創建出關于注冊、注冊成功和注冊失敗頁面,具體內容如實例6-24、實例6-25和實例6-26所示。
【實例6-24】關于注冊頁面:register.vm
01 <html> 02 <head> 03 <title>register</title> 04 </head> 05 <body> 06 <form action="userRegister.action" method="post"> 07 <table align="center"> 08 <tr> 09 <td> 10 注冊頁面 11 </td> 12 <td> 13 </td> 14 </tr> 15 <tr> 16 <td> <!--關于用戶名輸入框--> 17 用戶名: 18 <input type="text" name="username"> 19 </td> 20 </tr> 21 <tr> 22 <td> <!--關于密碼輸入框--> 23 密碼: 24 <input type="password" 25 name="password"> 26 27 </td> 28 </tr> 29 <tr> 30 <td> <!--關于年齡輸入框--> 31 年齡: 32 <input type="text" name="age"> 33 34 </td> 35 </tr> 36 <tr> 37 <td> <!--關于提交按鈕--> 38 <input type="submit" name="submit" 39 value="提交" /> 40 </td> 41 </tr> 42 </table> 43 </form> 44 </body> 45 </html>
【運行程序】瀏覽該頁面,結果如圖6.19所示。
【代碼剖析】上述代碼只是普通的HTML代碼,不過該文件的后綴名.vm。
【實例6-25】關于注冊成功頁面:success.vm
01 <html> 02 <head> 03 <title>success</title> 04 </head> 05 <body> 06 以下是您注冊的信息: 07 <br> 08 用戶名:$username <!--顯示用戶名--> 09 <br> 10 密碼:$password <!--顯示密碼--> 11 <br> 12 年齡:$age <!--顯示年齡--> 13 <br> 14 </body> 15 </html>
【運行程序】注冊成功,結果如圖6.20所示。

圖6.19 注冊頁面

圖6.20 注冊成功
【代碼剖析】上述代碼中通過$屬性名,來輸出保存在Session中user對象相應屬性的值。
【實例6-26】關于登錄失敗頁面:error.vm
01 <html> 02 <head> 03 <title>error</title> 04 </head> 05 <body> 06 $state <!--顯示相應的信息--> 07 </body> 08 </html>
【運行程序】注冊失敗,結果如圖6.21所示。

圖6.21 注冊失敗
【代碼剖析】上述代碼中第6行$state表示輸出保存在ActionContext中的值。
3)建立Action類,該類主要通過獲取HTTP請求、參數等,然后實現該項目的邏輯功能,具體內容如實例6-27所示。
【實例6-27】關于Action類:RegiserAction.java
01 public class RegiserAction implements Action { 02 private String username; //關于用戶名變量 03 private String password; //關于密碼變量 04 private int age; //關于年齡變量 05 public String getUsername() { //設置用戶名的getter和setter方法 06 return username; 07 } 08 public void setUsername(String username) { 09 this.username = username; 10 } 11 public String getPassword() { //設置密碼的getter和setter方法 12 return password; 13 } 14 public void setPassword(String password) { 15 this.password = password; 16 } 17 public int getAge() { //設置年齡的getter和setter方法 18 return age; 19 } 20 public void setAge(int age) { 21 this.age = age; 22 } 23 public String execute() throws Exception { //重寫執行方法 24 // 判斷注冊的用戶名是否存在 25 ActionContext ctx = ActionContext.getContext(); 26 if (this.getUsername().equals("cjgong")) { 27 ctx.put("state", "該用戶名已經存在, 請重新注冊"); 28 return "error"; //返回出錯字符串 29 } else { 30 ctx.put("username", this.getUsername()); 31 ctx.put("password", this.getPassword()); 32 ctx.put("age", this.getUsername()); 33 return "success"; //返回成功字符串 34 } 35 } 36 }
【代碼剖析】上述代碼首先創建了關于用戶名字和密碼的屬性,然后為這些屬性創建方法,最后在execute()方法中實現了該項目的邏輯功能。
如果想讓該項目正常運行,還必須在struts.xml文件中配置上述代碼,具體內容如實例6-28所示。
【實例6-28】關于struts配置文件:struts.xml
01 <struts> 02 <package name="com" extends="struts-default"> 03 <action name="*"> 04 <result type="velocity">/userRegister/{1}.vm</result> 05 </action> 06 <action name="userRegister" class="com.cjg.RegiserAction"> 07 <!--指定result的type為velocity--> 08 <result name="success" type="velocity"> 09 /userRegister/success.vm 10 </result> 11 <result name="error" type="velocity"> 12 /userRegister/error.vm 13 </result> 14 </action> 15 </package> 16 </struts>
【代碼剖析】上述代碼中將標簽<result>的type設為velocity,當注冊成功則會轉向success.vm,當注冊失敗則會轉向error.vm。
6.7.2 變量解析
在Velocity中,將從幾個不同的位置查找變量。順序如下:
1)值棧(value stack)。
2)action上下文(context)。
3)內置對象。
Velocity中內置對象如表6.27所示。
表6.27 Velocity內置對象表

6.7.3 配置Velocity
有時可能希望擴展Struts2提供的Velocity支持。最常見的原因是希望加入自己的標簽,就像從Struts2內建的標簽中擴展一樣。
想要這樣做,寫一個新的擴展自com.opensymphony.webwork. views.velocity.VelocityManager的類或者也可以覆蓋它,然后增加如下內容到webwork.properties:
webwork.velocity.manager.classname = com.yourcompany.YourVelocityManager
可以通過替換velocity.properties中的配置項來配置Velocity。
6.7.4 在VM文件中使用標簽
Velocity標簽是WebWork提供的一般Tag的擴展,只要簡單地了解這些標簽的訪問方式: #sxxx (...) ... #end (),就可以馬上開始使用了。
注意
“#s”后面是沒有空格的,它與標簽名稱直接連在一起(雖然不會發生什么混亂,但在閱讀上實在很不舒服,而且Velocity沒有采用主流的XML格式)。
還是那個例子,在JSP中可能這樣創建一個form:
<s:form action="updatePerson"> <s:textfield label="First name" name="firstName"/> <s:submit value="Update"/> </s:form>
在Velocity中同樣的form這樣創建:
#sform ("action=updatePerson") #stextfield ("label=First name" "name=firstName") #ssubmit ("value=Update") #end
在上面的例子中注意到,一些標簽需要“#end”聲明,而其他的卻不需要。這是由于Velocity中的限制,如果有塊(block)或者內聯(inline)標簽在前面,標簽必須聲明#end。而默認情況下所有的標簽都是內聯(inline)的,除了很少的幾個,例如form標簽。
- DBA攻堅指南:左手Oracle,右手MySQL
- Objective-C Memory Management Essentials
- R語言數據可視化之美:專業圖表繪制指南
- 機器人Python青少年編程開發實例
- 程序員考試案例梳理、真題透解與強化訓練
- Troubleshooting PostgreSQL
- SQL Server 2016數據庫應用與開發
- bbPress Complete
- 編程菜鳥學Python數據分析
- CoffeeScript Application Development Cookbook
- C# and .NET Core Test Driven Development
- 多模態數據分析:AGI時代的數據分析方法與實踐
- Vue.js 3應用開發與核心源碼解析
- Python編程快速上手2
- JavaScript前端開發基礎教程