王剛
(陜西財經(jīng)職業(yè)技術(shù)學院信息工程系,陜西咸陽 712000)
Struts框架技術(shù)簡析
王剛
(陜西財經(jīng)職業(yè)技術(shù)學院信息工程系,陜西咸陽 712000)
本文簡要介紹了Struts框架技術(shù)及其相關(guān)內(nèi)容,并著重對Struts框架的組件和Struts框架的高級特性進行了深入的探討。
Struts框架;Struts框架的組件;Struts框架的高級特性
作為Sun JavaEE平臺下MVC模式的Struts框架,來源于Craig McClanahan最初的構(gòu)思,它包含兩個主要的技術(shù)——Servlet和JSP。Struts是Apache組織提供的一項開放源碼工程,使用起來簡單、方便,實現(xiàn)的速度快,對于應用系統(tǒng)的開發(fā)可以很好地滿足。Struts主要指的是使用在建筑和舊式飛機中的起支撐作用的金屬架。之所以把這個框架命名為“Struts”,是提醒我們要記住那些在房屋、建筑物、橋梁以及踩高蹺時起著一定支撐作用的基礎支架,這也是對Struts最為典型的描述。建造一個建筑物時,建筑工程師會考慮給建筑物的每一層建造相應的支柱,以起到對整個建筑物的支撐作用。同樣,軟件工程師使用Struts的時候,會給業(yè)務應用的每個層次提供相應的支持,就是為了幫助開發(fā)人員在采用MVC設計模型開發(fā)Web應用程序時,減少相應系統(tǒng)的開發(fā)時間。如果想混合使用Servlets和JSP的優(yōu)點來構(gòu)建可擴展的應用,Struts將會是非常好的選擇。
Struts是一個通用的用來實現(xiàn)MVC模式的框架,其中包括模型、視圖、控制器和一個XML文件。在這個框架中,系統(tǒng)的狀態(tài)和業(yè)務邏輯是模型的主要表現(xiàn)形式,其中ActiomFormBean表現(xiàn)的是系統(tǒng)的有關(guān)狀態(tài),而JavaBean或EJB組件主要用來實現(xiàn)業(yè)務邏輯;而通過JSP就可以建立一個視圖,同時由于視圖本來就含有那些自定義的可用于擴充的標簽 (Tag1ib),因而就可以大大地簡化相應用戶界面的實現(xiàn)過程。通常是通過ActionServlet類和Action類來實現(xiàn)Struts框架的控制器,作為Struts框架中的核心組件ActionServlet類,它的主要作用就是把用戶相關(guān)的HTTP請求接收起來,并與配置信息進行核對,將請求轉(zhuǎn)發(fā)到相應的Action對象。然而調(diào)用模型的有關(guān)方法是由Action類來完成的,它可以對模型的狀態(tài)進行更新,同時還應輔助進行對應用程序的流程控制;Struts有兩個相應的配置文件web.xml和struts-config.xml,其中web.xml除了要對ActionServlet進行相應的配置以外,還要對Web表示層中使用的有關(guān)struts標簽庫進行相應的聲明。而Strutsconfig.xml則描述的是與Struts相關(guān)的文件,主要是用來存儲描述用戶請求的路徑以及相應的Action映射關(guān)系的配置信息的。
JSP技術(shù)對動態(tài)頁面處理邏輯進行封裝,通常通過Java編程語言類的XML標簽和scriptlets來進行。與此同時,借助于tags和scriptlets相關(guān)的網(wǎng)頁還可以把保存在服務端的資源的應用邏輯調(diào)用出來。將網(wǎng)頁邏輯與網(wǎng)頁設計和顯示分開來,通過JSP技術(shù)就可實現(xiàn)。因此,JSP技術(shù)可以更好地支持可復用的基于構(gòu)件的系統(tǒng)設計,因而采用JSP技術(shù)可以輕易地實現(xiàn)Web應用程序。如果要訪問JSP頁面的請求,那么首先必須把其中相關(guān)的程序通過Web服務器執(zhí)行,然后客戶端會接收到程序執(zhí)行的結(jié)果以及JSP文件中有關(guān)的HTML代碼。JSP通常把一個有關(guān)的HTML文本回傳給客戶端,那么客戶通過瀏覽器很容易對相關(guān)內(nèi)容進行直接瀏覽。
HTML源程序代碼以及嵌入HTML之中的Java源程序代碼組合在一起就構(gòu)成了JSP的頁面。通常,借助于頁面客戶端發(fā)出請求,服務器接收到請求以后,通過對這些Java源程序代碼加工,就可以生成相應的HTML頁面,然后將其傳遞給客戶端瀏覽器。JavaServlet是JSP必不可少的組成部分,是JSP的技術(shù)基礎,要成功實現(xiàn)大型的Web應用系統(tǒng),只有把JavaServlet和JSP很好地結(jié)合起來才能實現(xiàn)。與Java技術(shù)相同,JSP操作簡單,實現(xiàn)容易,是一種完全面向?qū)ο蟮姆椒?;且其具有平臺無關(guān)性,開發(fā)出的系統(tǒng)穩(wěn)定、可靠,主要面向互聯(lián)網(wǎng)等特征??梢杂靡粋€簡單的公式來表示JSP,即JSP=HTML+Java。
Struts最大的一個優(yōu)點就是它是一種開源軟件,同時,標簽庫和頁面導航也在某些方面反映出了Struts的優(yōu)勢。標簽庫是Struts的標記庫,靈活運用可以極大地提高開發(fā)效率。由于頁面導航的存在,因而開發(fā)出來的系統(tǒng)結(jié)構(gòu)更加合理,層次也比以前更清晰,所以它是Struts今后主要發(fā)展的對象。只要配置好一個文件,通過該文件就可以輕易地把系統(tǒng)相應的各個部分聯(lián)系起來,所以非常有利于系統(tǒng)今后的維護工作。特別是要繼續(xù)去實現(xiàn)某個項目,而又換了一批不同的技術(shù)人員時,它的這種優(yōu)點表現(xiàn)得更加突出。雖然Struts具備這些優(yōu)勢,但初次接觸該技術(shù)的開發(fā)人員仍需要不斷地學習,有時還需要打亂技術(shù)人員編寫網(wǎng)頁的固有方式。
2.1 ActionServlet
在Struts中,ActionServlet主要是接收來自于用戶的HTTP請求,同時依據(jù)系統(tǒng)配置信息的要求,把相應的請求傳遞給有關(guān)的的Action對象。在實施的過程中,首先要判斷有沒有Action對象,如果沒有,應該設計出來相應的對象;然后在請求被接收的同時,會有一個相應的Action實例收到通過控制器傳來的Action對象,當然,在進行傳遞的時候也會判斷有沒有相應的實例,如果沒有,同樣應該先把相應實例的execute()方法設計出來。
在Struts的框架中,ActionServlet主要承擔的是中心控制器的角色,會自動地去繼承javax.servlet.http包中的HttpServlet類。為了對來自終端的請求及時響應,通常它會把中心的一個位置給留下來。ActionServlet控制器所起的主要作用就是把HTTP客戶端的請求信息組合起來,通過相應的已經(jīng)配置好的文件進行描述,將其傳遞到相應的處理器中。通常,中心控制器會給所有表示層的請求提供一個集中的訪問點。一旦開發(fā)人員在開發(fā)過程中遇到問題,只要通過這個控制器的一些有關(guān)概念,這些問題的困難程度就被有效地降低了,如管理視圖、會話及表單數(shù)據(jù)。相應地,它也具備某些通用機制,如錯誤及異常處理、導航、國際化、數(shù)據(jù)驗證、數(shù)據(jù)轉(zhuǎn)換。
當用戶的請求被傳遞到服務器端的時候,首先ActionServlet控制器會獲得相應的信息。當控制器接收到相關(guān)的請求后,會把這些請求信息傳遞到相應的輔助類中去,此時這些輔助的類就會去處理那些相關(guān)的業(yè)務操作,而這些相關(guān)的操作必須對應用戶的請求。在上面提到的Struts那個輔助類就是 org.apache.struts. action.Action。一般情況下,開發(fā)人員應該主動去繼承Aciton類,那樣有助于實現(xiàn)開發(fā)人員自己的Action實例。
2.2 Action
一個Action類的角色,就是作為行動和業(yè)務邏輯處理適配器之間的客戶端的請求,其主要做的就是需要把它從業(yè)務邏輯中分離開來。為了實現(xiàn)這種分離,有映射點存在于多個客戶請求和Action類之間。通常情況下,Action類還有很多的輔助功能,如:認證(授權(quán))、日志(記錄)、數(shù)據(jù)驗證(驗證)。
Execute()是Action主要使用的方法。當客戶發(fā)出的請求被Controller收到的時候,這個請求將被移動到一個相應的Action實例中,如果找不到相應的實例,控制器就會重新創(chuàng)建一個實例,然后找到這個重新創(chuàng)建出來的Action實例的execute()方法,再去調(diào)用它。對于應用系統(tǒng)中的Action類來說,Struts框架會為每個類創(chuàng)建一個相應的實例。因為同一個實例被所有用戶使用,就必須保證在多線程環(huán)境下運行客戶的Action類。圖1就是execute()方法如何被訪問的過程:
圖1 Action實例的execute()方法
2.3 ActionForm
ActionForm主要用于對用戶的請求參數(shù)進行封裝。為了使請求參數(shù)順利地通過JSP頁面的表單域,一定要保證表單域的名稱和ActionForm參數(shù)是相同的。同時,要在struts-config.xml文件中對所有的Action進行配置,該文件還包含有表單元素。因而ActionForm中定義的所有元素,都應該對應一個相應的表單form-bean元素。
請求對象的參數(shù)一般被保存在ActionForm派生的對象中,他們和用戶之間是緊密相關(guān)的。通常,通過RequestProcessor來創(chuàng)建出一個相應的ActionForm的類。這是發(fā)生在已經(jīng)完成向前的一個URL,該URL是映射到控制器servlet而不是JSP和相應的動作映射指定表單的屬性的。出現(xiàn)這個情況時,如果在特定的范圍之內(nèi)沒有發(fā)現(xiàn),RequestProcessor將利用各種可能的方法嘗試著實現(xiàn)一個新的ActionForm對象的表單bean。在特定范圍內(nèi),可利用
如果RequestProcessor查找到了一個相應的表單對象,它就會把這個表單對象轉(zhuǎn)送給請求處理器相應的execute(…)方法。通常,一個ActionForm對象也可以通過請求處理器來實現(xiàn)。實現(xiàn)表單對象就是為了給中間模型狀態(tài)使用的JSP提供一個合適的請求范圍,這就可以保證有效期滿后對象是不存在的。在沒有特別聲明的情況下,全部表單的保存形式都表現(xiàn)為會話范圍。在會話過程中,如果表單對象脫離了有效性而獨立存在,極有可能出現(xiàn)浪費內(nèi)存的情況;同時,必須保持相同請求處理器存儲在會話中的對象的生命周期的軌道。通過使用相應的表單bean為那些橫跨多個用戶交互形式的有關(guān)表單來獲取相應的表單數(shù)據(jù)。在進行反饋的時候表單bean可以被用來保存中間模型的狀態(tài),而這個狀態(tài)就是通過自定義標簽發(fā)生變化的。盡最大的可能不要使視圖的標簽用法和Java代碼相結(jié)合,所以要做好相應的工作分工。通常由web制作組來解決標志的有關(guān)問題,而由應用程序的開發(fā)組來解決Java代碼的相關(guān)問題。
3.1 驗證
通常情況下,不會對用戶的輸入進行驗證,但是,一旦出現(xiàn)下面所描述的情況時,就需要通過使用表單bean來進行驗證: (1)表單bean覆蓋超類的驗證方法; (2)
3.2 使用異常處理聲明
如果要對應用程序的相關(guān)邏輯流程進行定義,不要通過寫死在代碼中來實現(xiàn),這是一個較成熟的經(jīng)驗,通常推薦使用的是在代碼以外通過使用配置的方法來進行。這樣的例子在J2EE中是非常多的。從實現(xiàn)EJB的安全性和事務性行為到描述JMS消息和目的地之間的關(guān)系,很多時候都可以在程序以外對其運行時的有關(guān)處理流程進行定義。在先前版本的Struts框架中,開發(fā)人員必須自己來處理在Struts應用之中發(fā)生錯誤的情況。在最新的版本中,這一點已經(jīng)得到了很大的改善。其中,為了便于在系統(tǒng)缺省處理action類實施過程中出現(xiàn)的錯誤,Struts Framework通常會提供一個內(nèi)置的名為ExceptionHandler的類來實現(xiàn)。這作為一個技巧,也是很多有關(guān)framework可擴展的接口之一。
通常,作為Struts的默認異常處理程序類,其運行的結(jié)果就是生成一個相應的ActionError對象,與此同時,還應注意要把其保存在特定域內(nèi)(Scope)的對象之中。如果用戶遇到一系列相關(guān)的問題,可通過使用JSP頁面利用錯誤類來告訴用戶所發(fā)生的問題。這樣,如果用戶還不滿意的話,可以輕易地去實現(xiàn)屬于自己的ExcepionHandler類。
3.3 使用應用模塊
由于應用模塊這個概念的出現(xiàn),Struts的應用可以被劃分為不同的模塊,而各個模塊都有屬于自己的Struts配置文件,如JSP頁面和Action。這個功能非常好地解決了開發(fā)人員在開發(fā)過程中遇到的一些難以處理的問題。允許同時出現(xiàn)多個配置文件,解決了文件配置單一的問題,使得并行開發(fā)更加可行。如果應用模塊同意,Struts可以按照應用系統(tǒng)本身所具有的功能對這些相應的模塊進行分解。實踐證明這樣是最符合邏輯的,也是最好的。
如果沒有必要將一個項目劃分成為很多模塊,一個缺省的應用模塊會被Struts框架所支持。這樣,就能創(chuàng)建相關(guān)的應用程序,且該應用程序還具有較好的可移植性,因為應用程序會自動作為缺省的應用模塊。每一個Struts的應用模塊都應該設計好一個屬于自己的單獨的配置文件。創(chuàng)建的Action和ActionForm是屬于自己的且和其他模塊是相對獨立的,對異常處理而言那是更多的。在每個應用模塊創(chuàng)建好屬于自己獨立的配置文件后,各個模塊中的Action就應該準備好被調(diào)用了。因而,Struts框架所準備好的SwitchAction類就被用到了。同時,應用模塊的名字也會被Struts主動加入到URL中,就和應用程序的名字被Struts主動加入到URL中是一樣的。作為對框架新的擴展的應用模塊,它是非常有利于使用并行方式的團隊開發(fā)的。如果團隊是非常小的,那就沒必要用到這個特性了,也沒有必要使用模塊化了。當然,就算是只有一個應用模塊,系統(tǒng)還是一樣應該正常地運作。
[1]孫衛(wèi)琴.精通Struts:基于MVC的JavaWeb設計與開發(fā)[M].北京:電子工業(yè)出版社,2007.
[2]李智淵.采用Struts框架實現(xiàn)MVC設計模式[J].甘肅科技縱橫,2005(4):13-14.
[3]蔡劍,景楠.Java Web應用開發(fā):J2EE和Tomcat[M].2版.北京:清華大學出社,2005.
Technical Overview of the Struts Framework
WANG Gang
(Information Engineering Department of Shanxi Technical College of Finance&Economics, Xianyang 712000,China)
This article briefly introduces the Struts framework and related contents,and mainly discusses the components and advanced features of the Struts framework.
Struts framework;components of Struts framework;advanced features of Struts framework
TP312
A
1008-178X(2012)09-0025-04
2012-02-03
王 剛(1978-),男,陜西咸陽人,陜西財經(jīng)職業(yè)技術(shù)學院信息工程系講師,從事計算機應用研究。