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