軟體項目實訓及課程設計指導——如何在Web應用系統中實現Velocity 與Struts 框架相互集成的應用實例
1、Velocity Tools 子項目及其中的 VelocityStruts 組件
(1)Velocity Tools是什麼
Velocity Tools 是 Velocity 模板引擎的一個子項目,實現將 Velocity模板引擎與J2EE Web開發環境集成的工具包。如下示例圖是Apache Velocity模板官方網站中對Velocity Tools的技術特性和主要功能介紹的局部截圖。
J2EE Web應用系統的設計和開發人員通過應用Velocity Tools中相關的組件,不僅可以將Velocity 模板引擎應用於普通的J2EE Web應用系統環境中,也還可以與J2EE系統平臺中的各種應用框架相互集成,從而也允許將Velocity 模板引擎應用於如Struts和Struts2、Spring等應用框架的環境中。
(2)VelocityStruts 組件
Velocity Tools 子項目中的 VelocityStruts 組件包含集成 Velocity 模板引擎與 Struts 應用框架的所有功能。VelocityStruts 提供了一組專用的 Velocity 模板引擎工具,用於訪問 Struts應用框架中專有的資源和 Velocity 模板文件中的信息。其主要的目的就是結合Velocity模板引擎在MVC體系架構的應用系統中的視圖層上的優勢跟Struts應用框架在MVC體系架構的應用系統中的控制層上的優勢。
VelocityStruts組件會在Struts應用框架的Action組件類返回某個actionForward目標對象之後,自動地檢測返回的目標資源的類型——如果發現是一個*.jsp頁面文件,則它自動調用JSP解析器Jasper並按照傳統的JSP頁面流程執行,而如果一旦發現它返回的目標資源是一個Velocity 模板引擎的模板*.vm文件,則會自動地調用Velocity模板引擎中的模板解析引擎對其進行處理——也就是讓Struts應用框架的forward 最終轉向某個*.vm文件。
如下圖所示為Velocity官方網站上對VelocityStruts工作原理及請求響應處理流程的功能介紹的頁面內容的局部截圖。
2、VelocityStruts系統包文件和用於 VelocityStruts 集成的各種工具
由於在Velocity模板引擎系統中沒有提供類似於Struts應用框架標籤庫中的各個功能標籤,而替代的方式是採用toolbox.xml定義文件自定義工具類,這些工具類可以直接在Velocity模板引擎的模板頁面中使用——因為這些工具類和Struts 應用框架標籤的功能類似,但在使用規則上要比Struts應用框架的標籤更容易和更靈活。
下圖所示為下載的velocity-tools-1.4.zip工具包文件中所包含的各個工具類所在的JAR包文件,主要為三個文件:velocity-tools-generic-1.4.jar、velocity-tools-1.4.jar和velocity-tools-view-1.4.jar。在將Velocity 與Struts 應用框架相互集成時,應該要將它們加入到Web系統的WEB-INF/lib目錄中。
下表所示為Velocity Tools 子項目中的主要的工具類的功能說明,這些工具不僅保留了Struts 框架標籤的方便特性,而且還具有Velocity模板引擎的靈活性。從而可以在模板頁面中達到與採用Struts框架標籤庫的標籤相同的應用功能效果。
由於本文的篇幅有效,讀者如果在開發中需要詳細學習和了解這些工具類的功能說明,可以瀏覽Velocity模板引擎官方網站上對相關工具類的技術介紹資料(參看如下示圖所示)。
3、VelocityStruts工具箱配置文件toolbox.xml
J2EE Web應用系統的開發人員可以在VelocityStruts工具箱配置文件toolbox.xml中定義在Web項目中所需要的與Velocity模板引擎配合使用的各種實用工具類,在Velocity 模板引擎系統中提供了許多預先構建好的工具、並且還創建了許多Struts 應用相關的工具來模擬Struts框架中的標籤功能。
如下代碼示例中的示例為某項目中定義的toolbox.xml文件中的示例內容,並且該文件放在WEB-INF文件目錄中。這些工具類的主要功能請讀者參考上面表中的功能說明,Web應用系統的開發人員可以根據Web項目中的需要有選擇地定義有關的工具類——某Web項目中定義的toolbox.xml文件中的示例內容
<?xml version="1.0"?>
<toolbox>
<tool>
<key>link</key>
<scope>request</scope>
<class>org.apache.velocity.tools.struts.StrutsLinkTool</class>
</tool>
<tool>
<key>msg</key>
<scope>request</scope>
<class>org.apache.velocity.tools.struts.MessageTool</class>
</tool>
<tool>
<key>errors</key>
<scope>request</scope>
<class>org.apache.velocity.tools.struts.ErrorsTool</class>
</tool>
<tool>
<key>form</key>
<scope>request</scope>
<class>org.apache.velocity.tools.struts.FormTool</class>
</tool>
<tool>
<key>tiles</key>
<scope>request</scope>
<class>org.apache.velocity.tools.struts.TilesTool</class>
</tool>
<tool>
<key>validator</key>
<scope>request</scope>
<class>org.apache.velocity.tools.struts.ValidatorTool</class>
</tool>
</toolbox>
4、在web.xml 文件中配置 VelocityViewServlet組件以處理模板文件
由於VelocityStruts是通過一個名為VelocityViewServlet的Servlet組件實現將所有的請求以*.vm為結尾的資源都轉交給這個Servlet組件去處理。因此,需要在Web項目的部署描述符web.xml 文件中配置定義出VelocityViewServlet 以處理項目中的各種*.vm 文件、並且告訴 VelocityViewServlet在哪裡可以找到toolbox.xml的定義配置文件——請見下面的代碼示例中所示的在web.xml文件中對VelocityViewServlet的配置定義內容示例——在web.xml文件中對VelocityViewServlet的配置定義內容示例
<servlet>
<servlet-name>velocity</servlet-name> <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
該VelocityViewServlet的一個初始化參數「org.apache.velocity.toolbox」的含義是在系統中引入了一個工具箱配置文件toolbox.xml,而另一個初始化參數org.apache.velocity.properties定義了Velocity的屬性配置文件的位置,這個velocity.properties屬性文件定義了Velocity的一些配置信息——讀者可以參考前面的代碼示例中的velocity.properties屬性配置文件的示例。
通過對VelocityViewServlet的配置定義達到把以 *.vm 結尾的文件發送給 VelocityViewServlet,而VelocityViewServlet把Velocity模板引擎的命令處理結果表示成HTML響應輸出。
Struts應用框架的控制器把視圖轉發給VelocityViewServlet組件,而VelocityViewServlet組件在向客戶端瀏覽器發送最終的響應結果之前處理目標*.vm資源文件。
VelocityViewServlet組件提供了對請求對象和屬性、會話對象和屬性以及 Servlet 上下文和屬性的直接訪問。但在應用它時,Web應用系統的開發人員要保證在WEB-INF/lib目錄下必須要有Velocity模板引擎的velocity-tools-view-1.4.jar系統包文件(請見前面示圖中所示系統包目錄及文件截圖)。
5、編程Action類和在struts-config.xml配置文件中定義Action類
(1)編程實現特定功能的Action類程序
下面的代碼示例中所示的UserLoginAction類主要識別用戶請求提交的參數是否為合法的值,如果正確則轉發到名稱為loginSuccess的目標資源中,否則將轉發到名稱為loginFailure的目標資源中、並產生出錯誤信息——實現用戶登陸功能請求處理的UserLoginAction類代碼示例。
package com.px1987.velocitystrutsweb.action;
import org.apache.struts.validator.*;
import org.apache.struts.action.*;
import javax.servlet.http.*;
public class UserLoginAction extends Action {
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) {
DynaValidatorForm dynaValidatorForm = (DynaValidatorForm) actionForm;
String userName = (String) dynaValidatorForm.get("userName");
String userPassWord = (String) dynaValidatorForm.get("userPassWord");
boolean okOrNot=userName.equals("yang")&&userPassWord.equals("1234");
if(okOrNot){
UserInfo oneUserInfo=new UserInfo();
oneUserInfo.setUserName(userName);
oneUserInfo.setUserPassWord(userPassWord);
request.setAttribute("oneUserInfo", oneUserInfo);
return actionMapping.findForward("loginSuccess") ;
}
else{
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("login.failure"));
saveErrors(request, errors);
return actionMapping.findForward("loginFailure") ;
}
}
}
(2)在struts-config.xml配置文件中定義該Action類及其<forward>的配置
根據Struts應用框架的要求,需要對上面代碼示例中的UserLoginAction類在struts-config.xml配置文件中定義該Action類及其<forward>的配置。
表面看起來增加了配置工作量,但實際上並不複雜,僅僅是需要把轉發的目標資源從原來的*.jsp頁面文件改換成*.vm的Velocity模板引擎的模板文件。
下面的代碼示例為UserLoginAction類的定義內容示例,其中定義了名稱為loginSuccess的目標資源文件為/userManager/LoginSuccess.vm,而名稱為loginFailure的目標資源文件為/userLogin.vm——在struts-config.xml文件中定義UserLoginAction類及其<forward>的配置。
<action input="/userLogin.vm" name="userLoginForm" path="/doUserLogin"
scope="request" validate="false"
type=" com.px1987.velocitystrutsweb.action.UserLoginAction" >
<forward name="loginSuccess" path="/userManager/LoginSuccess.vm"/>
<forward name="loginFailure" path="/userLogin.vm"/>
</action>
6、在Web項目中設計和開發實現Velocity 模板文件
(1)userLogin.vm模板文件的內容
userLogin.vm模板文件一方面作為用戶登陸請求的功能頁面,另一方面也作為登陸失敗時的錯誤信息顯示的功能頁面,並且在該Velocity 模板文件的頁面中利用VelocityStruts的工具類動態地獲得所需要的數據——請參考如下代碼示例中的Velocity 模板文件的示例—— 實現用戶登陸功能的Velocity 模板文件userLogin.vm的示例,並請注意其中黑體所標識的代碼語句。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用戶登錄請求功能頁面</title>
</head>
<body>
<form method="POST" action="$link.setAction('/doUserLogin')">
請輸入用戶名稱:<input type="text" name="userName"><br>
請輸入用戶密碼:<input type="password" name="userPassWord"><br>
<input type="submit" value="提交" name="submit">
<input type="reset" value="重來" name="reset">
#if ($errors.exist())
<ul>
#foreach($oneError in $errors.all)
<li>$oneError</li>
#end
</ul>
#end
</form>
</body>
</html>
在userLogin.vm 模板文件中採用$!errors.all 得到錯誤消息隊列中的所有的錯誤消息,而採用$link.setAction('/doUserLogin ') 獲得UserLoginAction類轉發的 URL。
由於Velocity模板引擎系統採用簡單而強大的模板語言VTL實現對Web頁面的渲染,因此能保證在Dreamwaver之類的Web頁面可視化編輯器中都能夠正常顯示(參看如下示例圖所示)。
另外,模板文件可以是任意的文件擴展名,採用*.vm、*.html或者*.xml都是可以的(本示例採用*.vm文件擴展名),這樣就能直接在Web瀏覽器中看到Web頁面的預覽的效果。
(2)LoginSuccess.vm模板文件的內容
該LoginSuccess.vm模板文件作為用戶登陸成功後的信息顯示頁面,並且在該模板文件中動態地獲得由前面代碼示例中的UserLoginAction類轉發來的參數——請參考如下的代碼示例中的Velocity 模板文件的示例——用戶登陸成功後的信息顯示頁面LoginSuccess.vm模板文件的內容,並請注意其中黑體所標識的代碼語句。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用戶登錄成功信息顯示頁面</title>
</head>
<body>
<b>用戶名稱為:</b>$oneUserInfo.userName<br>
<b>用戶密碼為:</b>$oneUserInfo.userPassWord<br>
</body>
</html>
如何利用MyEclipse開發工具開發基於Velocity模板的Web應用
如何在Web應用系統表示層開發實現中應用Velocity模板技術
應用XML+XSLT技術分離Web應用系統中表示層數據和樣式的實例
課程設計指導——如何應用XML+XSLT技術分離Web表示層數據和樣式
課程設計指導—如何應用CSS+Div分離Web表示層數據處理和展現邏輯