




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
jsp分頁技術(shù)實現(xiàn)jsp分頁技術(shù)實現(xiàn)jsp分頁技術(shù)實現(xiàn)xxx公司jsp分頁技術(shù)實現(xiàn)文件編號:文件日期:修訂次數(shù):第1.0次更改批準(zhǔn)審核制定方案設(shè)計,管理制度
title:
JSP分頁技術(shù)實現(xiàn)
summary:使用工具類實現(xiàn)通用分頁處理
author:
evan_zhao
目前比較廣泛使用的分頁方式是將查詢結(jié)果緩存在HttpSession或有狀態(tài)bean中,翻頁的時候從緩存中取出一頁數(shù)據(jù)顯示。這種方法有兩個主要的缺點(diǎn):一是用戶可能看到的是過期數(shù)據(jù);二是如果數(shù)據(jù)量非常大時第一次查詢遍歷結(jié)果集會耗費(fèi)很長時間,并且緩存的數(shù)據(jù)也會占用大量內(nèi)存,效率明顯下降。
其它常見的方法還有每次翻頁都查詢一次數(shù)據(jù)庫,從ResultSet中只取出一頁數(shù)據(jù)(使用();()獲得總計錄條數(shù),使用()定位到本頁起始記錄)。這種方式在某些數(shù)據(jù)庫(如oracle)的JDBC實現(xiàn)中差不多也是需要遍歷所有記錄,實驗證明在記錄數(shù)很大時速度非常慢。至于緩存結(jié)果集ResultSet的方法則完全是一種錯誤的做法。因為ResultSet在Statement或Connection關(guān)閉時也會被關(guān)閉,如果要使ResultSet有效勢必長時間占用數(shù)據(jù)庫連接。因此比較好的分頁做法應(yīng)該是每次翻頁的時候只從數(shù)據(jù)庫里檢索頁面大小的塊區(qū)的數(shù)據(jù)。這樣雖然每次翻頁都需要查詢數(shù)據(jù)庫,但查詢出的記錄數(shù)很少,網(wǎng)絡(luò)傳輸數(shù)據(jù)量不大,如果使用連接池更可以略過最耗時的建立數(shù)據(jù)庫連接過程。而在數(shù)據(jù)庫端有各種成熟的優(yōu)化技術(shù)用于提高查詢速度,比在應(yīng)用服務(wù)器層做緩存有效多了。在oracle數(shù)據(jù)庫中查詢結(jié)果的行號使用偽列ROWNUM表示(從1開始)。例如select
*
from
employee
where
rownum<10
返回前10條記錄。但因為rownum是在查詢之后排序之前賦值的,所以查詢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程序中分頁會被頻繁使用,但分頁的實現(xiàn)細(xì)節(jié)卻是編程過程中比較麻煩的事情。大多分頁顯示的查詢操作都同時需要處理復(fù)雜的多重查詢條件,sql語句需要動態(tài)拼接組成,再加上分頁需要的記錄定位、總記錄條數(shù)查詢以及查詢結(jié)果的遍歷、封裝和顯示,程序會變得很復(fù)雜并且難以理解。因此需要一些工具類簡化分頁代碼,使程序員專注于業(yè)務(wù)邏輯部分。下面是我設(shè)計的兩個工具類:
PagedStatement
封裝了數(shù)據(jù)庫連接、總記錄數(shù)查詢、分頁查詢、結(jié)果數(shù)據(jù)封裝和關(guān)閉數(shù)據(jù)庫連接等操作,并使用了PreparedStatement支持動態(tài)設(shè)置參數(shù)。
RowSetPage
參考PetStore的page
by
page
iterator模式,
設(shè)計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īng)已經(jīng)有校驗查詢條件和提交查詢的javascript方法(如上面的doQuery),所以()生成的分頁代碼在用戶選擇新頁碼時直接回調(diào)前面的處理提交查詢的javascript方法。注意在顯示查詢結(jié)果的時候上次的查詢條件也需要保持,如<input
type=text
name=gender
size=1
value="<%=("gender")%>">。同時由于頁碼的參數(shù)名可以指定,因此也支持在同一頁面中有多個分頁區(qū)。
另一種分頁代碼實現(xiàn)是生成每一頁的URL,將查詢參數(shù)和頁碼作為QueryString附在URL后面。這種方法的缺陷是在查詢條件比較復(fù)雜時難以處理,并且需要指定處理查詢動作的servlet,可能不適合某些定制的查詢操作。
如果對()生成的默認(rèn)分頁代碼不滿意可以編寫自己的分頁處理代碼,RowSetPage提供了很多getter方法用于獲取相關(guān)信息(如當(dāng)前頁碼、總頁數(shù)、
總記錄數(shù)和當(dāng)前記錄數(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療管理課件
- 健康消費(fèi)勤儉節(jié)約課件
- 藥品注冊與質(zhì)量管理辦法
- 董事會履職保障管理辦法
- 2024年油服項目資金申請報告代可行性研究報告
- 2024年熱塑性聚氨酯彈性體項目投資申請報告代可行性研究報告
- 裝備公司供應(yīng)商管理辦法
- 衡水銀行資本金管理辦法
- 裕安區(qū)地方債務(wù)管理辦法
- 西安高校圖書館管理辦法
- GB/T 77-2007內(nèi)六角平端緊定螺釘
- 中華人民共和國安全生產(chǎn)法
- 九年一貫制學(xué)校教育教學(xué)管理制度匯編
- GA/T 1105-2013信息安全技術(shù)終端接入控制產(chǎn)品安全技術(shù)要求
- 危險化學(xué)品MSDS(氯化銨)
- 《C++語言基礎(chǔ)》全套課件(完整版)
- 鋼筋混凝土框架結(jié)構(gòu)設(shè)計講義
- 《材料成型裝備及自動化》課程大綱
- 保溫材料進(jìn)場質(zhì)量檢驗表
- GB∕T 23937-2020 工業(yè)硫氫化鈉
- 刀具磨損與刀具壽命
評論
0/150
提交評論