본문 바로가기
CLASS/SPRINGBOOT

#9-1 / JPA 5 - 회원가입 list paging

by hingu 2024. 8. 27.

Apache Commons FileUpload » 1.5
Apache Commons Net 3.6

com.squareup.okhttp3  얜 버전 빼고

=> pom.xml에 추가

 

 

🤷‍♂️❓ paging 반복분 사용시

<!-- Controller에서 요렇게 찍어줬을 때 -->
int ea=10;
m.addAttribute("ea",ea); 

<li class="page-item" th:each="num : ${#numbers.sequence(1,ea)}">
	<a href="#" class="page-link">[[${num}]]</a>
</li>
=> 잘돌아감

<!-- th:each는 넘어온 값이 배열이어야만 돌아감 -->
<li class="page-item" th:each="num : ${ea}">
    <a href="#" class="page-link">1</a>
</li>
=> 이건 안돌아감

#numbers

숫자 포맷을 적용할때 사용함

소수점,정수,통화형식,퍼센트

 

sequence 

숫자 범위를 설정  (시작값,종료값,step)

 

※ Controller에서 숫자값을 addAttribute 로 설정하더라도  , th:each로는 반복문이 작동하지 X

    => th:each 근본 반복문은 배열(클래스,원시) 기준 

         단, #numbers.sequence를 이요시 강제로 반복문 활성화 시킬 수 있음

 

🤷‍♂️❓ thymeleaf 소숫점 활성화

<div th:each="n : ${T(java.lang.Math).ceil(ea/4)}">[[${n}]]</div>

 

 

  👀 list + search +paging   ..

- Controller  

 

list 수정

//thymeleaf로 list 출력 (jpa)
@GetMapping("/checkout/member_list")
public String member_list(Model m, 
        @RequestParam(value="",required = false) String search_id, 
        @RequestParam(value="",required = false) String search_part,
        @RequestParam(value="",required = false) Integer pageno
        ) {
    //DB에 있는 전체 데이터를 DAO를 이용하여 thymeleaf로
    List<jpa_dao> all = null;

    //page번호를 node번호로 변경
    Integer pgn = 0;
    if(pageno == null) {
        pageno=1;
        pgn = 0;
    }else if(pageno>0) {
        pgn = pageno-1;
    }
    m.addAttribute("pageno",pageno);

    //전체 data갯수를 파악하기 위함 (paging)
    List<jpa_dao> alldata = wr.findByOrderByUidxDesc();
    int dataea = alldata.size(); //전체회원 수
    int pg = (int)Math.ceil((double)dataea/2);
    System.out.println(pg + "여기");
    m.addAttribute("pg",pg);

    //DB에 있는 전체 데이터를 DAO를 이용하여 thymeleaf로 값 전달
    if(search_part==null&&search_id==null) { //검색이 없을 경우
        PageRequest limit = PageRequest.of(pgn, 2);  //(node,출력갯수)
        all=wr.findAllByOrderByUidxDesc(limit);			
    } else { 
        //검색에 대한 데이터를 DTO에 setter로 담아서 thymeleaf로 데이터 전달
        if(search_part.equals("nm")) {
            all=wr.findByUnameLikeOrderByUidxDesc("%"+search_id+"%");
        } else if(search_part.equals("id")) {
            all=wr.findByUidLikeOrderByUidxDesc("%"+search_id+"%");
        } else {
            //연락처로 사용자를 검색시 utel like "%검색어%"
            all=wr.findByUtelLikeOrderByUidxDesc("%"+search_id+"%");
        }
    }

    m.addAttribute("ea" , dataea);
    m.addAttribute("search_part", search_part);
    m.addAttribute("search_id", search_id);
    m.addAttribute("all",all);


    return "/checkout/member_list.html";
}

PageRequest 

jpa에서는 limit이 없음 => 배열 그룹형태 분할해서 data 출력

PageRequest limit = PageRequest.of(0, 2); //(node,출력갯수)

 

- web_repo.java (interface) 

public interface web_repo extends JpaRepository<jpa_dao, Integer>{
	@Query("select now()")
	String mysql_times();
	
	//아이디 체크 메소드
	Optional<jpa_dao> findByUid(String uid); //findBy~ : 검색(== select)
	
	//list 출력 메소드
	List<jpa_dao> findAll(); //그냥 전체출력
	List<jpa_dao> findByOrderByUidxDesc(); //== odrder by uidx desc
	List<jpa_dao> findAllByOrderByUidxDesc(PageRequest limit); // 요거 추가
	
	List<jpa_dao> findByUidx(int uidx);//한 개의 정보만 출력
	List<jpa_dao> findByUnameLikeOrderByUidxDesc(String search_id);	//이름으로 검색 Like
	List<jpa_dao> findByUidLikeOrderByUidxDesc(String search_id);//아이디로 검색 Like
	List<jpa_dao> findByUtelLikeOrderByUidxDesc(String search_id);//연락처로 검색 Like
	
	
}

 

- member_lit.html 

<body>
	<div class=container>
		<br>
		<p>회원 전체 리스트 : 가입자수 ( <span th:text="${ea}"></span> 명 )</p>
		
		<form id="search_frm" method="get" action="./member_list">
			<select name="search_part">
				<option value="nm">이름</option>
				<option value="id">아이디</option>
				<option>연락처</option>
			</select>
			<div class="row" style="padding-left : 20px;">
				<input type="text" class="form-control" style="width:150px;" name="search_id">
				<input type="submit" value="검색" class="btn btn-dark">
			</div>
		</form>
		
		<table class="table table-hover">
		  <thead>
		    <tr style="text-align : center;">
		      <th scope="col">번호</th>
		      <th scope="col">아이디</th>
		      <th scope="col">이름</th>
		      <th scope="col">이메일</th>
		      <th scope="col">연락처</th>
		      <th scope="col">수정/삭제</th>
		    </tr>
		  </thead>
		  <tbody>
		    <tr style="text-align : center;" th:each="info : ${all}">
		      <th scope="row" th:text="${ea-(pageno-1)*2-infoStat.index}"></th>
		      <td th:text="${info.uid}"></td>
		      <td th:text="${info.uname}"></td>
		      <td th:text="${info.uemail}"></td>
		      <td th:text="${info.utel}"></td>
		      <td>
				<input type="button" class="btn btn-info btn-sm" value="수정" th:onclick="modify_user('[[${info.uidx}]]')">
				<input type="button" class="btn btn-danger btn-sm" value="삭제" th:onclick="delete_user('[[${info.uidx}]]')">
		      </td>
		    </tr>
		    <form id="mfrm" method="post" action="./member_modify">
		    	<input type="hidden" name="uidx" value="">
		    </form>
		  </tbody>
		</table>
		
		<section aria-lebel="Page navigation example">
			<ul class="pagination" style="justify-content: center;">
				<li class="page-item"><a href="#" class="page-link"><</a></li>
				<li class="page-item" th:each="page : ${#numbers.sequence(1,pg)}">
					<span th:if=${pageno==page}>
						<a th:href="|./member_list?pageno=${page}|" style="background-color : blue" class="page-link">[[${page}]]</a>
					</span>
					<span th:if=${pageno!=page}>
						<a th:href="|./member_list?pageno=${page}|" class="page-link">[[${page}]]</a>
					</span>
				</li>
				<li class="page-item"><a href="#" class="page-link">></a></li>
			</ul>
		</section>
		
		<br><br>
		<br>
		<a href="./index.do" class="btn btn-secondary">회원가입 페이지</a>
	</div>
</body>

 

 

요렇게 잘나옴