如何在Web應用中實現Velocity 與Struts 框架相互集成的應用實例

2020-12-17 楊教授工作室

軟體項目實訓及課程設計指導——如何在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表示層數據處理和展現邏輯

相關焦點

  • 如何在Web應用中實現Velocity 與Struts2框架相互集成的應用實例
    軟體項目實訓及課程設計指導——如何在Web應用系統中實現Velocity 與Struts2框架相互集成的應用實例1、Struts 2應用框架提供對 Velocity 和 FreeMarker 模板引擎的支持在Struts 2應用框架中不僅繼續保留有對Velocity
  • 如何在Web應用系統表示層開發實現中應用Velocity模板技術
    軟體項目實訓及課程設計指導——如何在Web應用系統表示層開發實現中應用Velocity模板技術1、分離Web表示層的數據處理和展現邏輯的常見的應用技術分離Web表示層的數據處理和展現邏輯是目前企業級的Web應用系統開發中表現層組件開發實現中的基本實現目標。
  • 如何應用Web頁面靜態化技術以提高J2EE Web應用系統的響應性能
    而在J2EE系統平臺的應用系統開發中之所以應用FreeMarker模板技術:首先,FreeMarker模板技術同樣也能夠實現Web應用系統中的表示邏輯和數據處理邏輯相互分離——這是通過在模板文件中包裝HTML標籤實現的。
  • 如何利用MyEclipse開發工具開發基於Velocity模板的Web應用
    軟體項目實訓及課程設計指導——如何利用MyEclipse開發工具開發基於Velocity模板的Web應用1、在MyEclipse開發工具中新建一個名稱為WebVelocity的Web項目在名稱為WebVelocity的J2EE Web應用項目中的lib目錄下添加
  • 如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能
    軟體項目實訓及課程設計指導——如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能在軟體應用系統中離不開數據訪問和數據處理兩個方面的功能,而數據處理之前首先要進行數據訪問,也就是只有快速地獲得了數據,才能進行下一步的數據處理。
  • 課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能
    比如在Web應用系統開發中,可以將BBS論壇系統中的分類信息、新聞系統中的新聞信息、網上商城中的商品信息等進行緩存。作者在下文中為讀者介紹如何應用開源的OSCache緩存框架以提高J2EE Web應用系統的響應性能。
  • 3道常見的 Struts面試題
    1、Struts的理解官方解釋:它通過採用 Java Servlet/JSP 技術,實現了基於Java EE Web應用的MVC設計模式的應用框架,是MVC經典設計模式中的一個經典產品。Structs分Struts1、Struts2 ,是一個輕量級的MVC框架,後者在不斷的優化,但是風險和漏洞太多,加上Spring MVC的出現,已經代替了Struts了。
  • 如何應用XML+XSLT+AJAX組合技術實現無刷新的數據查詢的應用實例
    軟體項目實訓及課程設計指導——如何應用XML +XSLT +AJAX組合技術實現無刷新的數據查詢的應用實例1、在Web應用系統項目中添加一個實現查詢的請求頁面searchBook.jsp(1)創建searchBook.jsp頁面文件的過程示圖
  • Laravel框架從9處助力Web應用開發
    本文將向您介紹什麼是Laravel,以及它將如何從九個方面提高Web應用的開發效率和競爭優勢:Laravel框架的歷史和演變Laravel是一個開源框架,旨在利用MVC架構模式,基於Symfony(譯者註:一個開源的PHP Web框架)來創建Web應用程式。開發人員可以使用它所提供的各種出色的API,來加快開發的進程,並簡化目標網站構建。
  • Web應用程式開發五步法
    那麼作為一名Web開發人員,怎樣去開發一款優秀的Web應用程式呢?這個問題沒有一個簡單的答案,甚至那些教育機構都未必能清楚的知道。所以,像大多數在這個領域裡的web開發人員一樣,我們只是通過去做,去實驗才學會了這些。沒有人告訴我們如何去做,我們從給自己做點什麼東西開始,學會如何開發web應用程式是在這個過程中的一個副產品。這是學習任何語言的一個非常有效的方法。
  • 課程設計指導——如何應用Java反射技術靈活地創建程序類對象實例
    軟體項目實訓及課程設計指導——如何應用Java反射技術靈活地創建程序類的對象實例1、如何應用屬性配置文件實現對系統中的配置信息進行讀寫操作Java中的屬性配置文件主要可以作為軟體應用系統及項目的配置文件,比如許多J2EE的開源框架系統中都提供了屬性配置文件作為該應用框架的對外配置文件
  • 如何應用GOF設計模式中的創建型模式實現鬆耦合地創建對象實例
    軟體項目實訓及課程設計指導——如何應用GOF設計模式中的創建型模式實現鬆耦合地創建對象實例1、GOF設計模式中的工廠模式在GOF設計模式的劃分中,把與實現對象的實例化相關的模式稱之為「創建型模式」——而其中的工廠模式為創建型模式中的一種具體實現形式。
  • 10道題教你使用python Django框架來實現web應用,值得收藏
    3、我現在系統需要一個功能,當一個任務到達某個狀態時,如果24小時沒有任何人操作,則自動切換到另一個狀態,對每個用戶是有不同的任務的,有點想百度外賣下單等待商家接單的那種,有什麼可以方便django整合一起的框架嗎?django-celery如何?簡單說一下我的考慮,供你參考。用戶下單後,用戶訂單信息寫入資料庫。商家接單後,修改資料庫中用戶訂單狀態。
  • 如何應用EhCache緩存框架提高J2EE Web應用系統持久層的響應性能
    軟體項目實訓及課程設計指導——如何應用EhCache緩存框架提高應用系統持久層響應性能1、在Web應用系統中應用持久層相關的緩存框架在Java應用程式開發實現和J2EE Web應用系統的設計和開發實現中,軟體應用系統的設計和開發實現人員可以在系統的表示層和系統的持久層中充分地應用緩存機制和相應實現技術能夠大大地提高
  • java和php在web開發方面對比分析
    java的web開發首先最容易想到的就是jsp(現在已經到jsp2.0),原來的java的web開發都是用servlet來實現的,用servlet來開發需要程式設計師在java的源文件中嵌入大量的html代碼。所以後來就出現了jsp,jsp可以方便的嵌入到html文件當中,其實jsp文件在伺服器上執行的時候首先會被應用伺服器轉換成servlet,然後再編譯執行。
  • 如何解析 web 應用程式
    web 應用的站點地圖,也就是網站的所有頁面和功能,我們可以對其測試的攻擊面,主要分幾種:主動式爬蟲、被動式抓取、隱藏頁面獲取、頁面參數擴展。主動式爬蟲:這個很好理解,就是爬蟲,通過頁面之間的超連結關聯來一層一層獲取頁面內容,然後從內容中匹配頁面連結,逐步將網站的所有連結完整爬取,對於從來沒有在其他網頁設置超連結的頁面是無法通過這種方式獲取到的,工具的話,可以用自實現的爬蟲工具,用 python 寫的居多,如今的網站好多架構前端都是 nodejs 框架,數據的獲取通過普通的爬蟲已經無法實現,可以藉助無頭瀏覽器來對頁面進行解析
  • Javaweb開發學習路線及Java三大框架分享
    Java在客戶端的應用有java applet,不過使用得很少,Java在伺服器端的應用非常的豐富,比如Servlet,JSP和第三方框架等等。Java技術對Web領域的發展注入了強大的動力。開發工程師新手如何學習Java三大框架?
  • Portal(web應用)的作用
    在Portlet規範裡是這樣講的:「portal是一種web應用,通常用來提供個性化、單次登錄、聚集各個信息源的內容,並作為信息系統表現層的宿主。聚集是指將來自各個信息源的內容集成到一個web頁面裡的活動」。Portal的功能可以分為三個主要方面:1.
  • 技術中臺應用集成架構之移動微應用集成
    企業移動門戶是企業現有應用與新應用的集成節點,使用戶能夠與人員、內容、應用和流程進行個性化的、安全的、單點式的互動交流。它也是一個集成業務中臺、數據中臺的使用者,而微應用集成是企業門戶之中重中之重的一環,接下來讓我們一起了解微應用的集成方式。
  • 應用WAS對web進行壓力測試實例詳解
    應用WAS對web進行壓力測試實例詳解2007-09-29 14:28 出處:PConline 作者:網絡文摘 責任編輯:gongjianhui       你的Web伺服器和應用到底能夠支持多少並發用戶訪問?在出現大量並發請求的情況下,軟體會出現問題嗎?