999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種基于Struts2 框架的Web 分頁模型的設(shè)計與實(shí)現(xiàn)

2013-08-29 09:38:58崔行臣張明光
山東科學(xué) 2013年4期
關(guān)鍵詞:頁面數(shù)據(jù)庫模型

崔行臣,張明光

(山東廣播電視大學(xué)現(xiàn)代教育技術(shù)中心,山東 濟(jì)南 250014)

在Web 應(yīng)用軟件開發(fā)中,通常要對數(shù)據(jù)進(jìn)行多種條件的查詢。在傳統(tǒng)設(shè)計中,通常是客戶一次從服務(wù)器中查詢所要的數(shù)據(jù)并顯示到客戶端,但當(dāng)符合條件的數(shù)據(jù)量較大時,就會增加服務(wù)器的通信負(fù)載,減慢Web 服務(wù)器的響應(yīng)速度,用戶瀏覽數(shù)據(jù)的體驗(yàn)效果較差。因此,適當(dāng)?shù)姆猪摷夹g(shù)是十分必要的。如果直接利用數(shù)據(jù)庫管理系統(tǒng)提供的分頁功能來對數(shù)據(jù)分頁,性能比較高,但是不同的數(shù)據(jù)庫實(shí)現(xiàn)的方法各不相同,缺乏通用性。在基于JavaEE 平臺上,分頁方法傳統(tǒng)上使用在JSP 中編碼的方式來實(shí)現(xiàn),將頁面的業(yè)務(wù)操作、控制邏輯和顯示都放在JSP 中,直接在其頁面上對數(shù)據(jù)進(jìn)行操作,最后將所取得的數(shù)據(jù)在頁面進(jìn)行分頁顯示。這種方法的缺點(diǎn)是應(yīng)用系統(tǒng)框架之間高度耦合,分頁程序的重用性和移植性差[1-2]。

針對以上問題,本文利用基于MVC 模式的Struts2 架構(gòu)來實(shí)現(xiàn)一種高效的可移植的Web 數(shù)據(jù)分頁方法,依托良好的層次機(jī)構(gòu)設(shè)計達(dá)到顯示邏輯和業(yè)務(wù)邏輯分離、代碼重用性高的目的。

圖1 Struts2 的數(shù)據(jù)流向圖Fig.1 Data flow diagram of Struts2

1 MVC 模式和Struts 框架

MVC 把一個Web 應(yīng)用分成3 個基本部分:Model (模型)、View (視圖)和Controler(控制器),這3 個部分以最小的耦合協(xié)同工作,從而提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。模型部件是軟件所處理問題邏輯在獨(dú)立于外在顯示內(nèi)容和形式情況下的內(nèi)在抽象,它封裝了問題的業(yè)務(wù)數(shù)據(jù)和邏輯。視圖部件把表示模型數(shù)據(jù)和邏輯關(guān)系的信息以特定形式展示出來??刂破魇鞘鼓P秃鸵晥D協(xié)同工作的部件,把不同的模型和不同的視圖結(jié)合在一起,完成不同的請求。模型、視圖與控制器的分離,使得多個視圖共享一個模型,如果用戶通過視圖的控制器改變了模型數(shù)據(jù),所有其他依賴于這些數(shù)據(jù)的視圖都應(yīng)反映這些變化,也減少了代碼維護(hù)量。采用MVC 模式開發(fā)有利于軟件工程化管理,每一層各司其職,提供良好的工程結(jié)構(gòu)并降低各個組件之間的耦合性。

Struts2 是實(shí)現(xiàn)MVC 的一個優(yōu)秀框架,提供了較好的層次分隔能力。Struts2 框架中使用Servlet 過濾器來作為控制器FilterDispatcher,它過濾請求并決定由哪個Action 來處理當(dāng)前請求。Action 在Struts2 中作為模型而存在,主要有兩個功能:一是進(jìn)行數(shù)據(jù)的傳遞,Action 中的成員屬性不一定封裝用戶的請求參數(shù),也可以封裝了Action 需要傳入下一個頁面顯示的值;二是可以用來調(diào)用業(yè)務(wù)邏輯處理請求,當(dāng)Action 把處理請求處理完畢后,會返回一個邏輯視圖。視圖表現(xiàn)形式很多,既支持JSP,也支持FreeMaker 等模版技術(shù)[3]。Struts2 的數(shù)據(jù)流向圖如圖1 所示。

2 Java EE 平臺中幾種典型的分頁技術(shù)

2.1 基于SQL 分頁算法

Mysql、Oracle,DB2 等數(shù)據(jù)庫管理系統(tǒng)(DBMS)都提供了自身的數(shù)據(jù)庫分頁方法,而且SQL 都對其進(jìn)行了優(yōu)化處理:Oracle 使用偽數(shù)列rownum 來限制結(jié)果集的大小和起始位置;Mysql 使用limit 子句來限制返回結(jié)果集的條數(shù);Sqlserver 使用top 關(guān)鍵字可以實(shí)現(xiàn)分頁。這類方法屬于數(shù)據(jù)層分頁技術(shù),即從數(shù)據(jù)庫查詢時就進(jìn)行過濾截取。雖然各種數(shù)據(jù)庫都提供了相應(yīng)的方法,但是在實(shí)際程序開發(fā)中,如果數(shù)據(jù)來源由一種數(shù)據(jù)庫遷移到另外一種數(shù)據(jù)庫時,由于SQL 分頁代碼不兼容,需要修改大量的程序來適應(yīng)這種變換,維護(hù)起來很困難,也不符合軟件工程開發(fā)的思想。

2.2 JSP 分頁方法

將頁面的顯示、控制邏輯及業(yè)務(wù)操作都放在JSP 中,直接在其頁面進(jìn)行數(shù)據(jù)操作。這種方法雖然簡潔直觀,但缺點(diǎn)是過多的業(yè)務(wù)邏輯和業(yè)務(wù)操作都混雜在顯示層頁面,不僅程序員難以維護(hù),而且應(yīng)用系統(tǒng)框架模糊、相應(yīng)組件之間緊密耦合,嚴(yán)重違背了面向?qū)ο蟪绦蛟O(shè)計原理和軟件設(shè)計模式中提倡的單一職責(zé)原則和迪米特法則。

2.3 用ResultSet 移動游標(biāo)實(shí)現(xiàn)分頁

在分頁的地方直接使用jdbc 提供的ResultSet 對象來處理數(shù)據(jù),ResultSet 可以看作是一張表,包含了符合SQL 查詢語句條件的所有行以及查詢的列標(biāo)題和值。ResultSet 直接在數(shù)據(jù)庫上建立游標(biāo),并維護(hù)指向其當(dāng)前數(shù)據(jù)行的光標(biāo),使游標(biāo)定位結(jié)果集。但由于游標(biāo)是放在內(nèi)存中,在整個會話期間將一直占用內(nèi)存,并不釋放數(shù)據(jù)庫連接和ResultSet 對象。這種方式在操作大型數(shù)據(jù)和訪問用戶很多的時候,有可能導(dǎo)致DBMS 因?yàn)橘Y源耗盡而崩潰。

2.4 將查詢結(jié)果緩存在HttpSession 或變量中實(shí)現(xiàn)分頁

這種方式一般不使用,其缺陷是用戶看到的可能是過期數(shù)據(jù)并且會占用大量Web 容器內(nèi)存[4]。

2.5 使用標(biāo)簽庫

將分頁查詢和顯示做成JSP taglib,簡化JSP 代碼,使用簡單靈活[5]。目前比較流行的分頁標(biāo)簽庫有displaytag、Pager-taglib 等。

3 基于Struts2 框架的分頁技術(shù)方案

針對以上幾種分頁方法存在的問題,在實(shí)踐中總結(jié)出針對中小型Web 應(yīng)用系統(tǒng)比較好的分頁方法:檢索指定頁面的顯示數(shù)據(jù),用JavaBean 來封裝分頁操作和數(shù)據(jù)。每次翻頁的時候只從數(shù)據(jù)庫里檢索頁面大小的塊區(qū)的數(shù)據(jù)。這樣查詢出的記錄數(shù)很少,網(wǎng)絡(luò)傳輸數(shù)據(jù)量不大,使用連接池技術(shù)能縮短建立數(shù)據(jù)庫連接過程時間。在架構(gòu)設(shè)計上采用Struts2 框架進(jìn)行模型層、表示層和控制層的分離。各層完成獨(dú)立的功能,相互之間耦合度較小,具有易擴(kuò)展和易移植的優(yōu)點(diǎn)[6]。

圖2 分頁查詢流程框架Fig.2 Framework of paging query process

(1) 模 型 層:采 用JavaBean 來封裝頁面請求參數(shù)屬性,如顯示第幾頁,查詢結(jié)果等。

(2)表示層:表示層的主要任務(wù),一是向業(yè)務(wù)邏輯層發(fā)出需要顯示某頁數(shù)據(jù)集的HTTP 請求,在該數(shù)據(jù)集請求中包括需要顯示的總共記錄數(shù)、共要顯示多少頁、每頁的最大數(shù)以及當(dāng)前位于第幾頁等;二是接受業(yè)務(wù)邏輯層返回的記錄結(jié)果集,并且顯示為記錄列表[4]。在本文設(shè)計的分頁模型中采用JSP 來顯示分頁數(shù)據(jù),為了增強(qiáng)顯示層的通用性和可移植性,在JSP 中使用Struts 框架的標(biāo)簽庫,可以把表現(xiàn)和邏輯分離并且也使得頁面顯示功能不具體綁定在某個顯示框架下面,側(cè)重于提供HTML 表示層數(shù)據(jù)。查詢分頁數(shù)據(jù)和分頁導(dǎo)航代碼在表示層都利用Struts 標(biāo)簽顯示。

(3)控制層(Controller):采用Struts2 提供的FilterDispatcher 類作為核心控制器,該控制器作為一個Filter運(yùn)行在Web 應(yīng)用中,負(fù)責(zé)攔截用戶請求后根據(jù)映射配置文件struts.xml 再把控制轉(zhuǎn)交到業(yè)務(wù)邏輯層(Business Logic)相應(yīng)的處理器。引入業(yè)務(wù)邏輯層的意義在于實(shí)現(xiàn)顯示、控制和模型的完全分離,提高擴(kuò)展性和重用性,并減輕了FilterDispatcher 的負(fù)擔(dān)。

(4)業(yè)務(wù)邏輯層:采用Struts2 中的Action 類進(jìn)行業(yè)務(wù)組件的處理。在Action 中,分頁相關(guān)屬性被映射成普通的POJO。主要作用是處理來自表示層的請求,并依據(jù)該請求向數(shù)據(jù)層獲得當(dāng)前頁的數(shù)據(jù)記錄,并將結(jié)果集返回給表示層[7]。

(5)Dao 層:負(fù)責(zé)與數(shù)據(jù)庫的交互操作。傳遞相應(yīng)的參數(shù),根據(jù)Java 多態(tài)機(jī)制,調(diào)用相應(yīng)的數(shù)據(jù)庫管理系統(tǒng),查詢所需數(shù)據(jù)。為了充分利用已經(jīng)建立的連接,采用數(shù)據(jù)源連接池技術(shù)來提高查詢速度。

基于Struts2 框架的分頁查詢流程框架和主要類設(shè)計如圖2 所示。

4 設(shè)計實(shí)現(xiàn)

4.1 主要類設(shè)計

PageBean 類:作為業(yè)務(wù)模型封裝了數(shù)據(jù)庫查詢條件以及提取和保存數(shù)據(jù)的操作,記錄了記錄總數(shù)、當(dāng)前頁及每頁顯示的記錄數(shù)。

Page 類:用于產(chǎn)生分頁信息的對象,實(shí)現(xiàn)了用于顯示分頁信息的基本方法。

PagedStatement 抽象類:為了使分頁對所有數(shù)據(jù)庫具有更好的擴(kuò)展性,使用模板設(shè)計模式來抽象數(shù)據(jù)庫操作,這些操作包括執(zhí)行查詢?nèi)〉靡豁摂?shù)據(jù)和數(shù)據(jù)庫管理類進(jìn)行交互等。抽象類PagedStatement 根據(jù)查詢語句和頁碼查詢出當(dāng)前頁數(shù)據(jù),返回的數(shù)據(jù)類型沒有具體指定,可根據(jù)需要實(shí)現(xiàn)以特定方式組織數(shù)據(jù)的子類,如RowSetDataPage 類以RowSet 類型封裝數(shù)據(jù),ListDataPage 類以List 集合封裝數(shù)據(jù)等等。方法定義為:public ListPage execute Query Of List Page()throws SQLException。查詢當(dāng)前頁數(shù)據(jù)時,根據(jù)具體的數(shù)據(jù)庫類型,利用Java 的多態(tài)機(jī)制來調(diào)用相應(yīng)的實(shí)現(xiàn)類獲取數(shù)據(jù)。針對Sqlserver 數(shù)據(jù)庫的分頁查詢,實(shí)現(xiàn)類定義為PagedStatementSQLServerImpl extends PagedStatement,如果要擴(kuò)展到 Oracle 分頁數(shù)據(jù),只需添加PagedStatement 的Oracle 實(shí)現(xiàn)類即可。

4.2 業(yè)務(wù)邏輯層調(diào)用及表示層高效移植實(shí)現(xiàn)

在業(yè)務(wù)邏輯層action 中,以sqlserver 數(shù)據(jù)庫為例,調(diào)用分頁組件的分頁處理方法為:

PagedStatement pst=new PagedStatementSQLServerImpl(sql,pageno,pageNum);

ListDataPage listpage=pst.executeQueryOfListPage();

this.userlist=listpage.getList();∥當(dāng)前頁記錄數(shù)據(jù)

this.pageBar=listpage.getHTML("doQuery","pageno");∥頁面分頁代碼

返回的結(jié)果集封裝在List 集合中,封裝數(shù)據(jù)結(jié)果的類,如ListDataPage 類有g(shù)etHTML()方法,用于生成分頁代碼,系統(tǒng)提供默認(rèn)的分頁代碼,如上下型和隨意型的分頁模型[8],如果用戶不滿意,可以編寫自己所需的分頁代碼。生成的前臺頁面分頁導(dǎo)航條代碼封裝在pageBar 變量中,根據(jù)Struts2 機(jī)制,注入到頁面中,在表示層利用Struts2 強(qiáng)大的標(biāo)簽功能可以很方便地顯示分頁數(shù)據(jù)和分頁鏈接代碼。如果改用其它數(shù)據(jù)庫,調(diào)用相應(yīng)的實(shí)現(xiàn)類即可。

對于分頁代碼,可以放在一個單獨(dú)的文件中(page.jsp),假設(shè)原來的顯示頁面沒有分頁,只要在頁面的分頁導(dǎo)航位置以 <jsp:include >方式將page.jsp 包含進(jìn)去,表示層就完成了,完全不用修改原有的代碼。因?yàn)樵诒硎緦由傻姆猪撴溄哟a中,提交表單的動作已經(jīng)指向當(dāng)前業(yè)務(wù)邏輯Action。每次請求提交表單時,頁碼變量pageno 被注入到相應(yīng)業(yè)務(wù)邏輯Action,根據(jù)pageno 來獲取新的一頁數(shù)據(jù)。示例代碼如下:

<form name="pageForm" method="post" action="" > <div class="pagestyle" >

<s:property escape="false" value="pageBar"/>∥生成分頁鏈接代碼

</div > </form >

以上分頁代碼經(jīng)服務(wù)器解析后,生成分頁導(dǎo)航條的HTML 代碼,包括“第幾頁”、“共幾頁”,“上一頁”、“下一頁”、“首頁”和“末頁”連接和“轉(zhuǎn)到第幾頁”的導(dǎo)航選擇列表。

4.3 應(yīng)用及性能分析

以上討論的分頁模型已在某高校各部門網(wǎng)站系統(tǒng)中得到實(shí)際應(yīng)用,在構(gòu)造各級網(wǎng)站時只要涉及到數(shù)據(jù)分頁的頁面,都可以使用該方案來實(shí)現(xiàn)。操作步驟為:(1)在業(yè)務(wù)邏輯層調(diào)用接口;(2)在表示層分頁位置導(dǎo)入分頁代碼文件。測試性能比較如表1 所示。

從表1 可以看出,本文提出的解決方案主要從軟件工程的角度來改進(jìn)傳統(tǒng)的分頁查詢方式,在架構(gòu)設(shè)計、維護(hù)及用戶體驗(yàn)方面具有明顯的優(yōu)勢。在時間上,在開發(fā)環(huán)境JDK1.6、Tomcat6.0 下,對于10 萬條數(shù)據(jù)查詢請求,平均響應(yīng)時間為0.5 s,而本文提到的其它技術(shù)對10 萬條數(shù)據(jù)記錄查詢時,基于SQL 分頁方法平均響應(yīng)時間為0.6 s,JSP 分頁方法最好時間也在1 s 以上。

表1 本文模型與傳統(tǒng)方式的性能比較Table 1 Performance comparison of the presented model and the traditional model

5 結(jié)語

經(jīng)測試證明,本文提出的基于MVC 思想和Struts2 架構(gòu)設(shè)計的數(shù)據(jù)分頁模型具有良好的可擴(kuò)展性、可維護(hù)性及優(yōu)秀的解耦性,獲得了較高的用戶滿意度。該方案存在的問題在于框架模型管理不方便,下一步將研究采用Spring 框架來集成管理該模型。此外,對于頻繁讀取的數(shù)據(jù)(如:相鄰上下頁),為節(jié)省時間,可以只訪問一次底層數(shù)據(jù)庫而把符合條件的數(shù)據(jù)全部讀取至Web 服務(wù)器,并在其上生成一個XML 文件,以后客戶端直接和XML 文件交互[9],這也是今后研究的方向。

[1]曹晉,胡谷雨.基于jsp 技術(shù)的數(shù)據(jù)庫查詢分頁顯示[J].計算機(jī)技術(shù)與發(fā)展,2007,17(5):225 -227.

[2]黃櫟橋,陸鑫.基于Struts 框架的Web 數(shù)據(jù)庫分頁技術(shù)[J].計算機(jī)工程,2008,28(6):298 -301.

[2]李剛.Struts2.1 權(quán)威指南——基于webwork 核心的MVC 開發(fā)[M].北京:電子工業(yè)出版社,2009.

[3]劉啟文,周大海,夏秀峰.Web 應(yīng)用中可擴(kuò)展分頁技術(shù)的研究與實(shí)現(xiàn)[J].計算機(jī)應(yīng)用,2006,26(12):179 -181.

[4]何玲娟,蟻 龍,劉連臣.一種松耦合高復(fù)用MVC 模式的Web 分頁實(shí)現(xiàn)[J].計算機(jī)工程與應(yīng)用,2007,43(15):95 -97.

[5]吳東慶,張新猛,王前,等.基于SSH 架構(gòu)的分頁查詢標(biāo)簽的研究與實(shí)現(xiàn)[J].仲愷農(nóng)業(yè)工程學(xué)院學(xué)報,2010,23(1):45 -48.

[6]王瑞波.一種分頁查詢優(yōu)化方法的研究與實(shí)現(xiàn)[D].北京:北京化工大學(xué),2009.

[7]張俐.基于MVC 模式的分頁組件應(yīng)用[J].計算機(jī)工程,2011,37(21):255 -257.

[8]顧志峰,李涓子.Web 應(yīng)用程序分頁策略的研究[J].計算機(jī)工程,2005,31(21):60 -62.

[9]勾成圖,張璟,李軍懷.海量數(shù)據(jù)分頁機(jī)制在Web 信息系統(tǒng)中的應(yīng)用研究[J].2005,25(8):1926 -1929.

猜你喜歡
頁面數(shù)據(jù)庫模型
大狗熊在睡覺
一半模型
刷新生活的頁面
重要模型『一線三等角』
重尾非線性自回歸模型自加權(quán)M-估計的漸近分布
數(shù)據(jù)庫
財經(jīng)(2017年2期)2017-03-10 14:35:35
3D打印中的模型分割與打包
數(shù)據(jù)庫
財經(jīng)(2016年15期)2016-06-03 07:38:02
數(shù)據(jù)庫
財經(jīng)(2016年3期)2016-03-07 07:44:46
數(shù)據(jù)庫
財經(jīng)(2016年6期)2016-02-24 07:41:51
主站蜘蛛池模板: 亚洲国内精品自在自线官| 亚洲三级色| 国产麻豆永久视频| 国产成人a毛片在线| 国产欧美日韩va另类在线播放| 日韩国产亚洲一区二区在线观看| 久久精品这里只有国产中文精品| 欧美区国产区| 国产第一页第二页| 成色7777精品在线| 国产打屁股免费区网站| AⅤ色综合久久天堂AV色综合| 国产小视频网站| 国产成人亚洲无码淙合青草| 久久精品91麻豆| 无码国产伊人| 亚洲天堂视频网站| 又爽又大又黄a级毛片在线视频| 国产av色站网站| 国产黄色视频综合| 欧美日韩国产在线播放| 最新国产高清在线| 色欲国产一区二区日韩欧美| 色网站在线视频| 五月婷婷丁香综合| 97精品久久久大香线焦| 日日摸夜夜爽无码| 久久午夜影院| 中文毛片无遮挡播放免费| 热伊人99re久久精品最新地| 人妻无码中文字幕一区二区三区| 无码粉嫩虎白一线天在线观看| 亚洲日韩国产精品无码专区| 国产精品分类视频分类一区| 老司机久久精品视频| 亚洲成年人网| 日本亚洲欧美在线| 国产精品2| 一级一级特黄女人精品毛片| 中文精品久久久久国产网址| 在线看国产精品| 全免费a级毛片免费看不卡| 国内精品九九久久久精品| 精品视频在线观看你懂的一区| h视频在线观看网站| 女同久久精品国产99国| 国产精品欧美日本韩免费一区二区三区不卡 | 永久免费精品视频| 国产特级毛片aaaaaa| 人人91人人澡人人妻人人爽| 亚洲性视频网站| 亚洲一级毛片免费观看| 91无码人妻精品一区| 国产精品无码AV片在线观看播放| 日日噜噜夜夜狠狠视频| 伊人成人在线| 中文字幕不卡免费高清视频| 亚洲精品片911| 亚洲首页在线观看| 免费看av在线网站网址| 五月六月伊人狠狠丁香网| 在线观看亚洲精品福利片| 草草影院国产第一页| 无码免费视频| 欧美三级视频在线播放| 精品久久高清| 国产对白刺激真实精品91| 亚洲天堂啪啪| 熟女视频91| 色偷偷av男人的天堂不卡| 日韩成人在线网站| 91热爆在线| 污污网站在线观看| 国产资源免费观看| 国产精品自在自线免费观看| 精品亚洲麻豆1区2区3区| 国产日产欧美精品| 国产正在播放| 天堂网国产| a免费毛片在线播放| 亚洲精品在线91| 国产免费久久精品99re丫丫一|