~.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 : 소수점 아래 버림
<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큰 페이지로 이동. 즉, 다음 행의 시작 페이지번호로 이동하는 것.
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번호와 한 화면에서 보여줄 게시글의 개수를 지정한다