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 + "&nbsp;&nbsp;");

    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>&nbsp;");
    }

    for(int i=startPage; i<=endPage; i++){
      if (i > totalPage){
        break;
      }
 
      if (nowPage == i){
        str.append("<span class='span_box_2'>&nbsp;"+i+"&nbsp;</span>&nbsp;");
      }else{
        str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'><span class='span_box_1'>&nbsp;"+i+"&nbsp;</span></A>&nbsp;");  
      }
    }
    
    _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>&nbsp;");
    }
    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>