페이징처리를 이해하자


<%

  출처: http://cafe.naver.com/webdeveloper.cafe


  '페이징 처리는 게시판이나 목록부분을 사용자에게 제공할때 꼭 들어가는 부분입니다.

  '하지만 개발자에게 있어서는 잠시 숙고의 시간을 갖게하는 조금 까다로운 부분이기도 합니다.

 

  '그래서 그런지 웹사이트에서 페이징을 치기만 하면 페이징에 대해서 많은시간 숙고하신 머리좋은 분들이

  '개발해논 페이징 함수들이 많이 있습니다. 갖다 쓰면 그만입니다. 그래도 한번쯤은 이해하고 갖다쓰면

  '좋을것 같기에 아주 간단한 예제하나 올립니다. 기존에 웹상에 존재하는 것들보다는 더욱 간단하게 작성

  '해서(?) 성능 이런거는 생각안합니다. 보시면 바로 이해되게 쉽게 작성할려구 노력했습니다.

 

  참고로  닷넷에서는 GridView를 쓰시면 페이징이 옵션선택에 따라서 바로 달립니다.

%>

<style type="text/css">
<!--
a:visited {color:#000000; text-decoration:none }
-->
</style> 
<%

  dim listfile, tblname, pagesize, pageset
 
  listfile = "pagesample.asp"     '페이지가 선택되었을때 리스트를 뿌려줄 화일명입니다. 여기서는 바로 이페이지입니다.
  tblname  = "TEST_TBL"         '테이블명입니다.
  pagesize = 10                     '한 페이지에 뿌려질 글의 갯수입니다.
  pageset  = 10                       '페이지 이동을 위해서 하단에 뿌려줄 페이지의 갯수를 지정합니다.

 

  '현재 페이지를 request.querystring으로 받아옵니다. 너무나 쉬운 구문이므로 넘어갑니다.
  '참고로 request개체에서 컬렉션 생략시 우선순위는 다음과 같습니다
  ' QuertyString > Form > Cookies > ClientCertificate > ServerVariables  <-- !!요놈들이 컬렉션(collection)
  if request("page") = "" then
   page = 1
  else
   page = request("page")
  end if


'db연결부분입니다. 개발자의 취향에 따라서 좀 달라지는 부분입니다.
'지금 보안을 위해서 연결부분을 테스트로 적었으니 자신의 odbc설정에 맞게 직접 구성해 주셔야 합니다.
function dbconnection      
 
 dim dbCon, strConnect  
    strConnect="dsn=test;uid=test;pwd=password;"
 set dbCon = server.Createobject("adodb.connection")
 dbCon.open strConnect  
 set dbConnection = dbCon

end function

set conn = dbConnection


set rs = server.Createobject("ADODB.RECORDSET")  '레코드셋 객체를 생성합니다.
sql = "select Title from " & tblname & " order by no asc"    
rs.pagesize = pagesize 'rs.pagesize에 위에서 선언한 pagesize 갯수를 넣어 실제로 반영되게 합니다.
rs.open sql,conn, 1       '커서타입을 1로 줘서 레코드셋을 오픈합니다. 커서타입과 락타입은 여기서 오렌지님
                                  '이 올린글을 참조하세요.

if not rs.eof then           '레코드가 존재하면


  rs.absolutepage = page     '넘어온 page를 rs.absolutepage에 넣어서 실제로 페이지에 반영되게 합니다.
  pagecount = rs.pagecount '전체 페이지 수를 pagecount에 저장합니다.
                                        'recordcount가 87이고 rs.pagesize를 10으로 지정했으면 페이지는 9페이지가 됩니다.
                                        '10개의 레코드로 구성된 8개의 완전한 페이지와 7개의 레코드로 구성된 1개의 페이지
 
  response.write "전체 페이지 수:" & pagecount & "<br>" '실제로 찍어보면 이해가 빠릅니다.
  i = 1
 
 do until rs.eof or i > rs.pagesize 'record의 끝이거나 i가 pagesize보다 작을때까지 루프를 돕니다
                                  
   response.write rs("title") & "<br>"
   rs.movenext
   i = i + 1
 
 loop


end if

response.write "<br>" '보기좋게 하기 위해서 한칸 띄우고^^


'//-------------------------실제 페이징처리 부분입니다.---------------------------------//

blockpage=int((page-1)/pageset)*pageset+1  '블록페이지입니다. pageset의 기준을 정해줍니다.
                                           '이것도 아래 블록페이지를 찍어주는 부분을 보시면 이해가 빠릅니다.

response.write "블럭페이지는 :" & blockpage & "<br>"


nextpage = true  '이전페이지로 이동하는 링크를 나타낼 변수입니다. default값은 참입니다.
prevpage = true  '다음페이지로 이동하는 링크를 나타낼 변수입니다. default값은 참입니다.

if blockpage - pageset < 0 then  '블록페이지에서 페이지셋을 뺀 값이 0 보다 작으면 이전 페이지가 없는 것입니다.
prevpage = false                       '블록페이지는 찍어 보시면 알겠지만 1, 11, 21 이렇게 페이지셋의 처음 값을
end if                                      '나타냅니다. 페이지셋은 위에 pageset 변수에 값을 정해주기 나름이지만
                                              '[1][2][3][4][5][6][7][8][9][10]과 같이 페이지 이동을 위한 페이지의 값
                                              '을 표시합니다. 블럭페이지가 1이고 페이지셋이 10일때 1 - 10을 빼면 값이 -9
                                              '로 0보다 작습니다. 이때는 이전 페이지가 없는 것입니다.
                                              '블럭페이지가 11이고 페이지셋이 10일때 11 - 10을 빼면 값이 1로 0보다 큽니다.
                                              '이때는 이전페이지가 있는 것입니다.

 

if pagecount - blockpage < pageset then  '다음페이지는 페이지카운트에서 현재의 블록페이지를 뺀값이 페이지셋보다
   pageset = pagecount - blockpage + 1    '크면 다음페이지가 없는 것입니다.
   nextpage = false                                 '페이지카운트는 전체페이지의 갯수입니다.
end if

                                  

if prevpage then  '이전 페이지를 클릭했을때 이동할 페이지를 정의합니다.
prevpage=blockpage-1
response.write "<a href =" & listfile & "?page="&prevpage&"><b>[이전]</b></a>&nbsp;"
end if


'페이지셋을 뿌려주는 부분입니다. 이해를 쉽게 하기 위해서는 for i = 1 to pagecount 까지 뿌려보는 것도 하나의 방법입니다.
for i = blockpage to blockpage + pageset - 1

 if cint(page) = i then
 response.write "<b><font color=red>" &i& "</font></b>"
 else
 response.write "<a href =" & listfile & "?page="&i&">[" & i & "]</a>"
 end if

next


if nextpage then
nextpage=blockpage+pageset
response.write "&nbsp;<a href =" & listfile & "?page="&nextpage&"><b>[다음]</b></a>"
end if

'//--------------------------페이징 끝-----------------------------------------------//

%>

2008/02/21 15:54 2008/02/21 15:54

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다