JSP 게시판(방명록) 만들기 (페이징 기법)
처음 게시판을 만들 때 가장 어려워하는 부분이 페이지 나누기와 답변달기입니다.
논리적인 사고가 필요로 되는 부분이죠.
아마도 수학에 소질이 있다면 더욱 좋을까요?
참고로 전 고등학교때 수학은 포기한 녀석이랍니다...^^
이번에 설명할 부분은 페이징인데요....
페이징이라함은 게시판에서 번호링크 찍으면 몇 번째 페이지로 가고, '다음'버튼 누르면 다음 페이지로 가고
그런걸 구현하는 기술을 말합니다.
예를 들면 아래 그림에서 '<<이전', '다음>>' 링크가 그것에 해당합니다.
그런데 사실 거창하게 말하니까 페이징이지.., 뭐 꼭 어떻게 구현해야 한다하고 정해진 법은 없습니다.
걍 자기가 구현하기 편한대로 구현하면 됩니다.
로직이란게 그런거죠 뭐......우히^^;
이번 강좌에서는 간단하게 이전,다음 버튼을 만드는 페이징을 구현해 보도록 하겠습니다.
지금은 한 페이지에 10개씩 글을 출력한다는 가정하에 만들도록 하지요.
그럴려면 먼저, DB에서 가져올 때 값을 10개 단위로 가져오도록 하면 되겠지요.
JSP소스상에서 DB에서 값을 가져오는 SELECT문장은 이렇습니다.
SELECT b_id,b_name,b_mail,b_title,b_content,date_format(b_date,'%Y-%m-%e'),b_view,b_pwd
FROM khboard
WHERE b_id >= "+fr+" and b_id <= "+lr+" order by b_id desc
fr은 값을 가져올 첫 번째 로우, 즉 첫 번째 줄의 글번호를 말하고,
lr은 첫 번째 로우보다 글번호가 9가 큰 로우의 글번호입니다.
' 9?? 왜 10개를 가져오는데 9가 커야하는 거지? '
라고 생각하실지 모르지만 이게 맞습니다.
현재 <= 기호와 >= 기호를 썼기 때문에, 만약 fr이 1이면 lr은 그것보다 9가 큰 10이 되고,
따라서 1보다 크거나 같고, 10보다 작거나 같은 값을 가져옵니다.
그러면 1,2,3,4,5,6,7,8,9,10 이렇게 10개의 글을 가져오겠지요.
또한 order by b_id desc는 이전에도 설명했었지만, 글번호가 큰 로우부터 출력하도록 하는 키워드입니다.
이제는 저 fr과 lr에 어떤 값을 넣느냐에 따라 글을 몇 번째에서 몇 개를 가져오느냐가 정해지는 것입니다.
일반적으로 페이징을 구현할 때, 그 전에 미리 뽑아내야하는 값들이 있습니다.
세가지가 있는데, 그것은
1. 글의 총갯수
2. 페이지의 총갯수
3. 마지막 페이지의 글갯수
입니다.
먼저 글의 총갯수라 함은 말그대로 게시물의 총갯수를 말합니다. 37개의 게시물이 있다면 37이 되겠지요.
그리고 페이지의 총갯수라함은 역시 말그대로 페이지의 갯수를 말합니다.
37개의 게시물이 있고 10페이지씩 출력한다면 총 4개의 페이지가 나오겠지요.
(일단 오늘은 페이지의 총갯수는 없어도 됩니다....)
그리고 '마지막 페이지의 글갯수'라함은 10페이지씩 출력했을 때 마지막 페이지의 글갯수를 말합니다.
37개의 게시물의 경우라면 마지막 페이지는 37을 10으로 나눈 나머지 값인 7개의 게시물이 나올 것입니다.
우리는 먼저 이 세가지 값을 구하기 위해 소스의 위에서 SELECT문을 통해 값을 추출합니다.
Statement stmt0= Conn.createStatement();
ResultSet rs0=stmt0.executeQuery("select max(b_id) from khboard");
if(rs0.next()) {
int datacount=rs0.getInt(1); //총 글 수
int pagecount=datacount/10; //총 페이지수
int remcount=datacount%10; //마지막 페이지글수
}
이렇게 세가지 값을 구해놓고나면 우리는 그것을 가지고 짜맞추는 작업을 해나가는 겁니다.
그럼 이제 하나 하나 구현을 해보도록 하지요.
전체적인 구성을 미리 다 생각해놓고 짜려면 머리만 복잡해지니까
일단 처음으로 출력되는 화면은 어떻게 보여야 하는지부터 생각해봅시다.
맨 처음 list.jsp를 화면에 출력할 때는 마지막에 입력된 글들 10개가 출력이 되어야 합니다.
만약 글이 37개가 있다면, 가장 최근글이 위로 올라오니까 글번호가 28에서 37까지인 게시물을 출력해야하고,
따라서 list.jsp로 이동할 때 아무값도 안가지고 넘어가면 fr은 28이되고 lr은 37이 됩니다.
fr=datacount-9; // 총글갯수에서 9를 뺀값
lr=datacount; // 총글갯수
fr이나 lr에 글번호값이 들어있는 경우에는
fr=Integer.parseInt(request.getParameter("fr"));
lr=Integer.parseInt(request.getParameter("lr"));
이렇게 넘어온 값을 넣으면 되구요.
이때 만약 총 글의 갯수가 10보다 작으면 lr은 마지막 페이지의 글 수가 됩니다.
if (datacount < 10) {
fr=1;
lr=remcount;
}
전에도 설명했었지만 전송될 때는 문자타입으로 전송되기 때문에 Integer.parseInt를 이용하여
정수형으로 바꾸었습니다.
이제 값을 받았으니 SELECT문장을 실행시키도록 합니다.
Statement stmt = Conn.createStatement();
ResultSet rs = stmt.executeQuery("select b_id,b_name,b_mail,b_title,b_content,date_format(b_date,'%Y-%m-%e'),b_view,b_pwd from khboard where b_id >= "+fr+" and b_id <= "+lr+" order by b_id desc");
이 문장을 실행함으로써
fr과 lr에 아무값도 안넘어왔을 때는 마지막 10개의 게시물을 출력하고,
값이 넘어왔을 때는 fr에서 lr까지의 게시물을 출력하게되는 겁니다.
이로써 기본적인 출력 구성이 끝났습니다.
이제는 저 fr과 lr에 적당한 값이 들어가도록 코딩하는 부분이 남은겁니다.
SELECT문을 통해서 화면에 게시물을 뿌린 후에는 게시물 밑에 <<이전, 다음>> 버튼이 생깁니다.
그걸 코딩해봅시다...
이전 버튼의 링크는 이렇게 걸립니다.
<<이전
여기서 bfr과 blr이 fr과 lr에 들어갈 번호입니다.
이전 버튼을 누르게 되면 우리는 현재 출력된 게시물중에 가장 큰 글번호보다 '1'이 큰 글번호부터
출력을 하게됩니다.
다시말해 현재 페이지가 글번호 21에서 30번까지 10개 출력되었다면 그 이전버튼을 눌렀을 때는
31에서 40번까지 출력하게되는 것입니다.
그러므로 bfr=lr+1이 되고 blr=bfr+9가 됩니다.
bfr=lr+1;
blr=bfr+9;
그런데 blr이 글의 총갯수보다 크면 안됩니다. 왜냐하면 아무리 많이 출력하고 싶어도 글의 총갯수를
넘어설 수는 없기 때문입니다. 그래서 bfr이 글의 총갯수보다 크면 bfr은 글의 총갯수라는 코딩을 합니다.
if(blr > datacount) blr=datacount;
그러면 지금까지의 코딩으로 '<<이전' 버튼은 이렇게 됩니다.
bfr=lr+1;
blr=bfr+9;
if(blr > datacount) blr=datacount;
out.println("
<<이전 ");
그런데 만약 이전 버튼을 계속눌러서 마지막까지 가게되면 그때는 '<<이전'버튼에 링크가 있을 필요가
없습니다. 더 이상 이전으로 갈 수 없기때문이죠.
그래서 코딩을 더 추가하여 이렇게 만듭니다.
if(lr==datacount) {
out.println("<<이전");
} else {
bfr=lr+1;
blr=bfr+9;
if(blr > datacount) blr=datacount;
out.println("
<<이전 ");
}
이렇게함으로써 여러분은 '<<이전'버튼을 완성하였습니다.
그럼 이제 '다음>>'버튼을 만들어보도록 하지요.
일단 다음버튼은 이렇게 생겼습니다.
다음>>
여기서는 nfr과 nlr이 fr과 lr에 들어갈 번호입니다.
만약 현재 게시물이 21에서 30번까지 출력되어있다면, 다음버튼을 클릭하면 11에서 20번까지의 게시물이
출력되어야합니다.
따라서 다음버튼을 눌렀을 때 fr값은 현재 fr값 21에서 10을 뺀값입니다.
nfr=fr-10;
nlr=nfr+9;
그런데 fr이 10보다 작은 수였다면 nfr은 음수(마이너스)가 되어버립니다.
그래서 다음 코딩을 추가합니다.
if(nfr < 1) nfr=1;
그러면 지금까지의 코딩으로 다음버튼은 이렇게 됩니다.
nfr=fr-10;
nlr=nfr+9;
if(nfr < 1) nfr=1;
out.println("
다음>>");
그런데 다음버튼을 계속눌러서 글의 처음까지 가게되면 더 이상 다음버튼이 있을 필요가 없습니다.
그래서 코딩을 추가하여 이렇게 만듭니다.
if(fr==1) {
out.println("다음>>");
} else {
nfr=fr-10;
nlr=nfr+9;
if(nfr < 1) nfr=1;
out.println("
다음>>");
}
이렇게 하면 '다음>>'버튼도 완성이 되었습니다.
드디어~~ 게시판에대한 기본적인 기능이 모두 완성이 되었습니다!
쓰다보니 어느새 완성이 되었네요.....(대단한 kimho...키득..^^;)
이제는 어디가서 ' 나는 JSP 프로그래머다 ' 라고 말해도 손색이 없습니다..^^;
보다 완전한 형태의 게시판을 원하신다면 페이지번호와 답변형의 구현이 추가되어야 할 것입니다.
하지만 방명록 레벨의 게시판이라면 이 정도로도 그럴싸한 방명록을 만들 수 있습니다.
어쨌든 보다 추가되는 기능에대해서도 앞으로 더 강좌를 써볼 생각입니다.
그럼 지금까지의 코딩을 직접 해보시구요, 안되시거나 질문사항은 게시판에 남겨주시기 바랍니다.
그럼 즐제이에스피 하세요~~~^o^
Writen by kimho.
Powered by www.kimho.pe.kr
[출처] JSP 게시판 페이징 기법|작성자 hyetaek