版權(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
目前比較廣泛使用的分頁方式是將查詢結(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吉林藝術(shù)學(xué)院《外國文學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 文言主觀簡答試題專訓(xùn)(二)-2025新高考語文一輪復(fù)習(xí)
- 吉林藝術(shù)學(xué)院《概念設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 手工品訂單承攬協(xié)議書范文范本
- 2024年大學(xué)生接活互助協(xié)議書模板
- 吉林師范大學(xué)《習(xí)近平總書記關(guān)于教育的重要論述研究》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年處理廢石協(xié)議書模板
- 農(nóng)村地基自建房轉(zhuǎn)讓協(xié)議書范文
- 畜牧業(yè)對氣候變化的影響分析報(bào)告
- 企業(yè)衛(wèi)生安全檢查管理制度
- 經(jīng)濟(jì)學(xué)金融學(xué)課件-第十三章-中央銀行貨幣政策操作
- 變頻器原理及應(yīng)用
- 07J901-2 實(shí)驗(yàn)室建筑設(shè)備(二)
- 從文學(xué)到電影智慧樹知到期末考試答案章節(jié)答案2024年山東大學(xué)
- 人教九年級歷史上冊《探尋新航路》教學(xué)課件
- 應(yīng)急分隊(duì)人員招聘方案范文
- 幼兒園班級幼兒圖書目錄清單(大中小班)
- 芥菜栽培技術(shù)規(guī)程
- 古風(fēng)折扇的設(shè)計(jì) (教學(xué)設(shè)計(jì))-三年級上冊勞動浙教版
- 大學(xué)生體育課學(xué)情分析
- 2024年湖南化工職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整
評論
0/150
提交評論