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

2020-12-16 楊教授工作室

軟體項目實訓及課程設計指導——如何在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應用安全框架選型:Spring Security與Apache Shiro
    web應用安全框架選型:Spring Security與Apache Shiro一、 SpringSecurity 框架簡介Spring Security 是強大的,且容易定製的,基於Spring開發的實現認證登錄與資源授權的應用安全框架。
  • web開發實戰教程:Apache Shiro在web項目的應用
    web開發實戰教程今天準備分享一下Apache Shiro 在web開發中的應用。shiro安全框架是目前為止作為登錄註冊最常用的框架,因為它十分的強大簡單,提供了認證、授權、加密和會話管理等功能 。所有 Subject 實例都被綁定到(且這是必須的)一個SecurityManager 上。SecurityManager:Shiro 架構的心臟,用來協調內部各安全組件,管理內部組件實例,並通過它來提供安全管理的各種服務。當 Shiro 與一個 Subject 進行交互時,實質上是幕後的 SecurityManager 處理所有繁重的 Subject 安全操作。
  • 如何應用GOF設計模式中的創建型模式實現鬆耦合地創建對象實例
    軟體項目實訓及課程設計指導——如何應用GOF設計模式中的創建型模式實現鬆耦合地創建對象實例1、GOF設計模式中的工廠模式在GOF設計模式的劃分中,把與實現對象的實例化相關的模式稱之為「創建型模式」——而其中的工廠模式為創建型模式中的一種具體實現形式。
  • 如何在Flutter行動應用程式中集成人工智慧或AI?
    但是,他們仍然經常忽略這樣一個事實,如何在競爭激烈的市場中取得成功,在這個競爭激烈的市場中,各個業務領域中已有500萬個應用程式可用。Flutter是開發此類跨平臺應用程式的一種經過精心設計且功能豐富的框架。
  • 課程設計指導——應用AJAX技術提高Web應用系統的整體響應性能
    作者將在本文及後續幾篇文章中為讀者詳細介紹提高Web應用系統響應性能的主要方法,如利用AJAX技術減少客戶端和伺服器端交互的數據量、應用Web頁面靜態化技術以及應用FreeMarker靜態模板框架技術實現對不同類型的Web應用系統中的頁面靜態化等。這些技術都是提高Web應用系統響應性能的行之有效的良策。
  • KUKA LBR Med 展示創新的應用實例
    協作型機器人的各種應用可能      KUKA 公司展示了靈敏型輕型機器人 LBR Med 的一項應用實例,將其作為醫師的一種多功能輔助系統用於超聲波檢查、微創手術以及其它應用領域在應用於超聲波檢查時,LBR Med 機器人配有一個探頭,該探頭可由機器人在模型身體腹部兩個手選點之間以恆定壓力自動來回移動。這一過程確保了超聲圖像質量的一致性,並生成可重複、易於相互比較的圖像。
  • 在程序中如何正確地創建和銷毀軟體應用系統中文件IO流對象實例
    軟體項目實訓及課程設計指導——如何正確地創建和銷毀軟體應用系統中文件IO流對象實例1、Java文件輸入輸出(讀寫)相關的技術基礎知識(1)流(Stream)它是通過緩衝機制將數據從生產者(如鍵盤、磁碟文件、內存或其他設備
  • 鳶尾花預測:如何創建機器學習Web應用程式?
    通過既有框架(如Django或Flask)對傳統機器學習模型進行部署,可能是一項艱巨耗時的任務。本文就將展示如何在Python庫中使用streamlit,用不到50行的代碼構建一個簡單的基於機器學習的數據科學web應用程式。
  • 如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例
    軟體項目實訓及課程設計指導——如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例1、基於TCP/IP協議的Socket通信相關的基礎知識(1)TCP/IP(Transmission Control Protocol傳輸控制協議/Internet
  • IPFS如何使用Terminal部署Web應用程式
    儘管Terminal支持幾乎所有站點和流行框架,但出於本教程的目的,我將使用Vue CLI 4設置Vue.js應用程式。收集我們的工具如果您已經知道如何設置Vue CLI項目,則可以直接跳至本部分確保已安裝Node.js 8.9或更高版本(建議使用8.11.0+)。如果沒有,您可以前往這裡。
  • Python 連接開放航空交通數據,輕鬆構建航班跟蹤應用!
    坐標系統的轉換在函數 wgs84_web_mercator_ 中實現。顧名思義,該函數的用途是將 WGS84坐標轉化成墨卡託坐標系。該轉換是必須的,因為我們使用的基礎地圖是STAMEN_TERRAIN,它採用墨卡託坐標系。創建好坐標轉換系統函數之後,就可以對數據框和坐標進行轉換了。下一步我們來進行繪圖設置,使用x、y坐標指定繪圖區域的範圍。
  • 千萬別再把雲防火牆和Web應用防火牆搞混了
    但大多數人所熟知的是Web應用防火牆,也就是我們俗稱的WAF,在企業紛紛上雲的大趨勢下,雲防火牆便是作為企業上雲的第一個基礎安全設施而生的新一代防火牆。企業上雲不免面臨很多安全問題,其中最基礎的網絡安全問題無外乎雲環境下公網IP位址申請便捷,如何統一管控公網IP?網際網路漏洞頻繁,針對漏洞攻擊不斷,如何智能攔截?
  • Java的領域應用!
    北大青鳥重慶艾替(大學城校區),專門針對就業培訓,開設了一系列課程,以幫助廣大求職人群實現高薪就業夢!北大青鳥是中國IT領先品牌教育機構,致力於IT教育二十年,專業設置緊跟企業發展最新要求,以就業為目的培養技能人才,北大青鳥重慶艾替(大學城校區)設置的課程:學士後JAVA軟體開發、學士後UI設計、大數據、雲計算等等!
  • 10款web前端非常有用的 AngularJS 框架
    AngularJS是最流行的開源web app框架。AngularJS被用於解決阻礙單頁應用程式開發的各種挑戰。你作為一個AngularJS用戶,卻不知道一些可以幫助你美化編碼的資源?你可以使用此框架來重寫現有的JavaScript代碼,並創建新的代碼。Angular UI Bootstrap能幫助你拿出比原來的JavaScript代碼更小的指令。更小的版本,更容易集成到AngularJS生態系統或環境中。
  • 應用伺服器是什麼_應用伺服器有哪些
    Web應用程式駐留在應用伺服器(Application Server)上。應用伺服器為Web應用程式提供一種簡單的和可管理的對系統資源的訪問機制。它也提供低級的服務,如HTTP協議的實現和資料庫連接管理。Servlet容器僅僅是應用伺服器的一部分。
  • 如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息
    軟體項目實訓及課程設計指導——如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息1、什麼是策略(Strategy)設計模式策略設計模式把「算法」(也就是軟體應用系統中的業務規則或者待實現的功能等)和「環境」(封裝軟體應用系統在實際應用時的場景)相互分離
  • 複雜表單應用解耦,淘寶機票訂單實踐
    背景在web應用中,複雜表單這類web應用富交互元素多,業務邏輯複雜,犬牙交錯,且需求變化頻繁。及容易成為晦澀和幽暗之地,也經常是各種代碼壞味道的來源。針對這種典型的複雜應用,本文以淘寶機票訂單為例提出一種架構模式梳理和消化表單帶來的複雜性。模塊和組件劃分解決複雜表單的的第一步,劃分模塊。
  • 酷狗再於web app發力 UC應用中心排名第一
    酷狗全新的Html5播放器  酷狗html5第二期上線UC應用中心後,取得了驕人的成績,上線僅一周安裝用戶已近40w,高居音樂分類排行第一位,超前領先於其它同類網際網路音樂服務提供商。  酷狗音樂高居音樂播放軟體排行首位  基於超高的用戶口碑,酷狗音樂已經連續一周排於UC瀏覽器應用推薦首選。