- JavaWeb從入門到精通(視頻實戰版)
- 常倬林等編著
- 1616字
- 2018-12-31 19:36:07
6.6 在Struts中使用FreeMarker
FreeMarker是一個Java模板語言,它是JSP的絕佳替代方案,也是一個開源項目。FreeMarker允許Java Servlet保持圖形設計同應用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用Servlet提供的數據動態地生成HTML。由FreeMarker編寫的文件后綴名為“.ftl”。在Struts中對FreeMarker提供了完美的支持,只需要在選擇result type為FreeMarker就可以使用FreeMarker來輸出頁面了。(請參考第5章中關于FreeMarker Result的介紹)。
本節介紹FreeMarker在Struts2中是如何應用的,FreeMarker的詳細使用方法請參考FreeMarker文檔或訪問它的網站http://freemarker.org/。
6.6.1 最簡單的應用
確認配置好項目的CLASSPATH中的所有依賴以后,就可以開始使用FreeMarker了。典型情況下只需要freemarker.jar。下面將通過該模塊實現最簡單的登錄功能,具體步驟如下:
1)在web.xml文件配置關于Struts2和FreeMarker,具體內容如實例6-17所示。
【實例6-17】web.xml配置文件:web.xml
01 <?xml version="1.0" encoding="UTF-8"?> 02 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 03 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 04 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 05 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 06 <filter> 07 <filter-name>struts2</filter-name> 08 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 09 </filter> 10 <filter-mapping> 11 <filter-name>struts2</filter-name> 12 <url-pattern>/*</url-pattern> 13 </filter-mapping> 14 <servlet> 15 <servlet-name>JspSupportServlet</servlet-name> 16 <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> 17 <load-on-startup>1</load-on-startup> 18 </servlet> 19 </web-app>
【代碼剖析】上述代碼的第6行到第13行實現對Struts2核心過濾器的配置,接著再配置類JspSupportServlet,該類支持在FreeMarker中進行一些配置。
2)利用FreeMarker模板創建出關于登錄、登錄成功和登錄失敗頁面,具體內容如實例6-18、實例6-19和實例6-20所示。
【實例6-18】關于登錄頁面:login.ftl
01 <html> 02 <head> 03 <title>login</title> 04 </head> 05 <body> 06 <form action="login.action" method="post"> 07 <center> 08 請登錄 09 </center> 10 <table align="center"> 11 <tr> 12 <td> 13 用戶名: 14 </td> 15 <td> <!--關于用戶名輸入框--> 16 <input type="text" name="username" /> 17 </td> 18 </tr> 19 <tr> 20 <td> 21 密碼: 22 </td> 23 <td> <!--關于密碼輸入框--> 24 <input type="password" 25 name="password"> 26 </td> 27 </tr> 28 <tr> 29 <td> <!--關于提交按鈕--> 30 <input type="submit" name="submit" 31 value="登錄" /> 32 </td> 33 </tr> 34 </table> 35 </form> 36 </body> 37 </html>
【運行程序】瀏覽該頁面,結果如圖6.16所示。
【代碼剖析】上述代碼只是普通的HTML代碼,不過該文件的后綴名為.ftl。
【實例6-19】關于登錄成功頁面:success.ftl
01 <html> 02 <head> 03 <title>success</title> 04 </head> 05 <body> 06 <center> ${user},${state}</center> <!--顯示登錄成功的信息--> 07 </body> 08 </html>
【運行程序】當登錄成功,結果如圖6.17所示。

圖6.16 瀏覽頁面

圖6.17 登錄成功
【代碼剖析】上述代碼中第6行代碼里${user}表示輸出保存在Session中關于user的值,而${state}表示輸出保存在ActionContext中的值。
【實例6-20】關于登錄失敗頁面:error.ftl
01 <html> 02 <head> 03 <title>error</title> 04 </head> 05 <body> 06 <center> ${state} </center> <!--顯示登錄失敗的信息--> 07 </body> 08 </html>
【運行程序】登錄失敗,結果如圖6.18所示。

圖6.18 登錄失敗
【代碼剖析】上述代碼中第6行代碼里${state}表示輸出保存在ActionContext中的值。
3)建立Action類,該類主要通過獲取HTTP請求、參數等,然后實現該項目的邏輯功能,具體內容如實例6-21所示。
【實例6-21】關于Action類:LoginAction.java
01 public class LoginAction extends ActionSupport { 02 private String username; //關于用戶名的變量 03 private String password; //關于密碼的變量 04 public String getUsername() { //關于用戶名的getter和setter方法 05 return username; 06 } 07 public void setUsername(String username) { 08 this.username = username; 09 } 10 public String getPassword() { //關于密碼的getter和setter方法 11 return password; 12 } 13 public void setPassword(String password) { 14 this.password = password; 15 } 16 public String execute() throws Exception { //重寫執行方法 17 /* 18 * 只有用戶名為cjgong, 密碼為123456方可成功登錄 19 */ 20 ActionContext ctx = ActionContext.getContext(); 21 if (this.getUsername().equals("cjgong") 22 && this.getPassword().equals("123456")) { 23 ctx.getSession().put("user", this.getUsername()); 24 ctx.put("state", "登錄成功"); 25 return SUCCESS; 26 } else { 27 ctx.put("state", "登錄失敗"); //存儲出錯信息到變量state 28 return ERROR; 29 } 30 } 31 }
【代碼剖析】上述代碼中首先創建了關于用戶名字和密碼的屬性,然后為這些屬性創建方法,最后在execute()方法中實現了該項目的邏輯功能。
如果想讓該項目正常運行,還必須在struts.xml文件中配置上述代碼,具體內容如實例6-22所示。
【實例6-22】關于struts配置文件:struts.xml
01 <struts> 02 <package name="com" extends="struts-default"> 03 <action name="login" class="com.cjgong.LoginAction"> 04 <!--指定result的type為freemarker--> 05 <result name="success" type="freemarker"> 06 <param name="location">/userLogin/success.ftl</param> 07 <param 08 name="contentType">text/html;charset=GBK</param> 09 </result> 10 <result name="error" type="freemarker"> 11 <param name="location">/userLogin/error.ftl</param> 12 <param 13 name="contentType">text/html;charset=GBK</param> 14 </result> 15 </action> 16 </package> 17 </struts>
【代碼剖析】上述代碼中將標簽<result>的type設為FreeMarker,當登錄成功則會轉向success.ftl,當登錄失敗則會轉向error.ftl。
6.6.2 模板加載順序
Struts2在兩個位置查找FreeMarker模板:Web應用程序目錄(Web application)、classpath。這個順序對于在完全編譯的jar中提供模板很理想,但是也同時支持在Web應用程序目錄中定義這些模板來覆蓋jar中的模板文件。事實上,這就是為什么可以覆蓋Struts中默認的UI tags和Form Tags的原理。
還有可以通過templatePath上下文變量(context variable)指定一個路徑(文件系統中的任意一個目錄)。如果指定了該變量,那么這個目錄中的內容將會被優先尋找。
6.6.3 在FTL文件中使用標簽
再次提醒,Struts2提供標簽庫與表現方式是分離的,所以在JSP、FreeMarker、Velocity中都可以使用這些標簽。例如,在JSP中可能這樣創建一個form:
<s:form action="updatePerson"> <s:textfield label="First name" name="firstName"/> <s:submit value="Update"/> </s:form>
用FreeMarker編寫的FTL文件中創建同樣的form是這樣的:
<@s.form action="updatePerson"> <@s.textfield label="First name" name="firstName"/> <@s.submit value="Update"/> </@s.form>
FreeMarker允許動態屬性,這就意味著可以給這些標簽提供其本不支持的屬性。這些不能夠直接被應用到標簽對象的屬性將會被放到這個標簽的通用parameters map中。
在FTL文件中使用標簽比在JSP中更加靈活,不僅可以替代原本要使用param的情況,還可以在擴展form標簽的模板或者主題的時候使用這個功能。例如,創建了一個“3分欄”主題來替代標準的兩分欄主題(xhtml),可能想要在第3欄中顯示一個叫做“description”的擴展參數.form,可以這樣寫:
<@s.form action="updatePerson"> <@s.textfield label="First name" name="firstName" description="..."/> <@s.submit value="Update"/> </@s.form>
然后在新模板中可以通過${parameters.description}應用這個description。
- DB2 V9權威指南
- Instant Zepto.js
- Mastering Python Scripting for System Administrators
- 數據結構與算法JavaScript描述
- Linux環境編程:從應用到內核
- Mastering Python Networking
- Modern JavaScript Applications
- C#程序設計
- C語言課程設計
- Java:High-Performance Apps with Java 9
- 蘋果的產品設計之道:創建優秀產品、服務和用戶體驗的七個原則
- 打開Go語言之門:入門、實戰與進階
- 從零開始學Python網絡爬蟲
- 區塊鏈架構之美:從比特幣、以太坊、超級賬本看區塊鏈架構設計
- 30天學通C#項目案例開發