👀 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;
}
}
- 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은 혹시모를 이상한 소숫점이 나올 경우를 대비한 안전빵
'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 |