jsp分頁技術(shù)實(shí)現(xiàn)_第1頁
jsp分頁技術(shù)實(shí)現(xiàn)_第2頁
jsp分頁技術(shù)實(shí)現(xiàn)_第3頁
jsp分頁技術(shù)實(shí)現(xiàn)_第4頁
jsp分頁技術(shù)實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

jsp分頁技術(shù)實(shí)現(xiàn)jsp分頁技術(shù)實(shí)現(xiàn)jsp分頁技術(shù)實(shí)現(xiàn)xxx公司jsp分頁技術(shù)實(shí)現(xiàn)文件編號:文件日期:修訂次數(shù):第1.0次更改批準(zhǔn)審核制定方案設(shè)計(jì),管理制度

title:

JSP分頁技術(shù)實(shí)現(xiàn)

summary:使用工具類實(shí)現(xiàn)通用分頁處理

author:

evan_zhao

email

目前比較廣泛使用的分頁方式是將查詢結(jié)果緩存在HttpSession或有狀態(tài)bean中,翻頁的時(shí)候從緩存中取出一頁數(shù)據(jù)顯示。這種方法有兩個(gè)主要的缺點(diǎn):一是用戶可能看到的是過期數(shù)據(jù);二是如果數(shù)據(jù)量非常大時(shí)第一次查詢遍歷結(jié)果集會耗費(fèi)很長時(shí)間,并且緩存的數(shù)據(jù)也會占用大量內(nèi)存,效率明顯下降。

其它常見的方法還有每次翻頁都查詢一次數(shù)據(jù)庫,從ResultSet中只取出一頁數(shù)據(jù)(使用();()獲得總計(jì)錄條數(shù),使用()定位到本頁起始記錄)。這種方式在某些數(shù)據(jù)庫(如oracle)的JDBC實(shí)現(xiàn)中差不多也是需要遍歷所有記錄,實(shí)驗(yàn)證明在記錄數(shù)很大時(shí)速度非常慢。至于緩存結(jié)果集ResultSet的方法則完全是一種錯誤的做法。因?yàn)镽esultSet在Statement或Connection關(guān)閉時(shí)也會被關(guān)閉,如果要使ResultSet有效勢必長時(shí)間占用數(shù)據(jù)庫連接。因此比較好的分頁做法應(yīng)該是每次翻頁的時(shí)候只從數(shù)據(jù)庫里檢索頁面大小的塊區(qū)的數(shù)據(jù)。這樣雖然每次翻頁都需要查詢數(shù)據(jù)庫,但查詢出的記錄數(shù)很少,網(wǎng)絡(luò)傳輸數(shù)據(jù)量不大,如果使用連接池更可以略過最耗時(shí)的建立數(shù)據(jù)庫連接過程。而在數(shù)據(jù)庫端有各種成熟的優(yōu)化技術(shù)用于提高查詢速度,比在應(yīng)用服務(wù)器層做緩存有效多了。在oracle數(shù)據(jù)庫中查詢結(jié)果的行號使用偽列ROWNUM表示(從1開始)。例如select

*

from

employee

where

rownum<10

返回前10條記錄。但因?yàn)閞ownum是在查詢之后排序之前賦值的,所以查詢employee按birthday排序的第100到120條記錄應(yīng)該這么寫:

select

*

from

(

select

my_table.*,

rownum

as

my_rownum

from

(

select

name,

birthday

from

employee

order

by

birthday

)

my_table

where

rownum

<120

)

where

my_rownum>=100

mySQL可以使用LIMIT子句:

select

name,

birthday

from

employee

order

by

birthday

LIMIT

99,20

DB2有rownumber()函數(shù)用于獲取當(dāng)前行數(shù)。

SQL

Server沒研究過,可以參考這篇文章:

在Web程序中分頁會被頻繁使用,但分頁的實(shí)現(xiàn)細(xì)節(jié)卻是編程過程中比較麻煩的事情。大多分頁顯示的查詢操作都同時(shí)需要處理復(fù)雜的多重查詢條件,sql語句需要動態(tài)拼接組成,再加上分頁需要的記錄定位、總記錄條數(shù)查詢以及查詢結(jié)果的遍歷、封裝和顯示,程序會變得很復(fù)雜并且難以理解。因此需要一些工具類簡化分頁代碼,使程序員專注于業(yè)務(wù)邏輯部分。下面是我設(shè)計(jì)的兩個(gè)工具類:

PagedStatement

封裝了數(shù)據(jù)庫連接、總記錄數(shù)查詢、分頁查詢、結(jié)果數(shù)據(jù)封裝和關(guān)閉數(shù)據(jù)庫連接等操作,并使用了PreparedStatement支持動態(tài)設(shè)置參數(shù)。

RowSetPage

參考PetStore的page

by

page

iterator模式,

設(shè)計(jì)RowSetPage用于封裝查詢結(jié)果(使用OracleCachedRowSet緩存查詢出的一頁數(shù)據(jù),關(guān)于使用CachedRowSet封裝數(shù)據(jù)庫查詢結(jié)果請參考JSP頁面查詢顯示常用模式)以及當(dāng)前頁碼、總記錄條數(shù)、當(dāng)前記錄數(shù)等信息,

并且可以生成簡單的HTML分頁代碼。

PagedStatement

查詢的結(jié)果封裝成RowsetPage。

下面是簡單的使用示例:

etHTML("doQuery",

"pageno")%></td>

</tr>

</table>

</form>效果如圖:

因?yàn)榉猪擄@示一般都會伴有查詢條件和查詢動作,頁面應(yīng)已經(jīng)有校驗(yàn)查詢條件和提交查詢的javascript方法(如上面的doQuery),所以()生成的分頁代碼在用戶選擇新頁碼時(shí)直接回調(diào)前面的處理提交查詢的javascript方法。注意在顯示查詢結(jié)果的時(shí)候上次的查詢條件也需要保持,如<input

type=text

name=gender

size=1

value="<%=("gender")%>">。同時(shí)由于頁碼的參數(shù)名可以指定,因此也支持在同一頁面中有多個(gè)分頁區(qū)。

另一種分頁代碼實(shí)現(xiàn)是生成每一頁的URL,將查詢參數(shù)和頁碼作為QueryString附在URL后面。這種方法的缺陷是在查詢條件比較復(fù)雜時(shí)難以處理,并且需要指定處理查詢動作的servlet,可能不適合某些定制的查詢操作。

如果對()生成的默認(rèn)分頁代碼不滿意可以編寫自己的分頁處理代碼,RowSetPage提供了很多getter方法用于獲取相關(guān)信息(如當(dāng)前頁碼、總頁數(shù)、

總記錄數(shù)和當(dāng)前記錄數(shù)等)。

在實(shí)際應(yīng)用中可以將分頁查詢和顯示做成jsp

taglib,

進(jìn)一步簡化JSP代碼,屏蔽Java

Code。

附:分頁工具類的源代碼,

有注釋,應(yīng)該很容易理解。

繼承Page)

繼承PagedStatement)

您可以任意使用這些源代碼,但必須保留author字樣ength()<1)

{

queryJSFunctionName

=

"gotoPage";

}

if

(pageNoParamName

==

null

||

().length()<1){

pageNoParamName

=

"pageno";

}

String

gotoPage

=

"_"+queryJSFunctionName;

StringBuffer

html

=

new

StringBuffer("\n");

("<script

language=\"\">\n")

.append("function

").append(gotoPage).append("(pageNo){

\n")

.append(

"

var

curPage=1;

\n")

.append(

"

try{

curPage

=

[\"")

.append(pageNoParamName).append("\"].value;

\n")

.append(

"

[\"").append(pageNoParamName)

.append("\"].value

=

pageNo;

\n")

.append(

"

").append(queryJSFunctionName).append("(pageNo);

\n")

.append(

"

return

true;

\n")

.append(

"

}catch(e){

\n")ppend(

"

try{

\n")ppend(

"

[0].submit();

\n")ppend(

"

}catch(e){

\n")

.append(

"

alert('尚未定義查詢方法:function

")

.append(queryJSFunctionName).append("()');

\n")

.append(

"

[\"").append(pageNoParamName)

.append("\"].value

=

curPage;

\n")

.append(

"

return

false;

\n")ppend(

"

}

\n")

.append(

"

}

\n")

.append(

"}")

.append(

"</script>

\n")

.append(

"");

(

"<table

border=0

cellspacing=0

cellpadding=0

align=center

width=80%>

\n")

.append(

"

<tr>

\n")

.append(

"

<td

align=left><br>

\n");

(

"

共"

).append(

getTotalPageCount()

).append(

"頁")

.append(

"

[")

.append(getStart()).append("..").append(getEnd())

.append("/").append()).append("]

\n")

.append(

"

</td>

\n")

.append(

"

<td

align=right>

\n");

if

(hasPreviousPage()){

(

"[<a

href='javascript:").append(gotoPage)

.append("(")

.append(getCurrentPageNo()-1)

.append(

")'>上一頁</a>]

\n");

}

(

"

第")

.append(

"

<select

name='")

.append(pageNoParamName).append("'

onChange='javascript:")

.append(gotoPage).append("'>\n");

String

selected

=

"selected";

for(int

i=1;i<=getTotalPageCount();i++){

if(

i

==

getCurrentPageNo()

)

selected

=

"selected";

else

selected

=

"";

(

"

<option

value='").append(i).append("'

")

.append(selected).append(">").append(i).append("</option>

\n");

}

if

(getCurrentPageNo()>getTotalPageCount()){

(

"

<option

value='").append(getCurrentPageNo())

.append("'

selected>").append(getCurrentPageNo())

.append("</option>

\n");

}

(

"

</select>頁

\n");

if

(hasNextPage()){

(

"

[<a

href='javascript:").append(gotoPage)

.append("(").append((getCurrentPageNo()+1))

.append(

")'>下一頁</a>]

\n");

}

(

"</td></tr></table>

\n");

return

();

}}sInstance(obj)){

BoundParam

bp

=

(BoundParam)obj;

if

==

return

true;

}

return

false;

}

}},rownum

as

my_rownum

from(")

.append(

sql)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論