부트스트랩 list

조수경·2022년 2월 8일
0

Spring

목록 보기
17/43

lprod_SQL.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
  <!-- result라 써도 무방하지만 id라고 쓴것은 기본키임을 밝힌것  -->
<mapper namespace="lprod">
	
   <!-- list2를 위함 시작 -->
	<!-- <resultMap type="lprodVO" id="lprodMap">
		<result property="lprodId" column="LPROD_ID" />
		<result property="lprodGu" column="LPROD_GU" />
		<result property="lprodNm" column="LPROD_NM" />
		<collection property="buyerVO" resultMap="buyerMap"></collection>
	</resultMap>
	
	<resultMap type="buyerVO" id="buyerMap2">
		<result property="buyerId" column="BUYER_ID" />
		<result property="buyerLgu" column="BUYER_LGU" />
		<result property="buyerName" column="BUYER_NAME" />
	</resultMap> --> 
	
	<!-- list2를 위함 끝 -->
	

	<!-- buyerVO는 LprodVO에 있는 list 멤버 변수 이름임  -->
	<resultMap type="lprodVO" id="lprodMap">
		<id property="lprodGu" column="LPROD_GU" />
		<result property="lprodNm" column="LPROD_NM" />
		<collection property="buyerVO" resultMap="buyerMap"></collection>
	</resultMap>
	
	<!-- alias에 설정을 해줘서 kr.or.ddit.BuyerVO를 buyerVO로만 입력 가능 -->
	<resultMap type="buyerVO" id="buyerMap">
		<id property="buyerId" column="BUYER_ID" />
		<result property="buyerName" column="BUYER_NAME" />
		<result property="buyerLgu" column="BUYER_LGU" />
	</resultMap>
	
	
<!-- CLOB는 위에 처럼 처리를 해줘야함 / 하지만 VO는 String으로 씀-->

	<!-- <select id="list" resultMap="lprodMap">
		SELECT B.BUYER_ID 
		    , B.BUYER_NAME 
		    , B.BUYER_LGU
		    , L.LPROD_ID 
		    , L.LPROD_GU
		    , L.LPROD_NM  
		FROM BUYER B, LPROD L
		WHERE B.BUYER_LGU = L.LPROD_GU
		ORDER BY L.LPROD_GU ASC
	</select>	 -->
	
	
	<select id="list" resultMap="lprodMap">
		select L.LPROD_GU
		    ,L.LPROD_NM
		    ,B.BUYER_ID
		    ,B.BUYER_NAME
		    ,B.BUYER_LGU
		from LPROD L INNER JOIN BUYER B
		ON(L.LPROD_GU = B.BUYER_LGU)
		ORDER BY LPROD_NM
	</select>	 
	

	
</mapper>



LprodDao.java

package kr.or.ddit;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

//선생님의 dao 내것은 buyerdao list2에 있음
@Repository //자바빈으로 등록해서 특별관리(일반클래스에 완장 채우는 늒김)
public class LprodDao {
	
			//sqlSessionTempate 사용
			/*
			 * new 키워드를 통해 직접 생성 안했는데 객체가 생성이 됨!! 싱기방구 
			 * 이게 바로 의존성 주입임!!!(Dependency Injection - DI)
			 * DI로 주입 받는 것임
			 * 스프링이 이미 만들어 놓은 sqlSessionTemplate 타입 객체를 BookDao 객체에 주입
			 * 이 과정은 자동으로 스프링에서 실행되며, 개발자가 직접 객체를 생성하지 않음(이것이 바로 IoC: 제어의 역전)
			 * 
			 */
	
	@Autowired//자동 주입
	SqlSessionTemplate sqlSessionTemplate;//미리 만들어 놓은 백신(root컨택스트에서 온것)
	
	//상품 분류 별 거래처 목록
	public List<LprodVO> list(){
	   return this.sqlSessionTemplate.selectList("lprod.list");
	}
}

LprodServiceImpl

package kr.or.ddit;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LprodServiceImpl implements LprodService {
	//DI
	@Autowired
	LprodDao lprodDao;
	
	//상품 분류 별 거래처 목록
	//메소드 재정의
	@Override
		public List<LprodVO> list(){
			return this.lprodDao.list();
		}
}

LprodService

package kr.or.ddit;

import java.util.List;

public interface LprodService {
	//메소드 시그니처
	//상품 분류 별 거래처 목록
	public List<LprodVO> list();

}

LprodController.java

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.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

//모든 요청들이여 나에게로 오라
@RequestMapping(value="/lprod")
@Controller
public class LprodController {
	//org.slf4j패키지..
	private static final Logger logger = 
			LoggerFactory.getLogger(LprodController.class);
	
	@Autowired
	LprodService lprodService;
	//http://localhost:8090/lprod/list?currentPage=1
	@RequestMapping(value="/list", method=RequestMethod.GET)
	public String list(Model model, @RequestParam(defaultValue="1") int currentPage) {//int형 으로 사용하는것 유희
		//(defaultValue="1"): 파라미터가 없을때 에러가남 그럴때 이것을 써줘야됨
		// 해당 요청 파라미터를 지정하지 않을 경우(http://localhost:8090/lprod/list)
		// 속성에 지정한 문자열을 값으로 이용하게 됨
		logger.info("currnetPage : "  + currentPage);
		
		List<LprodVO> list = this.lprodService.list();
		logger.info("list.size() : "  + list.size());
		
		//new ArticlePage(total, currentPage, size, pagingCount, content)
		model.addAttribute("list",
				new ArticlePage(list.size(), currentPage, 7, 5, list));//모델 객체에 리스트가 들은것
		
		//forward
		return "lprod/list";
	}
}

ArticlePage.java

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 : 한 화면에 보여질 행의 수

	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 == 0 일 때

        if(currentPage%pagingCount==0) {
			//startPage = startPage - 5(페이징의 개수);
			startPage -= pagingCount;
		}
		

endPage : 이전 [1][2] [3][4] [5] 다음 일 때 5을 의미

        endPage = startPage + (pagingCount-1);

보정해줘야 할 경우는? 5 / 5 * 5 + 1 => 6 경우처럼
보정해줘야 할 경우는? 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;
}

}

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>

<head>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>상품분류 별 거래처 목록</title>

    <!-- Custom fonts for this template-->
    <link href="/resources/sbadmin2/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
    <link
        href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
        rel="stylesheet">

    <!-- Custom styles for this template-->
    <link href="/resources/sbadmin2/css/sb-admin-2.min.css" rel="stylesheet">

</head>

<body id="page-top">

    <!-- Page Wrapper -->
    <div id="wrapper">

        <!-- Sidebar -->
        <jsp:include page="../includes/aside.jsp"></jsp:include>
        <!-- End of Sidebar -->

        <!-- Content Wrapper -->
        <div id="content-wrapper" class="d-flex flex-column">

            <!-- Main Content -->
            <div id="content">

                <!-- Topbar -->
                <jsp:include page="../includes/header.jsp"></jsp:include>
                <!-- End of Topbar -->

                <!-- Begin Page Content 본문 시작 -->
                <div class="container-fluid">

                    <!-- Page Heading -->
                    <h1 class="h3 mb-2 text-gray-800">상품분류 별 거래처 목록</h1>
                    <p class="mb-4">상품분류 별로 거래처의 목록을 화면에 보여줍니다.</p>

                    <!-- DataTales Example -->
                    <div class="card shadow mb-4">
                        <div class="card-header py-3">
                            <h6 class="m-0 font-weight-bold text-primary">DataTables Example</h6>
                        </div>
                        <div class="card-body">
                            <div class="table-responsive">
                                <div id="dataTable_wrapper" class="dataTables_wrapper dt-bootstrap4"><div class="row"><div class="col-sm-12 col-md-6"><div class="dataTables_length" id="dataTable_length"><label>Show <select name="dataTable_length" aria-controls="dataTable" class="custom-select custom-select-sm form-control form-control-sm"><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select> entries</label></div></div><div class="col-sm-12 col-md-6"><div id="dataTable_filter" class="dataTables_filter"><label>Search:<input type="search" class="form-control form-control-sm" placeholder="" aria-controls="dataTable"></label></div></div></div><div class="row"><div class="col-sm-12"><table class="table table-bordered dataTable" id="dataTable" width="100%" cellspacing="0" role="grid" aria-describedby="dataTable_info" style="width: 100%;">
                                    <thead>
                                    <tr role="row">
                                        <th class="sorting sorting_asc" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Name: activate to sort column descending" style="width: 50px;">번호</th>
                                        <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Position: activate to sort column ascending" style="width: 200px;">상품분류코드</th>
                                        <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Office: activate to sort column ascending">상품분류명</th>
                                        <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Age: activate to sort column ascending" style="width: 200px;">거래처코드</th>
                                        <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending">거래처명</th>
                                    </tr>
                                    </thead>
                                    <tfoot>
                                     <tr>
                                     	<th rowspan="1" colspan="1">번호</th>
                                        <th rowspan="1" colspan="1">상품분류코드</th>
                                        <th rowspan="1" colspan="1">상품분류명</th>
                                        <th rowspan="1" colspan="1">거래처코드</th>
                                        <th rowspan="1" colspan="1">거래처명</th>
                                     </tr>
                                    </tfoot>
                                    <tbody>
                                    <c:set var="i" value="0" />
                                    <c:forEach var="lprodVO" items="${list.content}">
                                    <c:forEach var="buyerVO" items="${lprodVO.buyerVO}">
                                    <c:set var="cnt" value="${i=i+1}" />
                                    <c:if test="${cnt%2==1}">
                                   	<tr class="odd">
                                   	</c:if>
                                   	<c:if test="${cnt%2==0}">
                                   	<tr class="even">
                                   	</c:if>
                                          <td class="sorting_1">${cnt}</td>
                                          <td>${lprodVO.lprodGu}</td>
                                          <td>${lprodVO.lprodNm}</td>
                                          <td>${buyerVO.buyerId}</td>
                                          <td>${buyerVO.buyerName}</td>
                                     </tr>
                                     </c:forEach>
                                     </c:forEach>
                                    </tbody>
                                </table>
                                </div>
                                </div>
                                <div class="row">
                                <div class="col-sm-12 col-md-5">
                                <div class="dataTables_info" id="dataTable_info" role="status" aria-live="polite">
                                <!-- A*7-6 A*7 -->
                                Showing ${param.currentPage*7-6} to ${param.currnetPage*7} of {total} entries
                                </div>
                                </div>
                                <div class="col-sm-12 col-md-7">
                                <div class="dataTables_paginate paging_simple_numbers" id="dataTable_paginate">
                                <!-- 페이징 처리 시작 -->
	                                <ul class="pagination">
	                                	<!-- Previous 시작 -->
		                                <li class="paginate_button page-item previous <c:if test='${list.startPage<6}'>disabled</c:if>" id="dataTable_previous"><a href="/lprod/list?currnetPage=${list.startPage-5}" aria-controls="dataTable" data-dt-idx="0" tabindex="0" class="page-link">Previous</a></li>
		                                <!-- Previous 끝 -->
		                                <!-- Page번호 시작 -->
		                                <c:forEach var="pNo" begin="${list.startPage}" end="${list.endPage}" step="1">
		                                <li class="paginate_button page-item <c:if test='${param.currentPage eq pNo}'>active</c:if>"><a href="/lprod/list?currentPage=${pNo}" aria-controls="dataTable" data-dt-idx="1" tabindex="0" class="page-link">${pNo}</a></li>
		                                </c:forEach>
		                                <!-- Page번호 끝 -->
		                                <!-- Next 시작 : 누르면 6/11/16 페이지로 감 -->
		                                
		                                <li class="paginate_button page-item <c:if test='${list.endPage >= list.totalPages}'>disbled</c:if>" id="dataTable_next"><a href="/lprod/list?currentPage=${list.startPage+5}" aria-controls="dataTable" data-dt-idx="7" tabindex="0" class="page-link">Next</a>${list.endPage} ${list.totalPages}</li>
		                                <!-- Next 끝 -->
	                                </ul>
	                            <!-- 페이징 처리 끝 -->
                                </div></div></div></div>
                            </div>
                        </div>
                    </div>

                </div>
                <!-- /.container-fluid 본문 끝-->

            </div>
            <!-- End of Main Content -->

            <!-- Footer -->
            <jsp:include page="../includes/footer.jsp"></jsp:include>
            <!-- End of Footer -->

        </div>
        <!-- End of Content Wrapper -->

    </div>
    <!-- End of Page Wrapper -->

    <!-- Scroll to Top Button-->
    <a class="scroll-to-top rounded" href="#page-top">
        <i class="fas fa-angle-up"></i>
    </a>

    <!-- Logout Modal-->
    <div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
        aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5>
                    <button class="close" type="button" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">×</span>
                    </button>
                </div>
                <div class="modal-body">Select "Logout" below if you are ready to end your current session.</div>
                <div class="modal-footer">
                    <button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
                    <a class="btn btn-primary" href="login.html">Logout</a>
                </div>
            </div>
        </div>
    </div>

    <!-- Bootstrap core JavaScript-->
    <script src="/resources/sbadmin2/vendor/jquery/jquery.min.js"></script>
    <script src="/resources/sbadmin2/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

    <!-- Core plugin JavaScript-->
    <script src="/resources/sbadmin2/vendor/jquery-easing/jquery.easing.min.js"></script>

    <!-- Custom scripts for all pages-->
    <script src="/resources/sbadmin2/js/sb-admin-2.min.js"></script>

    <!-- Page level plugins -->
    <script src="/resources/sbadmin2/vendor/chart.js/Chart.min.js"></script>

    <!-- Page level custom scripts -->
    <script src="/resources/sbadmin2/js/demo/chart-area-demo.js"></script>
    <script src="/resources/sbadmin2/js/demo/chart-pie-demo.js"></script>

</body>

</html>
profile
신입 개발자 입니다!!!

0개의 댓글