楊 懌,陳卓妮
(1.湖北師范學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 黃石 435002;2.黃石市教育局,湖北 黃石 435000)
Java Web應(yīng)用底層數(shù)據(jù)傳遞模式的分析與研究
楊 懌1,陳卓妮2
(1.湖北師范學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 黃石 435002;2.黃石市教育局,湖北 黃石 435000)
在Java Web應(yīng)用開(kāi)發(fā)中,底層數(shù)據(jù)傳遞的模式和傳統(tǒng)本地應(yīng)用有著不小的區(qū)別,對(duì)底層數(shù)據(jù)傳遞模式的了解和數(shù)據(jù)傳遞流程的設(shè)計(jì)決定了應(yīng)用開(kāi)發(fā)的復(fù)雜程度,影響著整個(gè)Java Web應(yīng)用程序的開(kāi)發(fā)效率和后期維護(hù)的難易度。筆者從開(kāi)發(fā)模型入手對(duì)Java Web應(yīng)用中的底層數(shù)據(jù)傳遞模式進(jìn)行了分析,并詳細(xì)說(shuō)明了底層數(shù)據(jù)流程和方法。
Web應(yīng)用;Java;數(shù)據(jù)傳遞
Web應(yīng)用程序已成為現(xiàn)代應(yīng)用軟件的一個(gè)重要分支。伴隨著網(wǎng)絡(luò)基礎(chǔ)設(shè)施的不斷完善,網(wǎng)絡(luò)帶寬的不斷提升,給了Web應(yīng)用更大更廣闊的發(fā)展空間。加上Web應(yīng)用在網(wǎng)絡(luò)上發(fā)布和使用的便捷性,越來(lái)越多的應(yīng)用程序采用了Web應(yīng)用的模式來(lái)進(jìn)行開(kāi)發(fā)。而Web應(yīng)用的軟件結(jié)構(gòu)和傳統(tǒng)的依附于操作系統(tǒng)的本地應(yīng)用不同,其底層數(shù)據(jù)傳遞方式多樣且復(fù)雜。隨著越來(lái)越多的Java Web開(kāi)發(fā)開(kāi)始使用第三方框架,這些框架對(duì)底層數(shù)據(jù)傳遞的機(jī)制或多或少的做了一定的封裝,使得一部分開(kāi)發(fā)者并沒(méi)有完全接觸到底層的代碼,不了解底層數(shù)據(jù)傳遞的模式,因而對(duì)項(xiàng)目的開(kāi)發(fā)造成了影響。相反,對(duì)底層模式的熟悉可以更快的掌握框架的核心功能,來(lái)減輕數(shù)據(jù)發(fā)送、傳遞和獲取時(shí)重復(fù)代碼的編寫(xiě)。Java Web應(yīng)用中客戶端與服務(wù)器進(jìn)行數(shù)據(jù)傳遞和服務(wù)器端內(nèi)部數(shù)據(jù)流的處理時(shí)機(jī)制完全不同,前者使用網(wǎng)絡(luò)協(xié)議在網(wǎng)絡(luò)上傳輸數(shù)據(jù)最終使用Java代碼接受數(shù)據(jù),而后者完全采用Java EE技術(shù)在服務(wù)器端的應(yīng)用服務(wù)器軟件的支持下進(jìn)行傳遞,見(jiàn)圖1.
圖1 Java Web應(yīng)用底層數(shù)據(jù)傳遞模式
Java Web應(yīng)用程序數(shù)據(jù)傳遞的發(fā)起始于客戶端一個(gè)瀏覽器向Web應(yīng)用服務(wù)器發(fā)出請(qǐng)求,應(yīng)用服務(wù)器把請(qǐng)求中需要程序處理的數(shù)據(jù)放在由服務(wù)器生成的request對(duì)象中,接著調(diào)用相應(yīng)程序處理后將最終結(jié)果放在response對(duì)象中發(fā)送給客戶端的用戶瀏覽器。不斷往返的請(qǐng)求和響應(yīng)構(gòu)成了客戶端到服務(wù)器的數(shù)據(jù)傳遞。
從客戶端向服務(wù)器傳遞數(shù)據(jù)常用兩種方式。簡(jiǎn)單的數(shù)據(jù)可以直接放在請(qǐng)求URL的后面加上問(wèn)號(hào)接著寫(xiě)上參數(shù)名等于參數(shù)值的值對(duì)。例如:請(qǐng)求的URL是"abc?x=1&y=2",會(huì)把x和y這兩個(gè)參數(shù)值傳遞給了URL"abc"所對(duì)應(yīng)的程序代碼。在程序代碼中使用request對(duì)象的getParameter()方法即可接受到參數(shù)值。第二種方式采用表單從客戶端提交數(shù)據(jù)給服務(wù)器,在提交數(shù)據(jù)之前需先向服務(wù)器請(qǐng)求一個(gè)表單頁(yè),可以把這個(gè)服務(wù)器返回的表單頁(yè)看做數(shù)據(jù)的載體,在這個(gè)載體中填好數(shù)據(jù)后,再次提交時(shí),數(shù)據(jù)就會(huì)傳遞給表單中指明的處理程序,在程序中同樣適用request對(duì)象的getParameter()方法來(lái)取得表單中的各項(xiàng)數(shù)據(jù)。使用此方法取得的數(shù)據(jù)都是字符串類(lèi)型,如果原始數(shù)據(jù)是基本數(shù)據(jù)類(lèi)型,則要進(jìn)行一次數(shù)據(jù)類(lèi)型轉(zhuǎn)化。
從服務(wù)器向客戶端發(fā)送數(shù)據(jù)也有兩種形式,第一種方式中服務(wù)器中的程序會(huì)直接把最終的數(shù)據(jù)結(jié)果插入到顯示頁(yè)面上,一起作為HTML頁(yè)面響應(yīng)發(fā)給瀏覽器顯示。另一種則把數(shù)據(jù)放在response對(duì)象中傳遞給頁(yè)面的JavaScript來(lái)處理。
Java Web應(yīng)用程序的底層技術(shù)是Servlet,因?yàn)镴SP在運(yùn)行時(shí)也要轉(zhuǎn)化為Servlet,他們兩者的實(shí)質(zhì)是一樣的,都需要使用URL來(lái)調(diào)用。當(dāng)服務(wù)器端的程序接收客戶端的數(shù)據(jù)以后,往往不僅僅是由一個(gè)Servlet或JSP來(lái)處理,因此會(huì)在多個(gè)Servlet或JSP中進(jìn)行傳遞。他們之間的數(shù)據(jù)傳遞與傳統(tǒng)的本地應(yīng)用中直接通過(guò)函數(shù)調(diào)用時(shí)通過(guò)函數(shù)的參數(shù)來(lái)傳遞數(shù)據(jù)的形式完全不同。
首先把需要傳遞的數(shù)據(jù)通過(guò)request對(duì)象的setAttribute()方法與一個(gè)屬性名綁定保存在request對(duì)象中。然后通過(guò)語(yǔ)句request.getRequestDispatcher(name).forward(request, response)轉(zhuǎn)發(fā)到另一個(gè)Servlet或JSP,其中第一個(gè)括號(hào)中的參數(shù)值是轉(zhuǎn)發(fā)目標(biāo)的URL。最后再在目標(biāo)代碼中使用request對(duì)象getAttribute()方法通過(guò)保存時(shí)的屬性名來(lái)取得數(shù)據(jù)值。
除了以線性方式傳遞數(shù)據(jù)以外,在服務(wù)器端很多時(shí)候還需要以一種離散的方式來(lái)保存和傳遞數(shù)據(jù)。例如在一些需要用戶登錄的Web應(yīng)用中,很多界面都需要顯示用戶信息,那么在第一次取得用戶信息以后,這一數(shù)據(jù)需要一直存在并多次被讀取。Java Web編程中提供了幾個(gè)對(duì)象來(lái)完成這些工作,session對(duì)象可以在一個(gè)會(huì)話即打開(kāi)瀏覽器到關(guān)閉瀏覽器的整個(gè)過(guò)程中一直存在,這個(gè)對(duì)象也使用setAttribute()和getAttribute()方法來(lái)保存和取得數(shù)據(jù)。
需要注意的是,傳遞過(guò)程中數(shù)據(jù)是作為object對(duì)象類(lèi)型來(lái)保存的,取得數(shù)據(jù)對(duì)象以后需要做一次強(qiáng)制類(lèi)型轉(zhuǎn)換,將object類(lèi)型對(duì)象轉(zhuǎn)換成傳遞前的對(duì)象類(lèi)型。有時(shí)客戶端頁(yè)面需要展示從數(shù)據(jù)庫(kù)讀取的多行數(shù)據(jù),或者若干的獨(dú)立的對(duì)象數(shù)據(jù),為了方便數(shù)據(jù)的傳遞,在傳遞之前可以把數(shù)據(jù)保存在一個(gè)集合類(lèi)對(duì)象中。
為了讓數(shù)據(jù)傳遞處理更加高效,在Java Web應(yīng)用開(kāi)發(fā)中經(jīng)常使用的MVC開(kāi)發(fā)模式將整個(gè)Web應(yīng)用分為了Model邏輯層,View表示層和Control控制層三個(gè)部分,其中控制層的主要作用之一就是負(fù)責(zé)整個(gè)應(yīng)用程序的數(shù)據(jù)傳遞。控制層的獨(dú)立把用于數(shù)據(jù)傳遞的代碼分離出來(lái),讓數(shù)據(jù)傳遞的流程成為了應(yīng)用程序的血管,同時(shí)也讓表示層和邏輯層的任務(wù)更加明確,整個(gè)Web應(yīng)用構(gòu)架更加清晰。
控制層的作用是從客戶端接受數(shù)據(jù)請(qǐng)求,然后根據(jù)請(qǐng)求,把客戶端數(shù)據(jù)傳遞給相關(guān)的邏輯處理代碼,待數(shù)據(jù)被邏輯層處理完畢后,再將處理完成的數(shù)據(jù)傳遞給表示層展示給客戶端用戶??刂茖硬粌H是數(shù)據(jù)流的管道,同時(shí)也扮演這一個(gè)數(shù)據(jù)控制中心的角色,負(fù)責(zé)數(shù)據(jù)在業(yè)務(wù)邏輯和展示界面之間的調(diào)度。這樣的開(kāi)發(fā)模型能讓開(kāi)發(fā)者把更多的時(shí)間投入到業(yè)務(wù)邏輯和用戶體驗(yàn)的設(shè)計(jì)當(dāng)中。
雖然Java EE的版本不斷升級(jí),新的框架不斷出現(xiàn),但底層數(shù)據(jù)傳遞始終是開(kāi)發(fā)Java Web應(yīng)用中的重要一環(huán)。采用各自針對(duì)性的模式來(lái)處理客戶端到服務(wù)器的數(shù)據(jù)傳遞和服務(wù)器內(nèi)部數(shù)據(jù)傳遞,在應(yīng)用服務(wù)器內(nèi)部選擇不同的對(duì)象來(lái)保存生命周期不同的數(shù)據(jù),同時(shí)在開(kāi)發(fā)模式中建立控制層獨(dú)立的處理數(shù)據(jù)流,不但可以讓數(shù)據(jù)傳遞流程的設(shè)計(jì)更加合理,也是Java Web應(yīng)用程序運(yùn)行穩(wěn)定和高效的保證。
[1]馬衛(wèi)華,馬滿增,劉文慧.Web應(yīng)用系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)的原理[J]. 電腦編程技巧與維護(hù),2008,15:48~49.
[2]姜宇鳴,劉瑞玲.基于MVC模式的B/S架構(gòu)系統(tǒng)的開(kāi)發(fā)與探討[J]. 科技致富向?qū)? 2012,18:19~21.
[3]郝玉龍.Java EE編程技術(shù)[M].北京:清華大學(xué)出版社,北京交通大學(xué)出版社,2008.
[4]李 剛.瘋狂Java第二版[M].北京 :電子工業(yè)出版社,2012.
[5]鄧子云.Java Web輕量級(jí)應(yīng)用開(kāi)發(fā)[M]. 北京:電子工業(yè)出版社,2012.
ThetransfermodeoftheunderlyingdatainJavaWebapplication
YANG Yi1,CHEN Zhuo-ni2
(1.College of Computer Science &Technology,Hubei Normal University,Huangshi 435002,China;2.Education Bureau,Huangshi 435000,China)
When an Java Web application system developed,the transfer mode of the underlying data is greatly different from that of the traditional local application system.How complicated the application development is depends on the understanding of the transfer mode of the underlying data and the design of the data transfer flow,which effects the development efficiency and the maintenance difficulty in later period.A transfer mode of the underlying data of the Java Web application system is analyzed in this paper,and the way of the data transfer flow is expained in detail.
Web application;Java;data transfer
2013—11—27
楊 懌(1979— ),男,湖北黃石人,碩士,實(shí)驗(yàn)師,研究方向?yàn)镴ava Web應(yīng)用、軟件工程.
TP311
A
1009-2714(2014)01- 0027- 03
10.3969/j.issn.1009-2714.2014.01.006