Board


Published on August 07, 2021 by Eunbi.N

Spring BoardController Pagination

#Spring

Board_Controller.java


package com.kh.sharethevision.board.controller;
@Controller
public class BoardController {
	@Autowired
	private BoardService bService;
	
	@RequestMapping("blist.bo")
	public ModelAndView boardList(@RequestParam(value="page",required=false) 
								Integer page, ModelAndView mv) {		
		int currentPage=1;
		if(page !=null) {
			currentPage = page;
		}
		
		int listCount = bService.getListCount();
		PageInfo pi = Pagination.getPageInfo(currentPage,listCount);
		
		ArrayList<Board> list = bService.selectList(pi);
		if(list!=null) {
			mv.addObject("list",list).addObject("pi",pi);
			mv.setViewName("boardListView");
		}else {
			throw new BoardException("게시물 조회 실패");
		}
		return mv;
	}
	
	@RequestMapping("binsertView.bo")
	public String boardInsertForm() {
		return "boardInsertForm";
		
	}
	
	@RequestMapping("binsert.bo")
	public String insertBoard(@ModelAttribute Board b, 
							 @RequestParam("uploadFile") MultipartFile uploadFile, 
							 HttpServletRequest request) {
		if(!uploadFile.getOriginalFilename().equals("")) {
			String renameFileName = saveFile(uploadFile,request);
			
			if(renameFileName!=null) {
				b.setOriginalFileName(uploadFile.getOriginalFilename());
				b.setRenameFileName(renameFileName);
			}
		}
		
		int result = bService.insertBoard(b);
		if(result>0) {
			return "redirect:blist.bo";
		}else {
			throw new BoardException("게시글 등록 실패");
		}
	}
	
	public String saveFile(MultipartFile file, HttpServletRequest request) {
		String root = request.getSession().getServletContext().getRealPath("resources");
		String savePath = root + "\\buploadFiles";
		
		File folder = new File(savePath);
		if(!folder.exists()) {
			folder.mkdirs();
		}
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		String originalFileName = file.getOriginalFilename();
		String renameFileName = sdf.format(new Date(System.currentTimeMillis()))+"."+
								originalFileName.substring(originalFileName.lastIndexOf(".")+1);
		
		String renamePath = folder + "\\" + renameFileName;
		try {
			file.transferTo(new File(renamePath));
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return renameFileName;
		
	}
	
	@RequestMapping("bdetail.bo")
	public ModelAndView bdetail(@RequestParam("boardId") int boardId, 
								@RequestParam("page") Integer page, 
								ModelAndView mv) {
		Board b = bService.selectBoard(boardId,true);
		if(b!=null) {
			mv.addObject("b",b);
			mv.addObject("page",page);
			mv.setViewName("boardDetailView");
		}else {
			throw new BoardException("게시글 상세보기 실패");
		}
		return mv;
	}
	
	@RequestMapping("bupView.bo")
	public String boardUpdateForm(@RequestParam("boardId") int bId, 
								 @RequestParam("page") int page, 
								 Model model) {
		Board board = bService.selectBoard(bId, false);
		model.addAttribute("board",board).addAttribute("page",page);
		return "boardUpdateForm";
	}
	
	@RequestMapping("bupdate.bo")
	public ModelAndView updateBoard(@ModelAttribute Board b, 
									@RequestParam("page") int page,
									@RequestParam("reloadFile") MultipartFile reloadFile,
									HttpServletRequest request,
									ModelAndView mv) {
		
		if(reloadFile!=null && !reloadFile.isEmpty()) {
			if(b.getRenameFileName()!=null) {
				String root = request.getSession().getServletContext().getRealPath("resources");
				String savePath = root + "\\buploadFiles";
				
				File f = new File(savePath+"\\"+ b.getRenameFileName());
				if(f.exists()) {
					f.delete();
				}
			}
			
			String renameFileName = saveFile(reloadFile,request);
			if(renameFileName!=null) {
				b.setOriginalFileName(reloadFile.getOriginalFilename());
				b.setRenameFileName(renameFileName);
			}		
		}
		
		int result = bService.updateBoard(b);
		if(result>0) {
			Board board = bService.selectBoard(b.getBoardId(), false);
			mv.addObject("b",b);
			mv.addObject("page",page);
			mv.setViewName("boardDetailView");
		}else {
			throw new BoardException("게시글 수정 실패");
		}
		
		return mv;
	}
	
	@RequestMapping("bdelete.bo")
	public String deleteBoard(@RequestParam("boardId") int boardId, HttpServletRequest request) {
		
		Board board = bService.selectBoard(boardId, false);
		
		if(board.getOriginalFileName()!=null) {
			deleteFile(request,board);
		}
		
		int result = bService.deleteBoard(boardId);
		if(result>0) {
			return "redirect:blist.bo";
		}else {
			throw new BoardException("게시물 삭제 실패");
		}
	}
	
	public void deleteFile(HttpServletRequest request, Board board) {
	String root = request.getSession().getServletContext().getRealPath("resources");
	String savePath = root + "\\buploadFiles";
	
	File f = new File(savePath +"\\"+ board.getRenameFileName());
	if(f.exists()) {
		f.delete();
		}
	}
	
	@RequestMapping("addReply.bo")
	@ResponseBody
	public String insertReply(@ModelAttribute Reply r,
							HttpSession session ) {
		
		Member loginUser = (Member)session.getAttribute("loginUser");
		String replyWriter = loginUser.getId();
		r.setReplyWriter(replyWriter);
		
		int result = bService.insertReply(r);
		
		if(result>0) {
			return "success";
		}else {
			throw new BoardException("댓글 등록 실패");
		}
		
	}
	
	@RequestMapping(value="rList.bo")
	@ResponseBody
	public void listReply(@RequestParam("boardId") int boardId, HttpServletResponse response) {
		
		ArrayList<Reply> rList = bService.replyList(boardId);
		
		GsonBuilder gb = new GsonBuilder().setDateFormat("yyyy-MM-dd");
		Gson gson = gb.create();
		try {
			
			response.setContentType("application/json; charset=UTF-8");
			gson.toJson(rList, response.getWriter());
			
		} catch (JsonIOException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	@RequestMapping("topList.bo")
	public void selectTopList(HttpServletResponse response) {
		ArrayList<Board> list = bService.selectTopList();
		
		Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
		response.setContentType("application/json; charset=UTF-8");
			try {
				gson.toJson(list, response.getWriter());
				
			} catch (JsonIOException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
			
}   

Board_Pagination.java


package com.kh.sharethevision.common;
public class Pagination {
	public static PageInfo getPageInfo(int currentPage, int listCount) {

		int pageLimit=10;
		int boardLimit=5;
		int maxPage= (int)Math.ceil((double)listCount/boardLimit);
		int startPage= (currentPage-1)/pageLimit*pageLimit+1;
		int endPage= startPage + pageLimit -1;
		
		if(endPage>maxPage) {
			endPage=maxPage;
		}
		PageInfo pi = new PageInfo(currentPage, listCount, pageLimit, maxPage, startPage, endPage, boardLimit);
		return pi;
	}
}

Board_Mapper.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" >
<mapper namespace="boardMapper">

	<select id="listCount" resultType="_int">
		select count(*) from board where board_status='Y'
	</select>
	
	<select id="selectList" resultMap="boardResultSet">
		select board_id, board_title, board_writer, nickname, board_content,
				original_filename, rename_filename, board_count, board_create_date, board_modify_date, board_status
		from board
			 join member on (id=board_writer)
		where board_status='Y'
		order by board_id desc
	</select>
	<resultMap id="boardResultSet" type="Board">
		<id column="BOARD_ID" property="boardId"/>
		<result column="BOARD_TITLE" property="boardTitle"/>
		<result column="BOARD_WRITER" property="boardWriter"/>
		<result column="NICKNAME" property="nickName"/>
		<result column="BOARD_CONTENT" property="boardContent"/>
		<result column="ORIGINAL_FILENAME" property="originalFileName"/>
		<result column="RENAME_FILENAME" property="renameFileName"/>
		<result column="BOARD_COUNT" property="boardCount"/>
		<result column="BOARD_CREATE_DATE" property="boardCreateDate"/>
		<result column="BOARD_MODIFY_DATE" property="boardModifyDate"/>
		<result column="BOARD_STATUS" property="boardStatus"/>
	</resultMap>
		
	<insert id="insertBoard">
		insert into board
		values(seq_bid.nextval, #{boardTitle}, #{boardWriter}, #{boardContent},
			#{originalFileName}, #{renameFileName}, default, sysdate, sysdate, default)
	</insert>

	<update id="addReadCount">
		update board set board_count=board_count+1 where board_id=#{boardId}
	</update>
  	
  	<select id="selectBoard" resultMap="boardResultSet">
  		select board_id, board_title, board_writer, nickname, board_content,
				original_filename, rename_filename, board_count, board_create_date, board_modify_date, board_status
		from board
			 join member on (id=board_writer)
		where board_id=#{boardId} and board_status='Y'
  	</select>
  	
  	<update id="updateBoard">
  		update board 
  		set board_title=#{boardTitle}, board_content=#{boardContent}, board_modify_date=sysdate,
  			<if test="originalFileName !=null">
  				original_filename=#{originalFileName},
  			</if>
  				rename_filename=#{renameFileName}
  		where board_id=#{boardId}
  	</update>
  	
 	<update id="deleteBoard">
 		update board set board_status='N' where board_id=#{boardId}
 	</update>
  	
  	<insert id="insertReply">
  		insert into reply
  		values(seq_rid.nextval, #{replyContent}, #{refBoardId}, #{replyWriter}, sysdate, sysdate, default)
  	</insert>
  	
  	<select id="selectReplyList" resultMap="ReplyResultSet">
  		select *
  		from reply
  		where REF_BOARD_ID= #{boardId} and reply_status='Y'
  		order by reply_id desc
  	</select>
  	<resultMap type="Reply" id="ReplyResultSet">
  		<id column="REPLY_ID" property="replyId"/>
		<result column="REPLY_CONTENT" property="replyContent"/>
		<result column="REF_BOARD_ID" property="refBoardId"/>
		<result column="REPLY_WRITER" property="replyWriter"/>
		<result column="REPLY_CREATE_DATE" property="replyCreateDate"/>
		<result column="REPLY_MODIFY_DATE" property="replyModifyDate"/>
		<result column="REPLY_STATUS" property="replyStatus"/>
  	</resultMap> 	
  	
  	<!-- 매퍼에서는 부등호가 괄호로 인식됨 -> 태그 인식 X : <![CDATA[ ]]>  ! C DATA -->
  	<select id="selectTopList" resultMap="boardResultSet">
  		<![CDATA[ 
		with topN as( select * 
					  from board
					  where board_status='Y'
					  order by board_count desc )
		select *
		from topN
		where rownum <= 5
		 ]]>
  	</select>
  	
</mapper>