본문 바로가기

2023.11.21-2024.05.31

20240304 스프링(관리자페이지-adminboard, 페이징, 검색, 게시글 수 )

menu.jsp

 <!-- Nav Item - Pages Collapse Menu --> 아래

./board

./comment 수정

 

<h6 class="collapse-header">게시판 관리:</h6>
<a class="collapse-item" href="./board">게시글 관리</a>
<a class="collapse-item" href="./comment">댓글관리</a>

> .을 붙이면 그냥 board로 가던가 admin/board로 가게된다.

 

 

 

 

AdminService, AadminServiceImlp 만들기

 

AdminService(interface)

package org.mask.service;

public interface AdminService {


}

 

 

 

 

 

AadminServiceImlp

> @Service("adminService") 추가

> @Autowired private AdminDAO adminDAO; 추가

package org.mask.service;

import org.mask.dao.AbstractDAO;
import org.mask.dao.AdminDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("adminService")
public class AdminServiceImpl extends AbstractDAO implements AdminService {

	@Autowired
	private AdminDAO adminDAO;

}

 

 

 

 

 

AdminController > @Resource(name = "adminService")  추가

	@Resource(name = "adminService")
	private AdminServiceImpl adminService;

 

 

 

 

 

AdminController >board 만들기

	@GetMapping("/board")
	public String board(Model model) {

		List<BoardDTO> list = adminService.boardList();
		model.addAttribute("list", list);
		return "admin/board";
	}

>service에 boardList 만들기

 

 

 

 

AdminServiceImpl > boardList  만들기

	public List<BoardDTO> boardList() {
		return  adminDAO.boardList();
	}

>DAO에 boardList  만들기

 

 

 

 

 

AdminDAO>boardList

	public List<BoardDTO> boardList() {
		return  sqlSession.selectList("admin.boardList");
	}

 

 

 

 

admin-mapper > boardList

<mapper namespace="admin">
	<select id="boardList" resultType="boardDTO">
    	SELECT board_no, board_title, mno, board_date, board_ip, board_del
        FROM board
    </select>
</mapper>

 

 

 

 

 

board.jsp > ${list }  추가

<!-- Page Heading -->
      <h1 class="h3 mb-4 text-gray-800">Blank Page</h1>
      ${list }

 

 

 

 

 

boardDTO >board_del 추가

@Data
public class BoardDTO {
	private int board_no, board_count, comment  ;
	private String board_title, board_content, mname, mid, board_date, board_ip, board_del;

 

 

 

 

 

board.jsp > <!-- Page Heading --> 아래 테이블 추가

               <!-- Page Heading -->
                <h1 class="h3 mb-4 text-gray-800">Blank Page</h1>
                <div class="row text-center">
				<table class="table table-hover">
				<thead>
					<tr>
						<th>번호</th>
						<th>제목</th>
						<th>글쓴이</th>
						<th>날짜</th>
						<th>읽음</th>
						<th>삭제여부</th>
					</tr>
				</thead>
				<tbody>
					<c:forEach items="${list }" var="row">
						<tr>
							<td>${row.board_no }</td>
							<td>${row.board_title }</td>
							<td>${row.mname }</td>
							<td>${row.board_date }</td>
							<td>${row.board_count }</td>
							<td>${row.board_del }</td>
						</tr>
					</c:forEach>
				</tbody>
			</table>

 

 

 

 

 

 

페이징 + 검색 + 한 화면에 보이는 게시글 수 변경

admin-mapper > limit 추가

<mapper namespace="admin">
	<select id="boardList" resultType="boardDTO">
    	SELECT board_no, board_title, mno, board_date, board_ip, board_del
        FROM board
        LIMIT 0,10;
    </select>
</mapper>

 

 

 

 

AdminController

> @RequestParam("pageNo") String pageNo  추가

> totalRecordCount (전체 글 수 뽑기)

	@GetMapping("/board")
	public String board(@RequestParam("pageNo") String pageNo, Model model) {
        
		// 페이징 + 검색 + 한 화면에 보이는 게시글 수 변경
		// 전체 글 수 뽑기
		int totalRecordCount = adminService.totalRecordCount(searchDTO);
        
		List<BoardDTO> list = adminService.boardList();
		model.addAttribute("list", list);
		return "admin/board";
        

	}

 

 

 

 

 

AdminService > totalRecordCount(전체 글 수 뽑기)

	@Override
	public int totalRecordCount() {
		return adminDAO.totalRecordCount();
	}

 

 

 

AdminDAO> totalRecordCount(전체 글 수 뽑기)  > 실행시키면  INT값나온다

	public int totalRecordCount() {
		return sqlSession.selectOne("admin.totalRecordCount")
	}

 

 

 

 

admin-mapper

<select id="totalRecordCount" resultType="Integer">
	SELECT COUNT(*) FROM board
</select>

 

 

 

 

AdminController> Util 불러서 오류 수정

	@Autowired
	private Util util;

 

 

 

 

AdminController> 전자정부 페이징(pagination) 부분 추가

	@GetMapping("/board")
	public String board(@RequestParam("pageNo") String pageNo, Model model) {

                
		// 전체 글 수 뽑기
		int totalRecordCount = adminService.totalRecordCount(searchDTO);
        
		// 전자정부 페이징 pagination
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(util.str2Int(pageNo)); // 현재 페이지 번호
		paginationInfo.setRecordCountPerPage(10); // 한 페이지에 게시되는 게시물 건수
		paginationInfo.setPageSize(10); // 페이징 리스트의 사이즈
		paginationInfo.setTotalRecordCount(totalRecordCount); // 전체 게시물 건 수


		List<BoardDTO> list = adminService.boardList();
		model.addAttribute("list", list);
		return "admin/board";
	}

 

 

 

>검색기능 추가

SearchDTO searchDTO = new SearchDTO;
searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());

List<BoardDTO> list = adminService.boardList(searchDTO);

 

 

 

	@GetMapping("/board")
	public String board(@RequestParam("pageNo") String pageNo, Model model) {

 		// 페이징 + 검색 + 한 화면에 보이는 게시글 수 변경

		// 전체 글 수에도 DTO 보내기
		SearchDTO searchDTO = new SearchDTO();

		// 전체 글 수 뽑기
		int totalRecordCount = adminService.totalRecordCount(searchDTO);
        
		// 전자정부 페이징 pagination
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(util.str2Int(pageNo)); // 현재 페이지 번호
		paginationInfo.setRecordCountPerPage(10); // 한 페이지에 게시되는 게시물 건수
		paginationInfo.setPageSize(10); // 페이징 리스트의 사이즈
		paginationInfo.setTotalRecordCount(totalRecordCount); // 전체 게시물 건 수

		// 검색에서 사용할 값 추가
		searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());


		List<BoardDTO> list = adminService.boardList(searchDTO);
		model.addAttribute("list", list);
		return "admin/board";
	}

 

 

 

 

AdminServiceImpl > searchDTO 추가

	@Override
	public List<BoardDTO> boardList(SearchDTO searchDTO) {
		return adminDAO.boardList(searchDTO);
	}

 

 

 

 

AdminService > searchDTO 추가

	List<BoardDTO> boardList(SearchDTO searchDTO);

 

 

 

AdminDAO > searchDTO 추가

	public List<BoardDTO> boardList(SearchDTO searchDTO) {
		return sqlSession.selectList("admin.boardList",searchDTO);
	}

 

 

 

 

mybatis-config.xml > search 를 searchDTO 로 변경

  		<typeAlias type="org.mask.dto.SearchDTO" alias="SearchDTO"/>

 

 

 

admin-mapper.xml

<mapper namespace="admin">
	<select id="boardList" resultType="searchDTO" resultType="boardDTO">
    	SELECT board_no, board_title, mno, board_date, board_ip, board_del
        FROM board
        LIMIT 0,10;
    </select>
</mapper>

 

 

 

AdminController

>@RequestParam(name = "pageNo", defaultValue = "1")  추가

>model.addAttribute("paginationInfo", paginationInfo); 추가

	@GetMapping("/board")
	public String board(@RequestParam(name = "pageNo", defaultValue = "1") 
    String pageNo, Model model) {

 		....
        
		List<BoardDTO> list = adminService.boardList(searchDTO);
		model.addAttribute("list", list);
		model.addAttribute("paginationInfo", paginationInfo);
		return "admin/board";
	}

 

 

 

board.jsp

>전자정부 사용 코드 넣기

> </table> 아래 추가

>페이지 스크립트 작성

> 토클 만들기<한 화면에 몇 개 게시글 나오게 할지 설정하는 것>

> 제이쿼리 가져오기

 

 

>전자정부 사용 코드 넣기

<%@ taglib uri="http://egovframework.gov/ctl/ui" prefix="ui"%>

 

 

> </table> 아래 추가

<div class="m-2 text-center">
	<ui:pagination paginationInfo="${paginationInfo }" type="text" jsFunction="linkPage"/>
</div>

 

 

>페이지 스크립트 작성

<script type="text/javascript">
function linkPage(pageNo) {
	location.href="./board?pageNo="+pageNo;
}
</script>

 

 

 

>토클 만들기<한 화면에 몇 개 게시글 나오게 할지 설정하는 것>

<div class="">
<select name="perPage" id="perPage" class="form-control">
<option value="1">10</option>
<option value="2">20</option>
<option value="3">30</option>
<option value="4">40</option>
<option value="5">50</option>
<option value="10">100</option>
</select>
</div>

 

 

 

> 제이쿼리 가져오기

$(function(){
	$('#perPage').change(function(){
		location.href="./board?pageNo=${pageNo}&perPage="+$('#perPage').val();
	});
});
</script>

 

 

 

 

 

AdminController

> @RequestParam(name = "perPage", defaultValue = "1", required = false) String perPage, 추가

>paginationInfo.setRecordCountPerPage(util.str2Int(perPage) * 10); // 10 20 30 40 50 100 추가

	@GetMapping("/board")
	public String board(@RequestParam(name = "pageNo", defaultValue = "1") String pageNo, 
	@RequestParam(name = "perPage", defaultValue = "1", required = false) String perPage,
	Model model) {
    
    ...
    
    		// 전자정부 페이징 pagination
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(util.str2Int(pageNo)); // 현재 페이지 번호
		paginationInfo.setRecordCountPerPage(util.str2Int(perPage) * 10); // 10 20 30 40 50 100

	}

 

 

 

 

SearchDTO > recordCountPerPage

package org.mask.dto;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class SearchDTO {
	private int pageNo, recordCountPerPage; 
	private String searchTitle, search; {
		
	}

}

 

 

 

 

AdminController

>searchDTO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); 추가

		// 검색에서 사용할 값 추가
		searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
		searchDTO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()*10);

 

 

 

 

admin-mapper

	<select id="boardList" parameterType="searchDTO" resultType="boardDTO">
		SELECT b.board_no, b.board_title, m.mname, m.mid ,b.board_date,
		b.board_ip, b.board_del
		FROM board 
        LIMIT #{pageNo}, #{recordCountPerPage};
	</select>

 

 

 

 

board.jsp 

>검색창 추가

>버튼 추가

>스크립트에 클릭 추가

 

 

>검색창 추가

<input type="text" name="search" id="search" class="form-control">
<button type="button" class="btn btn-secondary" id="searchBtn"> 검색</button>

</div>
<button type="button" class="btn btn-success col-4">초기화</button>

 

 

 

 

>버튼 추가 $('#searchBtn').click(function(){

    $(function(){
		...
        
    	$('#searchBtn').click(function(){
    		location.href="./board?pageNo=1&perPage=${perPage}&searchTitle="+$('#searchTitle').val()+"&search="+$('#search').val();
    	});

 

 

 

 

 

AdminController

> @RequestParam(name = "search", required = false) String search,

>search  추가

	@GetMapping("/board")
	public String board(@RequestParam(name = "pageNo", defaultValue = "1") String pageNo,
			@RequestParam(name = "perPage", defaultValue = "1", required = false) String perPage,
			@RequestParam(name = "searchTitle", required = false) String searchTitle,
			@RequestParam(name = "search", required = false) String search, Model model) {

		// 전체 글 수에도 DTO 보내기
		SearchDTO searchDTO = new SearchDTO();
		searchDTO.setSearchTitle(searchTitle);
		searchDTO.setSearch(search);
        
		// 전체 글 수 뽑기
		int totalRecordCount = adminService.totalRecordCount(searchDTO);
        
        
        ...
        
		List<BoardDTO> list = adminService.boardList(searchDTO);
		model.addAttribute("list", list);
		model.addAttribute("paginationInfo", paginationInfo);
        
		return "admin/board";
	}

 

 

 

 

AdminService > int totalRecordCount(SearchDTO searchDTO); 추가

package org.mask.service;

import java.util.List;

import org.mask.dto.BoardDTO;
import org.mask.dto.SearchDTO;

public interface AdminService {

	List<BoardDTO> boardList(SearchDTO searchDTO);

	int totalRecordCount(SearchDTO searchDTO);
    
    }

 

 

 

 

AdminServiceImpl > searchDTO 추가

	@Override
	public List<BoardDTO> boardList(SearchDTO searchDTO) {
		return adminDAO.boardList(searchDTO);
	}

	@Override
	public int totalRecordCount(SearchDTO searchDTO) {
		return adminDAO.totalRecordCount(searchDTO);
	}

 

 

 

 

AdminDAO > searchDTO 추가

	public List<BoardDTO> boardList(SearchDTO searchDTO) {
		return sqlSession.selectList("admin.boardList",searchDTO);
	}

	public int totalRecordCount(SearchDTO searchDTO) {
		return sqlSession.selectOne("admin.totalRecordCount",searchDTO);
	}

 

 

 

admin-mapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="admin">

	<select id="boardList" parameterType="searchDTO" resultType="boardDTO" >
		SELECT board_no, board_title, mno, board_date, board_ip, board_del
		FROM board
		<where>
			<if test="search != null">
				board_title LIKE CONCAT('%', #{search}, '%')
				OR board_content LIKE CONCAT('%', #{search}, '%')
			</if>
		</where>
		ORDER BY board_no DESC
		LIMIT #{pageNo}, #{recordCountPerPage};
	</select>
	
	<select id="totalRecordCount" parameterType="String" resultType="Integer">
		SELECT COUNT(*)
		FROM board
		<where>
			<if test="search != null"><!-- 서치값이 있다면 -->
				board_title LIKE CONCAT('%', #{search}, '%')
				OR board_content LIKE CONCAT('%', #{search}, '%')
			</if>
		</where>
	</select>
	
</mapper>

 

 

 

 

AdminController>  jsp 에 보내주기 위해  pageNo, perPage 추가

		List<BoardDTO> list = adminService.boardList(searchDTO);
		model.addAttribute("list", list);
		model.addAttribute("paginationInfo", paginationInfo);
		model.addAttribute("pageNo", pageNo);
		model.addAttribute("perPage", perPage);

> url 에 작성한 ${pageNo}, ${perPage} 나옴

 

 

 

 

board.jsp > 클릭했을 때 url 거의 비슷하게 맞춰주기, 검색 날라올 때 pageNo=1 로 가져오게 스크립트 수정

    <script type="text/javascript">
    function linkPage(pageNo){
    	location.href = "./board?pageNo="+pageNo+"&perPage=${perPage}&search=${search}";
    }

    $(function(){
    	$('#perPage').change(function(){
    		location.href="./board?pageNo=1&perPage="+$('#perPage').val()+"&search=${search}";
    	});
    	$('#searchBtn').click(function(){
    		location.href="./board?pageNo=1&perPage=${perPage}
            &searchTitle="+$('#searchTitle').val()+"&search="+$('#search').val();
    	});

    });
    </script>