느림보 개발
7. SpringMVC - 페이징 처리 본문
Controller
- 찜목록에 대한 요청을 처리하기 위한 컨트롤러를 매핑한다.
- session에 있는 사용자 아이디를 String user_id로 저장하여, 사용자의 찜목록의 개수를 세는 로직을 실행하여 likeListCnt에 저장한다.
- PageMakerVO 객체 생성하여 setVo에 PageVO에 기본 값을 세팅하고, setTotalCnt에 DB에서 얻어온 값을 세팅한다.
- 참조변수 pm을 model객체에 담아 view로 보낸다.
- pm와 user_id를 가지고 likeList 찜목록들을 얻어오는 로직을 실행하여 model 객체에 담아 view로 보낸다.
@RequestMapping(value="/likeListAll", method=RequestMethod.GET)
public void listLikeAllGET(Model model, PageVO vo,HttpSession session) throws Exception {
String user_id = (String)session.getAttribute("user_id");
Integer likeListCnt = service.likeListCnt(vo,user_id);
//페이징 처리 하단부 정보 저장
PageMakerVO pm = new PageMakerVO();
pm.setVo(vo);
pm.setTotalCnt(likeListCnt);
log.info("pmVO :"+pm);
log.info("pageVO :"+vo);
//페이징 처리 객체를 어트리뷰트에 담아 view로 보냄
model.addAttribute("pm", pm);
model.addAttribute("likeList",service.likeList(pm, user_id));
}
Service, Impl
//찜 목록 리스트
public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception;
// 찜 목록 페이징에 필요한 찜목록 글개수
public Integer likeListCnt(PageVO vo, String user_id) throws Exception;
//찜목록
@Override
public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception {
return dao.likeList(pm,user_id);
}
// 찜 목록 페이징에 필요한 찜목록 글개수
@Override
public Integer likeListCnt(PageVO vo, String user_id) throws Exception {
return dao.likeListCnt(vo,user_id);
}
DAO, Impl
//찜 목록
public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception;
//찜 목록 글갯수
public Integer likeListCnt(PageVO vo, String user_id) throws Exception;
//찜목록
@Override
public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("pm", pm);
map.put("user_id", user_id);
return sqlSession.selectList(NAMESPACE+".likeList",map);
}
//찜목록 개수
@Override
public Integer likeListCnt(PageVO vo, String user_id) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("vo", vo);
map.put("user_id", user_id);
return sqlSession.selectOne(NAMESPACE+".likeListCnt",map);
}
mapper
<!-- 찜 내역 띄우기 -->
<select id="likeList" resultType="LikeListVO" >
select p.seller_id, p.prod_name, p.price, l.`check`,p.prod_num
from mfg_products p join mfg_like l
on p.prod_num = l.prod_num
join mfg_member m
on l.buyer_id = m.user_id
where m.user_id=#{user_id}
limit #{pm.startRow},#{pm.vo.perPageNum}
</select>
<!-- 찜한 상품 개수 띄우기 -->
<select id="likeListCnt" resultType="Integer">
select count(*)
from mfg_like
where buyer_id=#{user_id}
</select>
PageVO
- 페이징 처리에 필요한 정보를 관리하는 객체
public class PageVO {
private int page; // 페이지
private int perPageNum; // 페이지 크기
public PageVO() {
// 페이징 처리의 정보가 없을 때(기본값)
this.page = 1;
this.perPageNum = 6;
}
public int getPage() {
return page;
}
public void setPage(int page) {
// 0보다 작은 페이지 정보 호출
if(page <= 0) {
this.page = 1;
return;
}
this.page = page;
}
public int getPerPageNum() {
return perPageNum;
}
public void setPerPageNum(int perPageNum) {
// 한번에 보여줄 글의 수
if(perPageNum < 6 || perPageNum > 100) {
this.perPageNum = 6;
return;
}
this.perPageNum = perPageNum;
}
// mapper의 #{pageStart} 요소를 위한 메서드
public int getPageStart() {
return (this.page - 1) * perPageNum;
}
@Override
public String toString() {
return "PageVO [page=" + page + ", perPageNum=" + perPageNum + ", session=" + session + ", seller_id="
+ seller_id + "]";
}
}
PageMakerVO
- 페이징 처리에 관한 모든 동작 관리( 개수 출력 + 하단 페이징 블럭)
public class PageMakerVO {
private static final Logger log = LoggerFactory.getLogger(PageMakerVO.class);
private int totalCnt; // 총 글의 수
private int startPage; // 페이지 블럭 시작페이지
private int endPage; // 페이지 블럭 끝 페이지
private boolean prev; // 이전
private boolean next; // 다음
// private int page;
// private int perPageNum;
private PageVO vo; // 페이지 번호, 페이지의 크기
private int displayPageNum = 5; // 페이지 블럭의 크기
public int getStartRow() {
return (vo.getPage()-1)*vo.getPerPageNum();
}
public void setVo(PageVO vo) { // 이미생성된 객체 사용
this.vo = vo;
System.out.println(vo);
}
public void setTotalCnt(int totalCnt) {
this.totalCnt = totalCnt; // DB에서 계산된 값으로 초기화
calcData();
}
public void calcData() {
log.info("페이징 처리 필요값 계산하기");
endPage = (int)Math.ceil(vo.getPage()/(double)displayPageNum) * displayPageNum;
startPage = endPage - displayPageNum + 1;
log.info("endPage:"+endPage);
log.info("startPage:"+startPage);
// 모든 글개수 / 페이지 사이즈 => 총 필요한 페이지 수
int tmpEndPage = (int)Math.ceil(totalCnt / (double)vo.getPerPageNum());
if(endPage > tmpEndPage) {
endPage = tmpEndPage;
}
// 이전
prev = (startPage == 1)?false:true;
// 다음
next = ((endPage * vo.getPerPageNum()) >= totalCnt)?false:true;
log.info("페이징 처리 필요값 계산하기 완료");
}
public int getTotalCnt() {
return totalCnt;
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
public boolean isPrev() {
return prev;
}
public void setPrev(boolean prev) {
this.prev = prev;
}
public boolean isNext() {
return next;
}
public void setNext(boolean next) {
this.next = next;
}
public PageVO getVo() {
return vo;
}
public int getDisplayPageNum() {
return displayPageNum;
}
public void setDisplayPageNum(int displayPageNum) {
this.displayPageNum = displayPageNum;
}
@Override
public String toString() {
return "PageMakerVO [totalCnt=" + totalCnt + ", startPage=" + startPage + ", endPage=" + endPage + ", prev="
+ prev + ", next=" + next + ", vo=" + vo + ", displayPageNum=" + displayPageNum + "]" + getStartRow();
}
}
LikeListVO
- 페이지 정보와 사용자 정보를 통해 찜목록을 가져올때 저장하기 위한 객체 생성
public class LikeListVO {
private String seller_id;
private String user_id;
private String prod_name;
private int price;
private int check;
private int prod_num;
public String getSeller_id() {
return seller_id;
}
public void setSeller_id(String seller_id) {
this.seller_id = seller_id;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getProd_name() {
return prod_name;
}
public void setProd_name(String prod_name) {
this.prod_name = prod_name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getCheck() {
return check;
}
public void setCheck(int check) {
this.check = check;
}
public int getProd_num() {
return prod_num;
}
public void setProd_num(int prod_num) {
this.prod_num = prod_num;
}
@Override
public String toString() {
return "LikeListVO [user_id=" + user_id + ", prod_name=" + prod_name + ", price=" + price + ", check=" + check
+ ", prod_num=" + prod_num + "]";
}
}
'코드 정리 > Spring Framework' 카테고리의 다른 글
9. SpringMVC - 게시글 작성 (2) | 2023.01.29 |
---|---|
8. SpringMVC - 나의 위치 정보 저장 (0) | 2023.01.29 |
6. SpringMVC - Ajax 통신을 통해 아이디 중복 체크 하기 (1) | 2023.01.17 |
5. SpringMVC - 찜하기 (2) | 2023.01.13 |
4. Spring MVC - 주변 시설 찾기 (0) | 2023.01.11 |
Comments