본문 바로가기
CLASS/SPRING,JSTL

#11-1 / JSTL-paging(back-end)

by hingu 2024. 8. 6.

  👀 back-end에서 처리  

* addAllAttributes :

Object메서드 배여로간련 객체를 차례대로 추가하는 방식

단점 - 2차 배열로 jsp 전달시 문제 발생 (2차배열 인식 불가)

=> 2차배열시 addAll~로 찍지 말고 걍 addtAttribute로 찍으세욤

기타-pg 예제에서 사용함

출력방식 : m.addAllAttributes(Arrays.asList(배열))  =>  ${stringList.get(0)}  or ${stringList[0]}

 

* mergeAttributes 

map과 관련됨

 

- dbinfo.java

public class dbinfo {
	public Connection info() throws Exception {
		String db_driver= "com.mysql.cj.jdbc.Driver";
		String db_url = "jdbc:mysql://localhost:3306/cms";
		String db_user = "hana"; 
		String db_pass = "hana1234";
		
		Class.forName(db_driver);
		Connection con = DriverManager.getConnection(db_url,db_user,db_pass);
		
		return con;
		
	}
}

우리가 핸들링해볼 data => 요렇게 7개

 

- controller.java - @GetMapping("/pay/coupon_list.do")

@Controller
public class pay_controller {
	@GetMapping("/pay/coupon_list.do")
	public String coupon_list(Model m,@RequestParam(value="",required = false) Integer page) throws Exception{
		Connection con = null;
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		ResultSet rs2 = null;
		int pageno = 3; //data 3개씩
		int startpg = 0;
		try {
			//작업순서3. 각 페이지 넘버 별 - 몇번째 data부터 찍을지 정하는 변수
			if(page==null || page==1) { //Integer이어야 null 사용 가능
				startpg = 0;
			}else {
				startpg = (page-1)*pageno;
			}
			m.addAttribute("startpg",startpg); //Model로 찍어줌-가공된page번호

			con = new dbinfo().info();
			
			//작업순서2. data 총 갯수 가져오기
			String count = "select count(*) as ctn from coupon";
			ps = con.prepareStatement(count);
			rs2 = ps.executeQuery();
			rs2.next();
			m.addAttribute("total",rs2.getString("ctn")); //Model로 찍어줌
			
			//작업순서1. 1page당 데이터 두개씩
			String sql ="select * from coupon order by cidx desc limit ?,?";
			ps = con.prepareStatement(sql);
			ps.setInt(1,startpg);
			ps.setInt(2,pageno); //startpg부터 pageno개의 data가 출력됨
			rs = ps.executeQuery();
			
			List<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
			while(rs.next()) {
				ArrayList<String> al = new ArrayList<String>();
				al.add(rs.getString(1));
				al.add(rs.getString(2));
				al.add(rs.getString(3));
				al.add(rs.getString(4));
				al.add(rs.getString(5));
				
				arr.add(al);
			}
			m.addAttribute("all",arr); //Model로 찍어줌
			
		}catch(Exception e) {
			System.out.println(e);
		}finally {
			rs2.close();
			rs.close();
			ps.close();
			con.close();
		}
		
		
		return "/coupon_list";
	}

 

- 처음 진입시는 페이징을 누르지 않았기 때문에 해당 page값은 필수가 아님

   => @RequestParam(value="",required = false) Integer page
        => @RequestParam을 작성하지 않을 시 무조건 값을 받아야하므로 작성해줘야함!!!!

        => int로 받으면 안됨 (null check 불가 , value="" 이기 때문에 Integer로 받는게 안전)

 

 

 

 

 

- coupon_list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="cr" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL 페이징 사용법</title>
</head>


<body>
<p>쿠폰리스트 총 게시물 : ${total}</p>
<table border="1">
	<thead>
		<tr>
			<th>번호</th>
			<th>쿠폰명</th>
			<th>쿠폰 할인율</th>
			<th>사용가능여부</th>
			<th>만료기한</th>
		</tr>
	</thead>
	<tbody>
		<cr:set var="ino" value="${total-startpg}" />
		<cr:forEach var="data" items="${all}" varStatus="idx">
			<tr>
				<td>${ino-idx.index}</td>
				<td>${data.get(1)}</td>
				<td>${data.get(2)}</td>
				<td>${data.get(3)}</td>
				<td>${data.get(4)}</td>
			</tr>
		</cr:forEach>
	</tbody>
</table>

<!-- 페이지 번호 출력 -->
<!-- data7개,한페이지당 3개씩 => 총 3페이지 -->
<table>
	<tr>
		<cr:set var="pg" value="${total/3+(1-((total/3)%1))%1}" />
		<cr:forEach var="no" begin="1" end="${pg}" step="1">
			<td><a href="./coupon_list.do?page=${no}">${no}</a></td>
		</cr:forEach>
	</tr>
</table>

</body>
</html>

 

⭐ paging 출력 반복문의 end값을 해당 숫자로 세팅

${ 총data갯수/출력할data갯수 + ( 1- ( ( 총data갯수/출력할data갯수 ) %1) ) %1 } 

 

=> 마지막 %1은 혹시모를 이상한 소숫점이 나올 경우를 대비한 안전빵

 

 

1
2
3

 

'CLASS > SPRING,JSTL' 카테고리의 다른 글

jstl - I/O 사용시  (0) 2024.08.06
#11-2 / JSTL-paging(font-end)  (0) 2024.08.06
#10-2 / 사용자 정보 찾기  (0) 2024.07.29
#10-1 / 패스워드를 md5형태로 변환  (0) 2024.07.29
#9-3 / Session 등록시 주의사항  (0) 2024.07.28