게시판 페이징 하는 방법

박종훈·2021년 12월 10일
0
@Controller
public class MemberControllerImpl implements MemberController {
	@Override
	@RequestMapping(value = "membersMG.do", method= {RequestMethod.POST, RequestMethod.GET})
	public ModelAndView memberList(HttpServletRequest request, HttpServletResponse response, ModelAndView mv,
			RedirectAttributes redirect)throws Exception {
		
		String pageNoVal = request.getParameter("pageNo");
        
		int pageNo = 1;
		if(pageNoVal != null) {
			pageNo = Integer.parseInt(pageNoVal);
		}
		MemberListDTO memberListDTO = memberService.membersPage(pageNo);
        	mv.addObject("memberListDTO", memberListDTO);
	}
}

@Service("adMemberService")
public class MemberServiceImpl implements MemberService {
	한페이지 게시글 출력 개수
    private int size = 20; 
    
    게시글 총 개수 조회
    @Override
	public int membersCount() {
		return memberDAO.memberCount();
	}
	
    페이징 및 게시글 조회
	@Override
	public MemberListDTO membersPage(int pageNo) {
		int total = memberDAO.memberCount();
		List<MemberDTO> content = memberDAO.membersPage((pageNo-1)*size, size);
		return new MemberListDTO(total, pageNo, size, content);
	}
}    
@Repository("adMemberDAO")
public class MemberDAOImpl implements MemberDAO {

	게시글 총 개수 조회 
	public int memberCount() {
		int count = sqlSession.selectOne("adMember.membersCount");
		return count;
	}
	
    게시글 페이징처리 및 조회
	public List<MemberDTO> membersPage(int startRow, int size){
		
		Map<String, Integer> map = new HashMap<String, Integer>();
		
		int start = startRow + 1;
		int end = startRow+size;
		map.put("start", start);
		map.put("end", end);
		List<MemberDTO> memberPage = sqlSession.selectList("adMember.membersPage", map);
		
		return memberPage;
	}
}
게시글 총 개수 조회 쿼리문
<select id="membersCount" resultType="int">
	SELECT COUNT(*) FROM members
</select>

페이징 처리 및 개수 조회
<select id="membersPage" parameterType="hashMap" resultType="MemberDTO">
	select * from (
    	select ROWNUM num, A.* from (
        	SELECT * FROM members WHERE MEMBER_ISSHOW='y' and members_kind='일반'
            ORDER BY members_no DESC 
        )A
	)
    where num between #{start} and #{end}
</select>



public class PagingDTO {

	private int total; //전체 게시물 수
	private int currentPage; //현재 페이지
	private List<BoardDTO> content; //특정 범위 게시물 조회 결과
	private int totalPages; //전체 페이지 수
	private int startPage; //시작페이지
	private int endPage; //끝페이지
	
	public PagingDTO() {}
	public PagingDTO(int total, int currentPage, int size, List<BoardDTO> content) {
		this.total = total;
		this.currentPage = currentPage;
		this.content = content;
		if(total==0) {
			this.totalPages = 0;
			this.startPage = 0; 
			this.endPage = 0;
		}else {
			this.totalPages = total/size;
			if(total%size>0) {
				totalPages++;
			}
		int modVal = currentPage%5;
		this.startPage = currentPage/5*5+1;
		if(modVal==0) {
			this.startPage -=5;
		}
		this.endPage = startPage+4;
		if(endPage>totalPages) {this.endPage = totalPages;}
		}
	}
	public int getTotal() {
		return total;
	}
	public boolean hasNoArticles() {
		return total == 0;
	}
	public boolean hasArticles() {
		return total>0;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public List<BoardDTO> getContent() {
		return content;
	}
	public int getTotalPages() {
		return totalPages;
	}
	public int getStartPage() {
		return startPage;
	}
	public int getEndPage() {
		return endPage;
	}
}

	출력 방법 Jstl사용
    <c:forEach items="${memberListDTO.content}" var="member" varStatus="status">
 		~~~
    </c:forEach>
    
    페이지 출력 방법
    <c:if test="${memberListDTO.hasArticles()}">
    	<c:if test="${memberListDTO.startPage>5}">
			<a href="${contextPath}/membersMG.do?pageNo=${memberListDTO.startPage-5}">PREV</a>
		</c:if>
					
		<c:forEach begin="${memberListDTO.startPage}" end="${memberListDTO.endPage}" step="1" var="pNo">
			<a href="${contextPath}/membersMG.do?pageNo=${pNo}">${pNo}</a>
		</c:forEach>
					
		<c:if test="${memberListDTO.endPage<boardListDTO.totalPages}">
			<a href="${contextPath}/membersMG.do?pageNo=${memberListDTO.startPage+5}">NEXT</a>
		</c:if>
    </c:if>

0개의 댓글