軟體專案實訓及課程設計指導——如何在Struts2框架中應用FreeMarker模板技術的例項
1、Struts2應用框架全面地支援FreeMarker模板技術
(1)FreeMarker模板特別適應於基於MVC體系架構模式的Web應用系統
Struts2應用框架預設採用FreeMarker作為其模板檔案,並且Struts2應用框架中所有的主題模板檔案都是採用FreeMarker模板技術編寫的。
(2)Struts2應用框架全面提供對FreeMarker模板技術的支援
在基於Struts2應用框架的Web應用系統中,開發人員只需要將專案中的Action類的配置定義中的結果<result>標籤中的type屬行設定為:type="freemarker",就可以自動地由Struts2應用框架中內帶的FreeMarker引擎完成模型資料和模板檔案的總裝配和輸出(參看如下示例圖所示)。
作者在下文為讀者介紹在J2EE Struts2應用框架的應用系統環境中如何應用FreeMarker模板技術。
2、在基於Struts2應用框架的Web專案中新增與FreeMarker有關的*.jar包檔案
在Web專案中新增與FreeMarker有關的*.jar包檔案,操作的主要過程可以參看如下示圖所示。
3、在基於Struts2應用框架的Web專案中新增一個請求頁面fmtUserLogin.jsp
(1)在Web專案中新增一個請求的JSP頁面,該頁面的檔名稱為fmtUserLogin.jsp檔案,在MyEclipse開發工具中選擇檔案新建選單專案,然後創建出一個JSP型別的頁面檔案,操作的主要過程可以參看如下示圖所示。
(2)fmtUserLogin.jsp檔案的程式碼內容參看如下的示例
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'fmtUserLogin.jsp' starting page</title></head><body> <form action="/Struts2Web/fmtUserInfoAction.action" method="post" > 您的名稱:<input type="text" name="userName" /> <br /> 您的密碼:<input type="password" name="userPassWord" /> <br /> <input type="submit" value="提交" name="submitButton" onclick="this.value='正在提交請求,請稍候'"/> <input type="reset" value="取消" /> </form></body></html>
fmtUserLogin.jsp頁面檔案在靜態狀態下預覽的效果示圖請參看如下示例圖所示。
4、在Web專案中再設計一個處理的Action類,該類名稱為FMTUserInfoAction
(1)包名稱為com.px1987.struts2.action,並繼承com.opensymphony.xwork2.ActionSupport基類
在Web專案中新增一個Action程式類,該Action程式類的檔名稱為FMTUserInfoAction.java檔案,在MyEclipse開發工具中選擇檔案新建類專案,然後創建出一個Java程式類檔案,並在該FMTUserInfoAction類繼承com.opensymphony.xwork2.ActionSupport基類,程式包名稱為com.px1987.struts2.action。操作的主要過程可以參看如下示圖所示。
(2)FMTUserInfoAction程式類的程式碼示例參看如下的程式示例,並注意其中黑體標識的語句。
package com.px1987.struts2.action;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import com.px1987.struts2.actionform.UserInfoActionForm;public class FMTUserInfoAction extends ActionSupport { private String userName=null; private String userPassWord=null; private UserInfoActionForm oneUserInfo=null; public FMTUserInfoAction() { } public String execute(){ //在該方法中進行使用者登陸的功能實現 String resultMessage=null; boolean returnResult=getUserName().equals("yang") &&getUserPassWord().equals("1234"); if(returnResult){ resultMessage =getUserName()+"您登入成功!"; } else{ resultMessage =getUserName()+"您的身份資訊無效!"; } HttpServletRequest request=ServletActionContext.getRequest(); request.setAttribute("showResultInfo", resultMessage); return this.SUCCESS; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassWord() { return userPassWord; } public void setUserPassWord(String userPassWord) { this.userPassWord = userPassWord; }}
5、在Web專案的系統配置檔案struts.xml檔案中配置出該Action類
在Web專案的系統配置檔案struts.xml檔案中的最終配置結果如下示例所示,請注意其中黑體所標識的語句。
<action name ="fmtUserInfoAction" class ="com.px1987.struts2.action.FMTUserInfoAction"> <result name="success" type="freemarker">/userManage/showInfoTemplate.ftl</result> <result name="input">/userManage/fmtUserLogin.jsp</result></action>
在系統配置檔案struts.xml檔案中的最終配置結果如下示例圖所示。
由於Struts2應用框架使用FreeMarker模板作為其預設的模板技術,因此Struts2應用框架對FreeMarker模板的技術支援是非常良好的。為了在Struts2應用框架中使用FreeMarker模板技術,只需要在struts.xml系統配置檔案中進行簡單配置(參看上面的配置示例)。
6、在基於Struts2應用框架的Web專案中新增一個模板檔案
(1)新增模板頁面showInfoTemplate.ftl檔案
在Web專案中新增一個模板檔案,該模板檔案的檔名稱為showInfoTemplate.ftl。在MyEclipse開發工具中選擇檔案新建選單專案,然後創建出一個模板檔案,操作的主要過程可以參看如下示圖所示。
(2)模板頁面showInfoTemplate.ftl檔案的程式碼內容,並注意其中的黑體標識的語句,該檔案中的程式碼主要是獲得使用者登入後的狀態資訊。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>showInfoTemplate.ftl</title><meta http-equiv="content-type" content="text/html; charset=gb2312"></head><body> <h2>採用標準的方式獲得引數值: ${showResultInfo}</h2 > <br> <h2>採用FreeMarker模板的內建變數的方式獲得引數值: ${Request.showResultInfo }</h2 > <br></body></html>
讀者需要注意的是,由於showInfoTemplate.ftl模板檔案不是JSP型別的頁面檔案,而是普通的文字檔案,該檔案的內容不需要透過JSP引擎的解析和處理。如下示例圖為showInfoTemplate.ftl模板檔案在MyEclipse開發工具中的顯示狀態圖。
Struts2應用框架還為在FreeMarker模板中訪問Servlet/JSP範圍物件提供了支援,透過這種支援可以直接訪問這些變數,FreeMarker模板的內建變數有如下幾個:
1)Stack:代表ValueStack本身,可透過如下方式來訪問其中的變數"${stack.findString('ognl expr')}"
2)Action:代表剛剛執行過的Action例項
3)Response:代表HpptServletResponse例項
4)Request::代表HpptServletRequest例項
5)Session:代表HpptSession例項
6)Application:代表ServletContext例項
7)Base:代表使用者請求的上下文路徑
從上面的showInfoTemplate.ftl模板頁面檔案示例中可以瞭解到FreeMarker的模板檔案基本上就是靜態的HTML頁面,FreeMarker模板檔案主要由如下4個部分組成:
1)文字:直接輸出的部分
2)註釋:<#-- ... -->格式部分,不會輸出
3)插值:即${...}或#{...}格式的部分,將使用資料模型中的部分替代輸出
4)FTL指令:由FreeMarker指定但和HTML標記基本類似,名字前加#予以區分,不會輸出。
7、部署本Web示例專案和測試示例中的相關功能
(1)部署本Web示例到Tomcat伺服器中,部署後的結果示圖如下示例圖所示。
(2)在瀏覽器中啟動測試頁面
一旦將本Web專案部署成功後,然後再啟動伺服器。在瀏覽器的URL位址列中輸入如下示例圖中所示的URL地址將能夠啟動本示例中的測試頁面。
(3)在表單中輸入相關的引數後的提交輸出結果,參看如下示例圖所示
瀏覽器的請求經過Struts2應用框架中的Action類處理後,Struts2應用框架會自動載入FreeMarker模板檔案、並使用資料模型來填充該模板,然後再將最後的HTML頁面輸出給客戶端。因此可以看到這個成功頁面會將showResultInfo屬性變數中的內容讀出並顯示輸出。Struts2應用框架解析FreeMarker模板中變數的順序如下:
1)FreeMarker模板內建的變數;
2)ValueStack中的變數;
3)ActionContext中的變數
4)HttpServletRequest中的屬性
5)HttpSession中的屬性
6)ServletContext範圍的屬性
但不能透過瀏覽器直接訪問FreeMarker模板*.ftl檔案,否則將看到該模板頁面的原始碼,而不是們想要的生成的HTML頁面,這是因為Web容器預設不會處理FreeMarker模板頁面。在瀏覽器中直接訪問FreeMarker模板*.ftl檔案showInfoTemplate.ftl(注意瀏覽器URL位址列中的檔名稱)後的結果如下示例圖所示。
(4)輸入錯誤的表單引數以測試非法登入狀態是否能夠識別
在測試頁面的表單中輸入模擬系統登入相關的賬戶和密碼,但這次故意輸入不正確的登入引數,最終瀏覽的結果參看如下示例圖所示。
從示例程式返回的結果來看,本示例的功能實現是完全正確。因此,本示例正確地實現了將Struts2應用框架和FreeMarker模板相互整合,並在Web頁面中應用FreeMarker模板技術同樣也能夠獲得從伺服器返回的處理結果。
但由於showInfoTemplate.ftl模板檔案不是JSP型別的頁面檔案,而是普通的文字檔案,該檔案的內容不需要透過JSP引擎的解析和處理。因此頁面的響應速度將會大大地提高,從而應用FreeMarker模板技術的Web頁面可以是非JSP型別的Web頁面——達到"動態內容靜態化"的應用效果。
8、檢視頁面檔案的原始碼以確認是否為真正的靜態頁面及瀏覽靜態化後的結果
(1)檢視靜態化後的結果
作者為了能夠讓讀者進一步地理解"動態頁面靜態化"的應用效果,可以透過瀏覽結果頁面相關的源程式從而確認最終是否為一個HTML格式的純靜態頁面。讀者可以在Web瀏覽器中右鍵單擊,然後在彈出的快捷選單專案中選擇"檢視原始檔"的功能子選單專案(參看如下示例圖所示)。
(2)本示例的測試頁面靜態化後的結果示例
將在Web瀏覽器中顯示出使用者當前正在瀏覽的Web頁面的原始碼,熟悉HTML語言的讀者應該能夠看懂其中的程式碼含義——全部為HTML格式的純靜態頁面標籤。