摘要:在使用面向?qū)ο螅∣OP)的思想進(jìn)行JSP開發(fā)時,表單數(shù)據(jù)轉(zhuǎn)化為JavaBean對象傳統(tǒng)的方法為使用jsp:useBean標(biāo)簽和通過HttpServletRequest類的getParameter和JavaBean的set方法來實現(xiàn),目前流行的web框架中(struts1、struts2)集成了JavaBean對象對表單數(shù)自動封裝。以上二個方面實現(xiàn)對JSP頁面數(shù)據(jù)封裝存在各自的弊端,該文綜合以上兩種方式實現(xiàn)了JavaBean對象自動對JSP頁面,并不依賴與任何web框架。
關(guān)鍵詞:面向?qū)ο缶幊?;JavaBean;封裝;反射;jsp標(biāo)簽
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2009)05-1116-02
The Lightweight Framework of Encapsulating Web Data to Object
WU Han-wen1, HUANG Jun-le2
(1.Department of Neurosurgery, Wuhan General hospital, Guangzhou Command, PLA, Wuhan 430070, China; 2.Wuhan Institute of Marine Electric Propulsion CSIC, Wuhan 430064, China)
Abstract: During the JSP software development with OOP method, using jsp:useBean tag and HttpServletRequest’s set and JavaBean’s get method to implement encapsulation jsp datas and JavaBean traditionally, the popular web frameworks(such as struts、webwork)implement the encapsulation between jsp datas and JavaBean automatically. This article discusses the method which encapsulates the JavaBean from jsp automatically, and don’t depend on any web frameworks.
Key words: OOP; JavaBean; encapsulation; reflect; jsp tag
1 引言
在使用面向?qū)ο螅∣bject Oriented Programming)思想進(jìn)行web開發(fā)時,瀏覽器向服務(wù)器提交數(shù)據(jù)并封裝到Java對象是一個非常頻繁,傳統(tǒng)的方式采用jsp標(biāo)簽-jsp:useBean實現(xiàn)瀏覽器數(shù)據(jù)封裝到Java對象()中,使用這種方式只能封裝簡單字符型的數(shù)據(jù),不能封裝復(fù)雜的數(shù)據(jù)類型(日期、布爾)。針對此種封裝方式的弊端,在當(dāng)前流行的web框架中(struts1、struts2、webwork)[1]實現(xiàn)了復(fù)雜數(shù)據(jù)的封裝,但是此種方式與框架集成,脫離web框架將無法實現(xiàn)J頁面數(shù)據(jù)到Java對象封裝,且此類框架中不能實現(xiàn)對自定義數(shù)據(jù)對象封裝。針對以上二中方式的弊端,本文提出了基于JSP標(biāo)簽實現(xiàn)對瀏覽器中任何類型數(shù)據(jù)到Java對象封裝,使用了JSP標(biāo)簽、Java反射機(jī)制等技術(shù)。
2 輕量級web表單數(shù)據(jù)封裝框架實現(xiàn)方法
2.1 面向?qū)ο蟊韱螖?shù)據(jù)封裝
在使用web技術(shù)開發(fā)時,一個表單往往代表一個對象數(shù)據(jù),在java平臺中使用Java Bean來封裝表單提交的數(shù)據(jù)。Java Bean是可復(fù)用的組件,對Java Bean并沒有嚴(yán)格的規(guī)范,理論上講,任何一個Java類都可以是一個Bean.但通常情況下以Java Bean應(yīng)具有一個無參的構(gòu)造器.另外,通常Java Bean還要實現(xiàn)Serializable接口用于實現(xiàn)Bean的持久性[2]。Java Bean實際上相當(dāng)于微軟COM模型中的本地進(jìn)程內(nèi)COM組件,它是不能被跨進(jìn)程訪問的.Java Bean具有以下幾個方面的特點:
1) 定義該對象使用的常量。
2) 絕大部分屬性定義為私有屬性(private)。
3) 對屬性設(shè)置通過setXxx方法進(jìn)行,方法訪問權(quán)限為公共(public),且set方法可以擁有一定的業(yè)務(wù)邏輯。
4) 對屬性的訪問通過getXxx方法進(jìn)行,方法訪問權(quán)限為公共(public),且get方法可以擁有一定的業(yè)務(wù)邏輯。
5) 對象序列化,Java Bean對象實現(xiàn)Serializable接口,為此對象可以作為文件流在網(wǎng)絡(luò)中傳輸。
Java Bean封裝表單提交數(shù)據(jù)有下面幾種方式:
1) 通過JSP內(nèi)置對象request獲取表單提交數(shù)據(jù)(字符串類型),將數(shù)據(jù)轉(zhuǎn)化為與Java Bean對應(yīng)的數(shù)據(jù)類型,通過set方法將數(shù)據(jù)封裝到Java Bean中。此種方式工作量大,但可封裝任何類型的數(shù)據(jù)類型,其中包括自定義的數(shù)據(jù)類型。
2) 通過jsp:useBean標(biāo)簽來實現(xiàn)頁面數(shù)據(jù)與Java Bean對象的封裝。此種方式實現(xiàn)比較簡單,但不能封裝復(fù)雜的數(shù)據(jù)類型。
3) 流行web框架集成實現(xiàn)自動對頁面數(shù)據(jù)封裝。此種方式封裝的數(shù)據(jù)類型比較多,但需要編寫配置文件,且此種方式不能脫離框架。
針對以上各種實現(xiàn)方式的優(yōu)缺點,下面論述輕量級web表單數(shù)據(jù)封裝框架實現(xiàn)。
2.2JSP標(biāo)簽開發(fā)
Jsp標(biāo)簽介紹:
JSP標(biāo)簽開發(fā)步驟[3]:
1) 開發(fā)jsp標(biāo)簽類,標(biāo)簽類需繼承javax.servlet.jsp.tagext.TagSupport類,并覆寫doStartTag和doEndTag方法。在doEndTag方法體類實現(xiàn)封裝web表單數(shù)據(jù)到JavaBean的封裝。
2) 編寫tld文件,在tld文件中描述標(biāo)簽名稱、標(biāo)簽定義類、標(biāo)簽體,標(biāo)簽屬性定義:屬性名稱、屬性是否可空等。
3) 在web.xml配置文件中配置標(biāo)簽庫,配置如下:
通過以上步驟實現(xiàn)了自定義標(biāo)簽,在jsp頁面導(dǎo)入標(biāo)簽后變可使用標(biāo)簽進(jìn)行web表單數(shù)據(jù)封裝。
2.3 輕量級web表單數(shù)據(jù)封裝框架實現(xiàn)
輕量級web表單數(shù)據(jù)封裝需要使用jsp標(biāo)簽和java反射機(jī)制來實現(xiàn),實現(xiàn)如圖1所示。
JSP頁面層在框架實現(xiàn)中需要規(guī)范各組件的命名,命名規(guī)范如下:
1) 組件中的值若是java基本類型(String、Short、Integer、Double、Float、Boolean、Char、Date)則組件的命名只需與封裝JavaBean對象名稱一致便可(區(qū)分大小寫)。
2) 組件中的值若是JavaBen中自定義的對象的時,比如JavaBean中有一個屬性為自定義對象User,組件的值對應(yīng)User對象的Id,則組件的命名需為:user.Id(區(qū)分大小寫)。
頁面數(shù)據(jù)分析根據(jù)JavaBean屬性針對的頁面數(shù)據(jù)進(jìn)行合法性分析,非法數(shù)據(jù)將被拋棄,不予封裝到JavaBean對象中。
反射機(jī)制映射是整個框架中的核心,該機(jī)制實現(xiàn)頁面數(shù)據(jù)到JavaBean對象封裝[4]。反射(Reflect)是Java編程語言的特性。反射就是一個在當(dāng)前JVM 中支持類、接口和對象內(nèi)省的小型的、類型安全的和可靠的API。它是通過java.lang.reflect包提供的,可以對類的能力進(jìn)行分析。圖2的流程圖描述了在自定義標(biāo)簽中粘合數(shù)據(jù)分析、映射過程。
自定義標(biāo)簽調(diào)用數(shù)據(jù)驗證模塊,該模塊對JSP頁面數(shù)據(jù)進(jìn)行驗證,非法數(shù)據(jù)將被拋棄,使用自定義的getInstanceByClassType方法獲取JavaBean實例,然后調(diào)用自定義getObjectByTypeValue方法將JSP頁面數(shù)據(jù)轉(zhuǎn)化為JavaBean對象屬性類型實例,使用invokeMethod調(diào)用JavaBean的set方法將數(shù)據(jù)封裝到JavaBean實例中并返回給JSP容器,供JSP程序調(diào)用。
3 結(jié)論
本文針對當(dāng)前面向?qū)ο蟊韱螖?shù)據(jù)封裝的優(yōu)缺點,提出了輕量級web表單數(shù)據(jù)封裝框架實現(xiàn)方案,在實現(xiàn)方案中使用了JSP標(biāo)簽技術(shù)、JAVA反射等技術(shù)。輕量級web表單數(shù)據(jù)封裝框架方案已實現(xiàn)并在系統(tǒng)開發(fā)中得到應(yīng)用,從而提高了軟件開發(fā)效率。此框架具有良好的操作和擴(kuò)張性。
參考文獻(xiàn):
[1] 赫斯特.實戰(zhàn)STRUTS[M].北京:機(jī)械工業(yè)出版社,2005:100-130.
[2] 埃史爾.Java編程思想[M].4版.陳昊鵬,譯.北京:機(jī)械工業(yè)出版社,2007:456-480.
[3] 劉曉華,張健,周慧貞.JSP應(yīng)用開發(fā)詳解[M].3版.北京:電子工業(yè)出版社,2007:321-350.
[4] 孫衛(wèi)琴.Java面向?qū)ο缶幊?Java開發(fā)專家[M].北京:電子工業(yè)出版社,2006:430-460.