Project/myweb_JAVA
06. 답변형 게시판 ④ (게시글 리스트 페이징, 게시글 검색)
개발개발빈이
2022. 7. 27. 17:45
○ 페이징 관련 유틸리티 : Paging.java
- 학원에서 제공한 페이징 관련 소스코드
package net.utility;
public class Paging {
/**
* SPAN태그를 이용한 박스 모델의 지원, 1 페이지부터 시작
* 현재 페이지: 11 / 22 [이전] 11 12 13 14 15 16 17 18 19 20 [다음]
*
* @param totalRecord 전체 레코드수
* @param nowPage 현재 페이지
* @param recordPerPage 페이지당 레코드 수
* @return
*/
public String paging2(int totalRecord, int nowPage, int recordPerPage, String col, String word, String filenm){
int pagePerBlock = 10; // 블럭당 페이지 수
int totalPage = (int)(Math.ceil((double)totalRecord/recordPerPage)); // 전체 페이지
int totalGrp = (int)(Math.ceil((double)totalPage/pagePerBlock));// 전체 그룹
int nowGrp = (int)(Math.ceil((double)nowPage/pagePerBlock)); // 현재 그룹
int startPage = ((nowGrp - 1) * pagePerBlock) + 1; // 특정 그룹의 페이지 목록 시작
int endPage = (nowGrp * pagePerBlock); // 특정 그룹의 페이지 목록 종료
StringBuffer str = new StringBuffer();
str.append("<style>");
str.append(" #paging {text-align: center; margin-top: 5px; font-size: 1em;}");
str.append(" #paging A:link {text-decoration:none; color:black; font-size: 1em;}");
str.append(" #paging A:hover{text-decoration:none; background-color: #CCCCCC; color:black; font-size: 1em;}");
str.append(" #paging A:visited {text-decoration:none;color:black; font-size: 1em;}");
str.append(" .span_box_1{");
str.append(" font-size: 1em;");
str.append(" border: 1px;");
str.append(" border-style: solid;");
str.append(" border-color: #cccccc;");
str.append(" padding:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" margin:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" }");
str.append(" .span_box_2{");
str.append(" background-color: #CCCCCC;");
str.append(" font-size: 1em;");
str.append(" border: 1px;");
str.append(" border-style: solid;");
str.append(" border-color: #cccccc;");
str.append(" padding:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" margin:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" }");
str.append("</style>");
str.append("<DIV id='paging'>");
//str.append("현재 페이지: " + nowPage + " / " + totalPage + " ");
int _nowPage = (nowGrp-1) * pagePerBlock; // 10개 이전 페이지로 이동
if (nowGrp >= 2){
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'><span class='span_box_1'>이전</span></A> ");
}
for(int i=startPage; i<=endPage; i++){
if (i > totalPage){
break;
}
if (nowPage == i){
str.append("<span class='span_box_2'> "+i+" </span> ");
}else{
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'><span class='span_box_1'> "+i+" </span></A> ");
}
}
_nowPage = (nowGrp * pagePerBlock)+1; // 10개 다음 페이지로 이동
if (nowGrp < totalGrp){
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'><span class='span_box_1'>다음</span></A> ");
}
str.append("</DIV>");
return str.toString();
}
}//class end
○ DAO : BbsDAO.java
① 리스트 불러오기
- 페이지당 출력할 레코드 갯수 (10개를 기준)
1 page : WHERE r>=1 AND r<=10
2 page : WHERE r>=11 AND r<=20
3 page : WHERE r>=21 AND r<=30
public ArrayList<BbsDTO> list(String col, String word, int nowPage, int recordPerPage){
ArrayList<BbsDTO> list=null;
int startRow = ((nowPage-1) * recordPerPage) + 1 ;
int endRow = nowPage * recordPerPage;
try{
con=dbopen.getConnection();
sql=new StringBuilder();
word = word.trim(); //검색어의 좌우 공백 제거
if(word.length()==0) { //검색을 하지 않는 경우
sql.append(" SELECT bbsno,subject,wname,readcnt,indent,regdt, r");
sql.append(" FROM( SELECT bbsno,subject,wname,readcnt,indent,regdt, rownum as r");
sql.append(" FROM ( SELECT bbsno,subject,wname,readcnt,indent,regdt");
sql.append(" FROM tb_bbs");
sql.append(" ORDER BY grpno DESC, ansnum ASC");
sql.append(" )");
sql.append(" )");
sql.append(" WHERE r>=" + startRow + " AND r<=" + endRow) ;
} else {
//검색을 하는 경우
sql.append(" SELECT bbsno,subject,wname,readcnt,indent,regdt, r");
sql.append(" FROM( SELECT bbsno,subject,wname,readcnt,indent,regdt, rownum as r");
sql.append(" FROM ( SELECT bbsno,subject,wname,readcnt,indent,regdt");
sql.append(" FROM tb_bbs");
String search="";
if(col.equals("subject")) {
search += " WHERE subject LIKE '%" + word + "%' ";
}else if(col.equals("content")) {
search += " WHERE content LIKE '%" + word + "%' ";
}else if(col.equals("subject_content")) {
search += " WHERE subject LIKE '%" + word + "%' ";
search += " OR content LIKE '%" + word + "%' ";
}else if(col.equals("wname")) {
search += " WHERE wname LIKE '%" + word + "%' ";
}//if end
sql.append(search);
sql.append(" ORDER BY grpno DESC, ansnum ASC");
sql.append(" )");
sql.append(" )");
sql.append(" WHERE r>=" + startRow + " AND r<=" + endRow) ;
}//if end
pstmt=con.prepareStatement(sql.toString());
rs=pstmt.executeQuery();
if(rs.next()){
list=new ArrayList<>();
do{
BbsDTO dto=new BbsDTO();
dto.setBbsno(rs.getInt("bbsno"));
dto.setSubject(rs.getString("subject"));
dto.setWname(rs.getString("wname"));
dto.setReadcnt(rs.getInt("readcnt"));
dto.setRegdt(rs.getString("regdt"));
dto.setIndent(rs.getInt("indent"));
list.add(dto);
}while(rs.next());
}//if end
}catch(Exception e) {
System.out.println("목록 페이징 실패: "+e);
}finally {
DBclose.close(con, pstmt, rs);
}
return list;
}//list3() end
② 검색 결과에 맞는 글 개수 가져오기
public int count(String col, String word) {
int cnt=0;
try {
con=dbopen.getConnection();//DB연결
sql=new StringBuilder();
sql.append(" SELECT COUNT(*) AS cnt ");
sql.append(" FROM tb_bbs ");
if(word.length()>=1) {
String search="";
if(col.equals("subject_content")) {
search+=" WHERE subject LIKE '%" + word + "%' ";
search+=" OR content LIKE '%" + word + "%'";
}else if(col.equals("subject")) {
search+=" WHERE subject LIKE '%" + word + "%' ";
}else if(col.equals("content")) {
search+=" WHERE content LIKE '%" + word + "%'";
}else if(col.equals("wname")) {
search+=" WHERE wname LIKE '%" + word + "%'";
}//if end
sql.append(search);
}//if end
pstmt = con.prepareStatement(sql.toString());
rs = pstmt.executeQuery();
if(rs.next()) {
cnt=rs.getInt("cnt");
}//if end
} catch (Exception e) {
System.out.println("글개수 불러오기 실패: " + e);
}finally{
DBclose.close(con, pstmt, rs);
}//try end
return cnt;
}//count() end
○ 뷰단
① 공통코드 : ssi.jsp
- 검색과 페이징 관련 소스 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- ssi.jsp 공통코드 --%>
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="net.utility.*" %>
<%@ page import="net.bbs.*" %>
<jsp:useBean id="dao" class="net.bbs.BbsDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.bbs.BbsDTO" scope="page"></jsp:useBean>
<% request.setCharacterEncoding("UTF-8"); %>
<%
//검색
String word=request.getParameter("word"); //검색어(keyword)
String col=request.getParameter("col"); //검색칼럼(keyfield)
word=Utility.checkNull(word); //문자열 값이 null이면 빈문자열로 치환
col=Utility.checkNull(col); //문자열 값이 null이면 빈문자열로 치환
//현재 페이지
int nowPage=1;
if(request.getParameter("nowPage")!=null){
nowPage=Integer.parseInt(request.getParameter("nowPage"));
}//if end
%>
② 게시글 목록 : bbsList.jsp
<%@page import="net.utility.Utility"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsList.jsp -->
<div class="container-fluid text-center">
<h3> 글 목 록</h3>
<p><a href="bbsForm.jsp">[글쓰기]</a></p>
<table id="bbslist" class="table table-hover">
<thead>
<tr class="active">
<th class="title">글제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<%
//한페이지당 출력한 행의 개수
int recordPerPage=10;
ArrayList<BbsDTO> list = dao.list(col, word, nowPage, recordPerPage);
if(list==null){
out.println("<tr>");
out.println(" <td colspan='4'>자료없음</td>");
out.println("</tr>");
}else{
for(int i=0; i<list.size(); i++){
dto=list.get(i);//한줄 가져오기
%>
<tr>
<td style="text-align: left;">
<%
//답변이미지 출력
for(int j=1; j<=dto.getIndent(); j++){
out.println("<img src='../images/reply.gif'>");
}//for end
%>
<!-- 제목에 상세보기 이동 링크-->
<a href='bbsRead.jsp?bbsno=<%=dto.getBbsno()%>'><%=dto.getSubject()%></a>
<%
//조회수가 10이상이면 hot이미지 출력
if(dto.getReadcnt()>=10){
out.println("<img src='../images/hot.gif'>");
}//if end
String today=Utility.getDate();
String regdt=dto.getRegdt().substring(0,10);
//오늘 작성한 글제목 뒤에 new이미지 출력
if(regdt.equals(today)){//작성일과 오늘 날짜와 같다면
out.println("<img src='../images/new.gif'>");
}//if end
%>
</td>
<td><%=dto.getWname()%></td>
<td><%=dto.getRegdt().substring(0,10)%></td>
<td><%=dto.getReadcnt()%></td>
</tr>
<%
}//for end
%>
<!-- 페이지 리스트 -->
<tr>
<td colspan='4' style='text-align:center; height:50px'>
<%
String paging=new Paging().paging2(totalRecord, nowPage, recordPerPage, col, word, "bbsList.jsp");
out.print(paging);
%>
</td>
</tr>
<!-- 검색시작 -->
<tr>
<td colspan='4' style='text-align:center; height:50px'>
<form action="bbsList.jsp">
<select name="col">
<option value="subject_content">제목+내용
<option value="subject">제목
<option value="content">내용
<option value="wname">작성자
</select>
<input type="text" name="word" id="word">
<input type="submit" value="검색" class="bbsBtn">
</form>
</td>
</tr>
<!-- 검색끝 -->
<%
}//if end
%>
</tbody>
</table>
</div>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>
② 게시글 상세보기 : bbsRead.jsp
- 글목록으로 가기 링크 수정
<a href="bbsList.jsp?col=<%=col%>&word=<%=word%>">[글목록]</a>