當(dāng)前位置:首頁>>開發(fā)編程>>ASP>>新聞內(nèi)容
創(chuàng)建一個ASP通用分頁類
作者:平波 發(fā)布時間:2004-7-16 12:00:23 文章來源:無心之柳

  從開始學(xué)習(xí)到使用ASP到現(xiàn)在也寫了不少程序了,最令人頭痛的是寫數(shù)據(jù)分頁,每次都是由于幾個變量名或幾個參數(shù)的不同,因而需要每次都寫哪一段冗長而又繁雜的分頁代碼,代碼長了使得程序的可讀性變差,容易出差,調(diào)試半天也找不出錯在哪里,所以慢慢的我開始使用一些網(wǎng)上的提供的分頁函數(shù)或分頁類。的確省事不少,但是通常的函數(shù)和類的做法都是就數(shù)據(jù)顯示部分也封裝了起來,每次為了達(dá)到自己需要的顯求效果要去改動函數(shù)或者類的本身,所以使用起來也不是怎么方便,自己寫的分頁改起來已經(jīng)夠復(fù)雜了,更不要說別人的了。

所以趁昨天有空自己寫了一個分頁的類,自我感覺良好(不要用雞蛋砸我),在這里和大家分享一下自己的經(jīng)驗(談不上經(jīng)驗,感想吧)。在這里我也不想說分頁的原理了,反正大家都懂,要我往深入的談我也不會。呵呵。

一、創(chuàng)建分頁類的目標(biāo)
在寫之前,我曾想過,我究竟要寫怎么樣一個類,回想起以前寫分頁過程的時候,最煩的莫過于每次都要寫哪一段復(fù)雜的分頁代碼,最大的煩惱每次都是僅僅幾個變量名的不同。所以第一個要實現(xiàn)的就是要把這個封裝起來,第二個就是要把分頁的導(dǎo)航條也封裝起來,第三個,不習(xí)慣哪些把數(shù)據(jù)顯示部分也封裝起來的方法,這不是方便編程,對與哪些對顯示效果每次都不同的用戶來說,比自己寫分頁還要麻煩。所以我的目地就是對RecordSet進(jìn)行一些簡單的封裝。

二、創(chuàng)建過程
所以我寫的第一個屬性,就是返一個經(jīng)過處理的RecordSe

Public Property Get GetRs()
  Set XD_Rs=Server.createobject("adodb.recordset")
  XD_Rs.PageSize=PageSize
  XD_Rs.Open XD_SQL,XD_Conn,1,1
  If not(XD_Rs.eof and XD_RS.BOF) Then
  If int_curpage>XD_RS.PageCount Then
int_curpage=XD_RS.PageCount
  End If
  XD_Rs.AbsolutePage=int_curpage
  End If
  Set GetRs=XD_RS
End Property

   這個屬性的作用是更據(jù)指定RecordSet 的當(dāng)前面,并到指針指向當(dāng)前頁的第一條記錄,這個應(yīng)該就是整個類的完成分頁的核心了,當(dāng)然,其中的一些參數(shù)是靠其它的屬性來獲取,所以這里順便介紹一個這個類所要的基本參數(shù)

=============================================
'GetConn 得到數(shù)據(jù)庫連接
'
'=============================================
Public Property Let GetConn(obj_Conn)
  Set XD_Conn=obj_Conn
End Property

'=============================================
'GetSQL 得到查詢語句
'
'==============================================
Public Property Let GetSQL(str_sql)
  XD_SQL=str_sql
End Property

'===============================================
'PageSize 屬性
'設(shè)置每一頁的分頁大小
'===============================================
Public Property Let PageSize(int_PageSize)
  If IsNumeric(Int_Pagesize) Then
  XD_PageSize=CLng(int_PageSize)
  Else
  str_error=str_error & "PageSize的參數(shù)不正確"
  ShowError()
  End If
End Property

Public Property Get PageSize
  If XD_PageSize="" or (not(IsNumeric(XD_PageSize))) Then
  PageSize=10
  Else
  PageSize=XD_PageSize
  End If
End Property

以上幾個是在使用類的過程必需要指定的參數(shù),曾經(jīng)我在寫屬性的時候?qū)γ總傳入的參數(shù)加上IsObject(obj_conn)等判斷,為的是類的健壯,但是后來想來想去,這個對與ASP來說沒有必要,不加還能加快點速度,至于為什么這樣,我想各位在使用過程中也會發(fā)現(xiàn),加還不如不加。這也是我經(jīng)過了思想斗爭以后才去掉了,只保留了一些必要的驗證。
一個參數(shù)就是當(dāng)前頁的獲得,在程序中我用int_curpage來標(biāo)識,這個的話放在類的創(chuàng)建過程中獲得在好也沒有了

  '========================
  '設(shè)定一些參數(shù)的黙認(rèn)值
  '========================
  XD_PageSize=10 '設(shè)定分頁的默認(rèn)值為10
  '========================
  '獲取當(dāng)前面的值
  '========================
  If request("page")="" Then
  int_curpage=1
  ElseIf not(IsNumeric(request("page"))) Then
  int_curpage=1
  ElseIf CInt(Trim(request("page")))<1 Then
  int_curpage=1
  Else
  Int_curpage=CInt(Trim(request("page")))
  End If 
End Sub

到這里這個類分的功能基本已經(jīng)實現(xiàn)了,只要在調(diào)用這個類的頁面的URL后面加上page=n,它就會顯示第n頁的內(nèi)容了,所以接下去要做的就是創(chuàng)建一個數(shù)據(jù)導(dǎo)航條了,我把它設(shè)計為類似以面的形式
9 3[1] [2] [3] [4] [5] [6] [7] [8] 4 :頁次:1/8頁 共51條記錄 7條/每頁


在頁面里通過調(diào)用ShowPage()的方法顯示出來,ShowPage可以在GetRS以后的任意位置調(diào)用,也可以調(diào)用多次

Public Sub ShowPage()
Dim str_tmp
int_totalRecord=XD_RS.RecordCount
If int_totalRecord<=0 Then
  str_error=str_error & "總記錄數(shù)為零,請輸入數(shù)據(jù)"
  Call ShowError()
End If
If int_totalRecord
  int_TotalPage=1
Else
  If int_totalRecord mod PageSize =0 Then
int_TotalPage = CLng(int_TotalRecord / XD_PageSize * -1)*-1
  Else
int_TotalPage = CLng(int_TotalRecord / XD_PageSize * -1)*-1+1
  End If
End If

If Int_curpage>int_Totalpage Then
  int_curpage=int_TotalPage
End If

'=====================================================
'顯示分頁信息,各個模塊根據(jù)自己要求更改顯求位置
'=====================================================
response.write "
str_tmp=ShowFirstPrv '顯示首頁、前一頁
response.write str_tmp 
str_tmp=showNumBtn '數(shù)字導(dǎo)航
response.write str_tmp
str_tmp=ShowNextLast  '下一頁、末頁
response.write str_tmp
str_tmp=ShowPageInfo
response.write str_tmp
response.write ""
end Sub

到這里類的功能才算完整(為了節(jié)省版面,我有些方法沒有放上去,再下面附上全部完整代碼)寫一個簡單頁面測試一下

 ’把分頁類包含進(jìn)來<%
Set mypage=new xdownpage
mypage.getconn=conn
mypage.getsql="select * from productinfo order by id asc"
mypage.pagesize=7
set rs=mypage.getrs() '得到Recordset
mypage.showpage() '顯示分頁導(dǎo)航條
for i=1 to mypage.pagesize  '下面的使用就和使用一般的recordset沒有什么兩樣了
if not rs.eof then '用來判斷是否到達(dá)最后一條的,一定要加,不然最后一頁分出問題
response.write rs("key") & "
" '在這里就可以按自己的意思顯示代碼了,
rs.movenext
else
exit for
end if
next

效果還不錯,該有的全有了。

分頁過程中,還有一個比軟麻煩的問題是,在帶多個參數(shù)的URL中,如保證在頁面轉(zhuǎn)向的時候不掉失其它參數(shù)。我靠一個GetURL的過程來實現(xiàn),并在生成導(dǎo)航時調(diào)用。

Private Function GetURL()
  Dim strurl,str_url,i,j,search_str,result_url
  search_str="page="
  strurl=Request.ServerVariables("URL")
  Strurl=split(strurl,"/")
  i=UBound(strurl,1)
  str_url=strurl(i)'得到當(dāng)前頁文件名
  str_params=Request.ServerVariables("QUERY_STRING")
  If str_params="" Then
  result_url=str_url & "?page="
  Else
  If InstrRev(str_params,search_str)=0 Then
result_url=str_url & "?" & str_params &"&page="
  Else
j=InstrRev(str_params,search_str)-2
If j=-1 Then
  result_url=str_url & "?page="
Else
  str_params=Left(str_params,j)
  result_url=str_url & "?" & str_params &"&page="
End If
  End If
  End If
  GetURL=result_url
End Function

通過GetURL的處理,可以自動的獲取當(dāng)前面的文件名,和所有帶的參數(shù),實現(xiàn)了頁面轉(zhuǎn)換頁不丟失參數(shù)。
三、后記
通過這個分頁類,解決了每次分頁時需要重復(fù)寫的分頁部分代碼,方便了編程,也使的提高了主要代碼的可讀性。也希望能給大家在編程過程中帶來一點方便,由于本人水平有限,程序和文章中難免有錯,還望大家批評指正。

附全部代碼:

[Ctrl+A 全部選擇 然后拷貝]


最新更新
·數(shù)據(jù)庫被掛馬的ASP處理方法
·ASP快速獲取遠(yuǎn)程文件大小的方
·用ASP屏蔽迅雷和旋風(fēng)下載工具
·解決ASP中傳送中文參數(shù)亂碼的
·ASP+AJAX做類似Google的搜索
·ASP的一個非常棒的Debug類(
·ASP中常用的服務(wù)器檢測源代碼
·優(yōu)化ASP中執(zhí)行SQL效率的五個
·ASP種msxml3.dll 800c0005錯
·掛QQ的ASP版本網(wǎng)頁源代碼
相關(guān)信息
·數(shù)據(jù)庫被掛馬的ASP處理方法
·ASP快速獲取遠(yuǎn)程文件大小的方法
·用ASP屏蔽迅雷和旋風(fēng)下載工具的P2P下載
·解決ASP中傳送中文參數(shù)亂碼的問題
·ASP+AJAX做類似Google的搜索提示
·ASP的一個非常棒的Debug類(VBScript)
·ASP中常用的服務(wù)器檢測源代碼
·優(yōu)化ASP中執(zhí)行SQL效率的五個方法
·ASP種msxml3.dll 800c0005錯誤的另一解決方法
·掛QQ的ASP版本網(wǎng)頁源代碼
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個傳說
丟了幸福的豬
找個人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因為寂寞才想你
愛上你等于愛上了錯
在心里從此永遠(yuǎn)有個你
一個人的寂寞兩個人的錯