[21.10.06] 게시판 연습#2

yed·2021년 10월 6일
0

~.do는 예전방식의 경로설정이다 꼭 안써도됨!


    <tbody>
      <c:forEach var="vo" items="${list }">
        <tr>
          <td>${vo.bno }</td>
          <td><a href="detail.do?bno=${vo.bno }">${vo.title }</a></td>
          <td>${vo.userid }</td>
          <td>${vo.cdate }</td>
        </tr>
      </c:forEach>
    </tbody>

게시판에서 특정 글을 클릭하면 해당 게시글의 내용을 볼 수 있는 페이지로 이동해야한다
그래서 제목에 링크를 연결하기

db의 데이터를 사용자에게 보여주기만 하면 되기때문에 get방식을 사용하면된다

PrintWriter out=response.getWriter();
int bno=0;
try {
	bno=Integer.parseInt(request.getParameter("bno"));			
} catch (Exception e) {
		out.print("<head>"+"<meta charset='UTF-8'"+"</head>");
		out.print("<script>alert('잘못된 접근입니다');</script>");
		out.print("<script>location.href='"+MAIN+EXTENSION+"';</script>");
}
BoardVO vo=dao.select(bno);
		
if(vo!=null) {
	String path=BOARD_URL+DETAIL+EXTENSION;
	RequestDispatcher dispatcher=request.getRequestDispatcher(path);
	request.setAttribute("vo", vo);
	dispatcher.forward(request, response);
}else {
	out.print("<head>"+"<meta charset='UTF-8'"+"</head>");
	out.print("<script>alert('존재하지 않는 게시글입니다.');</script>");
	out.print("<script>location.href='"+MAIN+EXTENSION+"';</script>");
}

  <div>
    <a href="index.jsp"><input type="button" value="글 목록"></a>
    <a href="update.do?bno=${vo.bno }"><input type="button" value="글 수정"></a>
    <a href="delete.do?bno=${vo.bno }"><input type="button" value="글 삭제"></a>
  </div>

수정과 삭제는 글번호가 필요하기 때문에 get방식으로 서버로 글번호 넘겨주기


페이징처리

select b.bno, b.title, b.content, b.userid, b.cdate
from (
    select rownum rn, a.*
    from(
        select * from board order by bno desc
    )a
)b
where rn between ? and ?;

이전에 다뤘던 쿼리를 이용할 것! 여기서 입력받을 데이터는 글이 몇개가 표시되는지 rownum의 시작 번호와 끝 번호만 있으면 된다

public void setPageData() {
	int totalLinkNo = (int) Math.ceil((double) totalCount / criteria.getNumsPerPage());
	int temp = (int) Math.ceil((double) criteria.getPage() / numsOfPageLinks) * numsOfPageLinks;
		
	if (temp > totalLinkNo) {
		endPageNo = totalLinkNo;
	} else {
		endPageNo = temp;
	}
		
	startPageNo = ((endPageNo - 1) / numsOfPageLinks) * numsOfPageLinks + 1;
		
	if (startPageNo == 1) {
		hasPrev = false;
	} else {
		hasPrev = true;
	}
		
	if (endPageNo * criteria.getNumsPerPage() >= totalCount) {
		hasNext = false;
	} else {
		hasNext = true;
	}	
}
  • 페이지의 끝번호, 시작번호, 전체 게시글 번호, 페이지네이션(이전/다음) 활성화 설정하기

  • 전체 게시글 수는 count(*) 쿼리 사용해서 가져오기.

Math.ceil : 소수점이 존재하면 올림
Math.floor : 소수점 아래 버림

<list.jsp>

  <ul>
    <c:if test="${pageMaker.hasPrev }">
      <li><a href="list.do?page=${pageMaker.startPageNo-1 }">이전</a></li>
    </c:if>
    <c:forEach begin="${pageMaker.startPageNo }" end="${pageMaker.endPageNo }" var="num">
      <li><a href="list.do?page=${num }">${num }</a></li>
    </c:forEach>
    <c:if test="${pageMaker.hasNext }">
      <li><a href="list.do?page=${pageMaker.endPageNo+1 }">다음</a></li>
    </c:if>
  </ul>
  • 설정한 rownum의 시작번호와 끝번호만큼 한행에 표시된다.

  • hasPrev, hasNext는 현재 한 행에 표시되는 페이지번호 이외의 이전과 다음번호가 있는지 없는지를 나타내는 변수다

  • 만약 이전 페이지 번호가 존재하면 현재 행에서 시작하는 페이지번호보다 1작은 페이지로 이동. 즉, 이전 행의 끝 페이지번호로 이동

  • 다음 페이지 번호가 존재하면 현재 행의 마지막 페이지번호보다 1큰 페이지로 이동. 즉, 다음 행의 시작 페이지번호로 이동하는 것.

<list.do>

String page=request.getParameter("page");
PageCriteria criteria=new PageCriteria();
		
if(page!=null) {
	criteria.setPage(Integer.parseInt(page));
}
List<BoardVO> list=dao.select(criteria);
String path=BOARD_URL+LIST+EXTENSION;
		
RequestDispatcher dispatcher=request.getRequestDispatcher(path);
request.setAttribute("list", list);

//페이지 링크 번호에 대한 정보를 구성해 list.jsp로 보내기
PageMaker pageMaker=new PageMaker();
pageMaker.setCriteria(criteria); //시작페이지 및 한 페이지 당 게시글 정보 저장
		
int totalCount=dao.getTotalNums(); //전체 게시글 정보 
pageMaker.setTotalCount(totalCount); 
		
pageMaker.setPageData(); //저장된 데이터로 page링크 데이터 생성하기
System.out.println("전체 게시글 수 : "+pageMaker.getTotalCount());
System.out.println("현재 선택된 페이지 : "+c.getPage());
System.out.println("한 페이지당 게시글 수 : "+c.getNumsPerPage());
System.out.println("페이지링크 번호 개수 : "+pageMaker.getNumsOfPageLinks());
System.out.println("시작 페이지 링크 번호 : "+pageMaker.getStartPageNo());
System.out.println("끝 페이지 링크 번호 : "+pageMaker.getEndPageNo());
System.out.println("이전 버튼 존재 유무 : "+pageMaker.isHasPrev());
System.out.println("다음 버튼 존재 유무 : "+pageMaker.isHasNext());
		
request.setAttribute("pageMaker", pageMaker);
dispatcher.forward(request, response);
  • 현재 화면에서 보여줄 게시글과 페이징처리를 구성해서 list.jsp로 전송하기

  • criteria는 현재 page번호와 한 화면에서 보여줄 게시글의 개수를 지정한다

profile
6개월 국비과정 기록하기

0개의 댓글