package kr.or.ddit;
import java.util.List;
//페이징 처리를 위한 클래스
//게시글 데이터와 페이징 관련 정보를 담고 있음
public class ArticlePage {
//페이징 관련 멤버변수
//전체 글의 행의 수
private int total;
//현재 페이지 번호
private int currentPage;
//전체 페이지 개수
private int totalPages;
//시작 페이지 번호
private int startPage;
//종료 페이지 번호
private int endPage;
//페이징의 개수
private int pagingCount;
//게시글 데이터
private List<LprodVO> content;
//생성자
//size : 한 화면에 보여질 행의 수
public ArticlePage(int total, int currentPage, int size, int pagingCount,
List<LprodVO> content) {
this.total = total;
this.currentPage = currentPage;
this.content = content;
this.pagingCount = pagingCount;
if(total == 0) {//select 결과가 없다면..
totalPages = 0;
startPage = 0;
endPage = 0;
}else { //select 결과가 있을 때..
//전체 페이지 개수 구하기(전체 글의 수 / 한 화면에 보여질 행의 수)
//정수와 정수의 나눗셈의 결과는 정수이므로 13 / 7 => 1
totalPages = total / size;
//보정해줘야 할 경우는? 15 / 7 = 2 경우 처럼 나머자가 0보다 클 때
if(total % size>0) {
//전체 페이지수를 1 증가 처리
totalPages++;
}
//startPage : 이전 [1] [2] [3] [4] [5] 다음 일 때 1을 의미
//공식 : startPage = 현재페이지 / 페이징의 개수 * 페이징의 개수 + 1;
startPage = currentPage / pagingCount * pagingCount + 1;
//보정해줘야 할 경우는? 5 / 5 * 5 + 1 => 6 경우처럼
// 현재페이지 % 5 == 0 일 때
if(currentPage%pagingCount==0) {
//startPage = startPage - 5(페이징의 개수);
startPage -= pagingCount;
}
//endPage : 이전 [1] [2] [3] [4] [5] 다음 일 때 5을 의미
endPage = startPage + (pagingCount-1);
//보정해줘야 할 경우는? endPage 5 > totalPages 3 일 때
// endPage 5를 totalPages 3로 바꿔줘야 함
if(endPage > totalPages) {
endPage = totalPages;
}
}//end outer if
}
//전체 행의 수를 리턴
public int getTotal() {
return this.total;
}
//select결과가 없는가? 체킹 : true면 결과가 없다는 의미
public boolean hasNoArticles() {
return this.total == 0;
}
//select결과가 있는가? 체킹 : true면 결과가 있다는 의미
public boolean hasArticles() {
return this.total > 0;
}
//현재 페이지 번호 리턴
public int getCurrentPage() {
return this.currentPage;
}
//전체 페이지의 개수 리턴
public int getTotalPages() {
return totalPages;
}
//데이터 VO List 리턴
public List<LprodVO> getContent(){
return this.content;
}
//목록 하단의 시작 번호를 리턴
public int getStartPage() {
return this.startPage;
}
//목록 하단의 종료 번호를 리턴
public int getEndPage() {
return this.endPage;
}
}
여기서는 modelAttribute로 "list"를 저장해줬다.(ArticlePage묶음 전체를 list로 저장)
package kr.or.ddit;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@RequestMapping("/lprod")
//모든 요청들이여 나에게 오라
@Controller
public class LprodController {
//logger 패키지
private static final Logger logger =
LoggerFactory.getLogger(LprodController.class);
@Autowired
LprodService lprodService;
//http://localhost:8090/lprod/list?currentPage=1
//defaultValue : 해당 요청 파라미터를 지정하지 않을 경우(http://localhost:8090/lprod/list)
//defaultValue 속성에 지정한 문자열을 값으로 이용하게 됨
@RequestMapping("/list")
public String list(Model model, @RequestParam(defaultValue="1") int currentPage) {
logger.info("currentPage : " + currentPage);
List<LprodVO> list = this.lprodService.list();
logger.info("list.size() : " + list.size());
//상품분류 별 거래처 목록 행의 수
int total = this.lprodService.listCount();
logger.info("total : " + total);
//new ArticlePage(total, currentPage, size, pagingCount, content)
model.addAttribute("list",
new ArticlePage(total, currentPage, 7, 5, list));
model.addAttribute("total", total);
//forward
return "lprod/list";
}
}
1) 검색해서 나온 페이지 전체의 행의 내용
2) 검색해서 나온 페이지 전체의 행의 수
<!-- 검색해서 나온 전체 행 내용 -->
<select id="list" parameterType="hashMap" resultType="cusVO">
SELECT T.RNUM, T.CUS_NUM, T.CUS_NM
, T.ADDR, T.PNE
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY CUS_NUM, CUS_NM) RNUM
, CUS_NUM
, CUS_NM
, ADDR
, PNE
FROM CUS
WHERE 1 = 1
<if test="keyWord!=null and keyWord!=''">
AND (CUS_NM LIKE '%'||#{keyWord}||'%'
OR ADDR LIKE '%'||#{keyWord}||'%'
OR PNE LIKE '%'||#{keyWord}||'%')
</if>
) T
WHERE T.RNUM BETWEEN #{currentPage}*#{size}-(#{size}-1) AND #{currentPage}*#{size}
</select>
<!-- 검색해서 나온 전체 행의 수 -->
<select id="listCount" parameterType="hashMap" resultType="int">
SELECT COUNT(*)
FROM CUS
WHERE 1 = 1
<if test="keyWord!=null and keyWord!=''">
AND (CUS_NM LIKE '%'||#{keyWord}||'%'
OR ADDR LIKE '%'||#{keyWord}||'%'
OR PNE LIKE '%'||#{keyWord}||'%')
</if>
</select>