카테고리 없음

[MYBATIS] (MVC 2) 게시글 검색(list, BoardController, BoardMybatisDao, BoardMapper)

byeolsub 2023. 4. 21. 21:07

 📌 list.jsp 추가

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
<c:set var="path" value="pageContext.request.contextPath" />    
<%-- /jsp3/src/main/webapp/view/board/list.jsp --%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 목록</title>
</head>
<body>
	<!-- table list start -->
	<div class="container">
			<div  class="container justify-content-end">
				<form class="form-inline" action="list?boardid=${boardid}" method="post" name="sf">
				<input type="hidden" name="pageNum" value="1">
				<select class="form-control" name="column">
				  <option value="writer">글쓴이</option>
				  <option value="subject">제목</option>
				  <option value="content">내용</option>
				</select>
					<input class="form-control mr-sm-2" type="text"
						placeholder="Search" name="find">
					<button class="btn btn-success" type="submit">Search</button>
				</form>
			</div>
		<h2  id="center">${boardName}</h2>
	    <p align="right">
	     <c:if test="${boardcount > 0}">글개수:${boardcount}</c:if>	    
	     <c:if test="${boardcount == 0}">등록된 게시물이 없습니다</c:if>	    
	    </p>
		<table class="table table-hover">
			<thead>
				<tr>
					<th>번호</th>
					<th>제목</th>
					<th>작성자</th>
					<th>등록일</th>
					<th>파일</th>
					<th>조회수</th>
				</tr>
			</thead>
			<tbody>
			<c:forEach var="b" items="${list}">
				<tr>
					<td>${boardnum}</td>
					<c:set var="boardnum" value="${boardnum - 1}"/>
					<td>
					<c:if test="${b.grplevel > 0}">
					<img src="../image/level.gif" width="${20*(b.grplevel-1)}">
					<img src="../image/re.gif">
					</c:if>
				 <a href="info?num=${b.num}">${b.subject}</a></td>
					<td>${b.writer}</td>
					<td>
<%-- 오늘 등록한 게시물 :HH:mm:ss 
     이전일에 등록한 게시물 : yyyy-MM-dd HH:mm 출력하기 --%>	
                    <fmt:formatDate value="${today}" pattern="yyyyMMdd" var="t"/>
     	            <fmt:formatDate value="${b.regdate}" pattern="yyyyMMdd" var="r"/>   	
     	              <c:if test="${t == r}"><fmt:formatDate value="${b.regdate}" pattern="HH:mm:ss"/></c:if>	
     	              <c:if test="${t != r}"><fmt:formatDate value="${b.regdate}" pattern="yyyy-MM-dd HH:mm "/></c:if>		
					</td>
				<td><a href="../upload/${b.file1}">${b.file1}</a></td>
					<td>${b.readcnt}</td>
				</tr>
			</c:forEach>	
			</tbody>
		</table>
<%-- 공지사항일 경우 관리자만 게시글 입력 부분 나오게 처리 --%>
<c:if 
  test="${(param.boardid != 1)||(sessionScope.login =='admin') }">
		<p align="right"><a href="writeForm">게시글입력</a></p>
</c:if>	
<%-- 페이징 부분 --%>	
		<div class="container"  >
		<ul class="pagination justify-content-center"  >
   <li class="page-item 
      <c:if test='${startPage <= bottomLine}'>disabled</c:if>">
   <a class="page-link" href="list?pageNum=${startPage-bottomLine}">
   Previous</a></li>
   <c:forEach var="i" begin="${startPage}" end="${endPage}">
  <li class="page-item <c:if test='${i==pageInt}'> active </c:if>">
    <a class="page-link" href="list?pageNum=${i}">${i}</a>
  </li></c:forEach>
  <li class="page-item 
     <c:if test='${endPage >= maxPage}'>disabled</c:if>">
 <a class="page-link" href="list?pageNum=${startPage+bottomLine}">
  Next</a></li> 
</ul> </div>
	</div>
	<!-- table list end -->
</body>
</html>

 

📌 BoardController.java 추가

package controller;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.oreilly.servlet.MultipartRequest;

import kic.mskim.MskimRequestMapping;
import kic.mskim.RequestMapping;
import model.Board;
import model.BoardMybatisDao;
//http://localhost:8088/jsp3/board/*
@WebServlet("/board/*")
public class BoardController extends MskimRequestMapping{
	private BoardMybatisDao dao = new BoardMybatisDao();
	
	//http://localhost:8088/jsp3/board/writeForm
	@RequestMapping("writeForm")
	public String writeForm(HttpServletRequest request,
			HttpServletResponse response) {
		String boardid = (String)request.getSession().getAttribute("boardid");
		if(boardid ==null) boardid="1";
//boardid = 1 인 경우 관리자가 아니면 등록 못하도록 수정 
		String login = (String)request.getSession().getAttribute("login");
		if(boardid.equals("1")) {
              if(login == null || !login.equals("admin")) {
            	  request.setAttribute("msg","관리자만 공지사항에 글쓰기가 가능합니다.");
            	  request.setAttribute("url",request.getContextPath() + "/board/list?boardid=" + boardid);
            	  return "/view/alert.jsp";
              }
		}
		return "/view/board/writeForm.jsp";
	}
	@RequestMapping("write")
	public String write(HttpServletRequest request,
			HttpServletResponse response) {
		//파일 업로드되는 폴더 위치 설정 
	   String path=getServletContext().getRealPath("/")+"/upload/";
	   String ip = request.getRemoteAddr();
	   System.out.println(ip);
	   File f = new File(path);
	   if(!f.exists()) f.mkdirs(); //폴더가 없으면 생성. 파일 업로드 폴더 생성
	   int size=10*1024*1024;
	   MultipartRequest multi = null;
	   try {
		   /*
		    * request : 요청 정보. 파라미터,파일이름,파일의 내용 을 저장
		    * path    : 업로드 파일의 폴더
		    * size    : 업로드 가능한 최대 파일의 크기
		    * "UTF-8" : 파라미터값 인코딩
		    */
		   multi = new MultipartRequest(request,path,size,"UTF-8");
	   } catch(IOException e) {
		   e.printStackTrace();
	   } 
	   //파라미터값 저장
	   Board board = new Board();
	   board.setWriter(multi.getParameter("writer"));
	   board.setPass(multi.getParameter("pass"));
	   board.setSubject(multi.getParameter("subject"));	   
	   board.setContent(multi.getParameter("content"));
	   board.setFile1(multi.getFilesystemName("file1"));//파일이름	   
	   board.setIp(request.getLocalAddr());
	   String boardid = 
			   (String)request.getSession().getAttribute("boardid");
	   if(boardid==null) boardid="1";
	   board.setBoardid(boardid);
	   if(board.getFile1()==null) board.setFile1("");
	   //num : board 테이블 중 최대 num값
	   int num = dao.maxnum();
	   board.setNum(++num); //board 테이블의 최대 num값+1
	   board.setGrp(num);

	   String msg = "게시물 등록 실패";
	   String url = request.getContextPath()+"/board/writeForm";
	   if(dao.insert(board)) { //게시물등록 성공
		   msg = "게시물이 등록되었습니다.";
		   url = request.getContextPath()
				   +"/board/list?boardid="+boardid+"&pageNum=1";
	   }
	   request.setAttribute("msg", msg);
	   request.setAttribute("url", url);
	   return "/view/alert.jsp";
	}	
	//http://localhost:8088/jsp3/board/list?boardid=1
	@RequestMapping("list")
   	public String list(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding("utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		HttpSession session = request.getSession();
		if (request.getParameter("boardid") != null) { //boardid 파라미터가 존재하면
			//session 에 boardid 이름으로 파라미터 등록
			session.setAttribute("boardid", 
					             request.getParameter("boardid"));
			session.setAttribute("pageNum", "1");
		}
		String boardid = (String) session.getAttribute("boardid");
		//session에 boardid 속성값이 없는 경우
		if (boardid == null) boardid = "1"; 
		int pageInt = 1; // 현재페이지 
		int limit = 10; //한페이지당 출력되는 게시물의 건수 
		if (request.getParameter("pageNum") != null) { //pageNum 파라미터 값 존재
			session.setAttribute
			    ("pageNum", request.getParameter("pageNum")); //속성에 등록
		}
		String pageNum = (String) session.getAttribute("pageNum"); //속성에서 가지고 옴
		if (pageNum == null) { 
			pageNum = "1"; 
		}
		pageInt = Integer.parseInt(pageNum); //pageNum의 정수값
//게시물 검색에 관련된 파라미터 저장
		String column = request.getParameter("column");
		String find = request.getParameter("find");
		if(column == null || find == null) {
			column = null;
			find = null;
		}
		if(find == null || find.trim().equals("")) {
			column = null;
			find = null;
		}
/*  문제
 *     dao.boardCount(boardid) :
 *         board 테이블의 boardid값에 해당하는 게시물 건수 리턴
 */
int boardcount = dao.boardCount(boardid, column, find); //boardcount : 전체 게시판 종류별 등록된 게시물의 건수 
List<Board> list = dao.list(pageInt, limit, boardid, column, find); //list : pageInt에 해당하는 등록된 게시물 목록
        //pageInt : 1. boardcount : 5. boardnum : 5
		//페이지의 시작되는 첫번째 게시물 num 값
		int boardnum = boardcount - (pageInt - 1) * limit;
		int bottomLine = 3; //한번에 보여지는 페이지 갯수
		/*
		 * startPage : 화면에 출력되는 시작페이지 번호
		 * endPage : 풀력되는 마지막 끝페이지 번호
		 * 
		 *  pageInt     startPage      endPage
		 *    1             1             3
		 *    
		 *    
		 */
		int startPage = 
				(pageInt - 1) / bottomLine * bottomLine + 1;
		int endPage = startPage + bottomLine - 1;
		int maxPage = 
		(boardcount / limit) + (boardcount % limit == 0 ? 0 : 1); //maxPage : 게시물 건수에 의한 최대 페이지
		//endPage는 최대 페이지값을 넘지 못함
		if (endPage > maxPage)	endPage = maxPage;
		String boardName = "공지사항";
		switch (boardid) {
		case "3":
			boardName = "QNA"; break;
		case "2":
			boardName = "자유게시판";	break;
		}
		request.setAttribute("boardName", boardName); //게시판 이름
		request.setAttribute("pageInt", pageInt); //조회되는 현재 페이지
		request.setAttribute("boardid", boardid); //게시판 종류
		request.setAttribute("boardcount", boardcount); //게시물 등록 건수
		request.setAttribute("list", list); //게시물 목록
		request.setAttribute("boardnum", boardnum); //현재 페이지의 시작 번호
		request.setAttribute("startPage", startPage); //페이지의 시작페이지 번호
		request.setAttribute("bottomLine", bottomLine); //한페이지에 보여져야 할 페이지 갯수
		request.setAttribute("endPage", endPage); //페이지의 끝페이지 번호
		request.setAttribute("maxPage", maxPage); //최대 페이지 번호
		request.setAttribute("today",new Date());
		return "/view/board/list.jsp";
	}
	@RequestMapping("info")
	public String info (HttpServletRequest request, HttpServletResponse response) { 
		//num : 게시물 번호. 파라미터값 저장
		int num = Integer.parseInt(request.getParameter("num"));
		//num에 해당하는 정보를 db에서 읽어서 Board 객체에 저장
		Board b = dao.selectOne(num);
		//조회수 증가
		dao.readcntAdd(num);
		//View에 b객체를 전달. request객체에 속성 등록
		request.setAttribute("b",b);
		return "/view/board/info.jsp";
	}
	@RequestMapping("updateForm")
	public String updateForm (HttpServletRequest request, HttpServletResponse response) { 
		//num : 게시물 번호. 파라미터값 저장
	    int num = Integer.parseInt(request.getParameter("num"));
	    //num에 해당하는 정보를 db에서 읽어서 Board 객체에 저장
	  	Board b = dao.selectOne(num);
	  	request.setAttribute("b",b);
		return "/view/board/updateForm.jsp";
	}
	/*
	 * 1. 파일 업로드 하기
	 * 2. 파라미터 정보를 Board 객체 저장
	 * 3. 비밀번호 불일지
	 *    비밀번호 오류 메세지 출력하고, updateForm 페이지로 이동
	 * 4. 비밀번호 일치
	 *    첨부파일의 변경이 없는 경우 file2 파라미터의 내용을 file1 프로퍼티에 저장
	 *    파라미터의 내용으로 해당 게시물의 내용을 수정하기
	 *  boolean BoardDao.update(Board)
	 *     수정 성공 : 수정성공 메세지 출력 후 info 페이지로 이동
	 *     수정 실패 : 수정실패 메서지 출력 후 updateForm 페이지로 이동  
	 */
	@RequestMapping("update")
	public String update (HttpServletRequest request, HttpServletResponse response) { 
		//1. 파일 업로드 하기
		String path=getServletContext().getRealPath("/")+"/upload/"; //파일 업로드 되는 폴더 위치
		int size=10*1024*1024; //파일의 크기
		MultipartRequest multi = null;//파일 업로드 부분
		try {
			   multi = new MultipartRequest(request,path,size,"UTF-8");
		   } catch(IOException e) {
			   e.printStackTrace();
		   } 
		   //2. 파라미터값  Board 객체저장
		   Board board = new Board();
		   board.setNum(Integer.parseInt(multi.getParameter("num")));
		   board.setWriter(multi.getParameter("writer"));
		   board.setPass(multi.getParameter("pass"));
		   board.setSubject(multi.getParameter("subject"));	   
		   board.setContent(multi.getParameter("content"));
		   board.setFile1(multi.getFilesystemName("file1"));//파일이름	   
		   if(board.getFile1() == null || board.getFile1().equals("")) {
			   board.setFile1(multi.getParameter("file2"));
		   }
		   //3. 비밀번호 일치, 불일치
		   String msg = "비밀번호가 틀렸습니다.";
		   String url = "updateForm?num=" + board.getNum();
		   Board dbBoard = dao.selectOne(board.getNum());
		   if(board.getPass().equals(dbBoard.getPass())) {
			   //db 내용 수정
			   if(dao.update(board)) {
				   msg = "게시물이 변경 되었습니다.";
				   url = "info?num=" + board.getNum();
			   } else {
				   msg = "게시물 변견시 오류가 있습니다.";
			   }
		   }
		   request.setAttribute("msg",msg);
		   request.setAttribute("url", url);
		return "/view/alert.jsp";
	}
	@RequestMapping("deleteForm")
	public String deleteForm (HttpServletRequest request, HttpServletResponse response) { 
		return "/view/board/deleteForm.jsp";
	}
	@RequestMapping("delete")
	public String delete (HttpServletRequest request, HttpServletResponse response) { 
		int num = Integer.parseInt(request.getParameter("num"));
		String pass = request.getParameter("pass");
		Board board = dao.selectOne(num);
		String msg = "비밀번호가 틀립니다.";
		String url = "deleteForm?num=" + num;
		if(pass.equals(board.getPass())) {
			if(dao.delete(num)) {
				msg = board.getWriter() + "님의 게시글이 삭제 되었습니다.";
			} else {
				msg = "게시글 삭제시 오류가 있습니다.";
			}
			url = "list?board=" + board.getBoardid();
		}
		request.setAttribute("msg",msg);
		request.setAttribute("url",url);
		return "/view/alert.jsp";
	}
	@RequestMapping("replyForm")
	public String replyForm (HttpServletRequest request, HttpServletResponse response) { 
		int num = Integer.parseInt(request.getParameter("num"));
		Board board = dao.selectOne(num);
		request.setAttribute("board",board);
		return "/view/board/replyForm.jsp";
	}
	/*
	 * 1. 파라미터 값을 Board 객체에 저장하기
	 *    원글 정보에 해당하는 파라미터 : num, boardid, grp, grplevel, grpstep  
	 *    답글 정보 : writer, pass, subject, content => 입력한 내용
	 * 2. 같은 grp에 해당하는 게시물등의 grpstep을 1씩 중가하기.
	 *    원글의 grpstep보다 큰 grpstep만 증가
	 * 3. 답글에 대한 정보를 db에 추가(insert).
	 *    num : maxnum + 1
	 *    grp : 원글과 동일
	 *    grplevel : 원글 + 1
	 *    grpstep : 원글 + 1
	 * 4. 등록 성공 : 답변 등록 완료 메세지 출력 후 list로 페이지 이동  
	 *    등록 실패 : 답변 등록 실패 메세지 출력 후 replyForm 페이지로 이동    
	 */
	@RequestMapping("reply")
	public String reply (HttpServletRequest request, HttpServletResponse response) { 
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		//1. 파라미터 값을 Board 객체에 저장하기
		Board board = new Board();
		board.setWriter(request.getParameter("writer"));
		board.setPass(request.getParameter("pass"));
		board.setSubject(request.getParameter("subject"));
		board.setContent(request.getParameter("content"));
		board.setBoardid(request.getParameter("boardid"));
		board.setGrp(Integer.parseInt(request.getParameter("grp")));
		int num = Integer.parseInt(request.getParameter("num"));
		int grp = Integer.parseInt(request.getParameter("grp"));
		int grplevel = Integer.parseInt(request.getParameter("grplevel"));
		int grpstep = Integer.parseInt(request.getParameter("grpstep"));
		//2. grpstep 1 증가
		dao.grpStepAdd(grp,grpstep);
		//3. 답글 정보 db 등록
		board.setNum(dao.maxnum() + 1);
		board.setGrplevel(grplevel + 1);
		board.setGrpstep(grpstep + 1); //원글 다음자리
		board.setFile1("");
		board.setIp(request.getLocalAddr());
		String msg = "답변 등록 시 오류가 발생했습니다.";
		String url = "replyForm?num=" + num;
		if(dao.insert(board)) {
			msg = "답변 등록 완료";
			url = "list?boardid=" + board.getBoardid();
		}
		request.setAttribute("msg",msg);
		request.setAttribute("url",url);
		return "/view/alert.jsp";
	}
}

 

 

📌 BoardMybatisDao.java 추가

package model;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

import org.apache.ibatis.session.SqlSession;

import model.mapper.BoardMapper;

public class BoardMybatisDao {
	private Class <BoardMapper> cls = BoardMapper.class;
	private Map<String, Object> map = new HashMap<>();
	public int maxnum() {
		SqlSession session = MybatisConnection.getConnection();
		try {
			return session.getMapper(cls).maxnum();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
		return 0;
	}
	public boolean insert(Board board) {
		SqlSession session = MybatisConnection.getConnection();
				try {
					int cnt = session.getMapper(cls).insert(board);
					return cnt > 0;
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					MybatisConnection.close(session);
				}
		return false;
	}
public int boardCount(String boardid, String column, String find) { //게시물에 등록된 게시물의 건수를 가져온다
		SqlSession session = MybatisConnection.getConnection();
		try {
			map.clear();
			map.put("boardid",boardid);
			map.put("column",column);
			map.put("find",find);
			return session.getMapper(cls).boardCount(map);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
		return 0;
	}
	public List<Board> list(int pageInt, int limit, String boardid, String column, String find) { 
		SqlSession session = MybatisConnection.getConnection();
		try {
			map.clear();
			map.put("boardid",boardid);
			map.put("start",(pageInt - 1)*limit + 1);
			map.put("end",pageInt * limit);
      map.put("column",column);
			map.put("find",find);
			return session.getMapper(cls).list(map);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
		return null;
	}
	public Board selectOne(int num) {
		SqlSession session = MybatisConnection.getConnection();
		try {
			return session.getMapper(cls).selectOne(num);
		} catch  (Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
		return null;
	}
	//조회수 1 증가
	public void readcntAdd(int num) {
		SqlSession session = MybatisConnection.getConnection();
		try {
			session.getMapper(cls).readcntAdd(num);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
	}
	public boolean update(Board board) { //상세보기 할 때 조회수 하나씩 증가시키는
		SqlSession session = MybatisConnection.getConnection();
		try {
			int cnt = session.getMapper(cls).update(board);
			return cnt > 0;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
		return false;
	}
	public boolean delete (int num) {
		SqlSession session = MybatisConnection.getConnection();
		try {
			int cnt = session.getMapper(cls).delete(num);
			return cnt > 0;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
		return false;
	}
	public void grpStepAdd(int grp, int grpstep) {
		SqlSession session = MybatisConnection.getConnection();
		try {
			session.getMapper(cls).grpStepAdd(grp,grpstep);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			MybatisConnection.close(session);
		}
	}
}

 

 

📌 BoardMapper.java 변경

package model.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import model.Board;

public interface BoardMapper {

	@Select("select nvl(max(num),0) from board")
	int maxnum();

	@Insert("insert into board (num, writer, pass, subject, content, file1, regdate, readcnt, grp, grplevel, grpstep, boardid, ip) values (#{num}, #{writer}, #{pass}, #{subject}, #{content}, #{file1}, sysdate, 0, #{grp}, #{grplevel}, #{grpstep}, #{boardid}, #{ip})")
	int insert(Board board);

  @Select({"<script>",
		"select count(*) from board where boardid = #{boardid}",
		"<if test='column != null'>and ${column} like '%${find}%'</if>",
		"</script>"})
	int boardCount(Map<String, Object> map);

   @Select({"<script>",
			"select * from ("+
	       "select rownum rnum, a.* from ("+
		   " select * from board where boardid = #{boardid}",
		   "<if test='column != null'>and ${column} like '%${find}%'</if>",
		   "order by grp desc, grpstep asc ) a) " +
		   " where rnum BETWEEN #{start} and #{end} ",
           "</script>"})
  	List<Board> list(Map<String, Object> map);

	@Select("select * from board where num= #{num}")
	Board selectOne(int num);

	@Update("update board set readcnt = readcnt+1 where num= #{num}")
	Object readcntAdd(int num);

	@Update("update board set subject= #{subject},content= #{content},file1= #{file1} where num= #{num}")
	int update(Board board);

	@Delete("delete from board where num= #{num}")
	int delete(int num);

	@Update("Update board set grpstep = getstep + 1 where grp= #{grp} and grpstep > #{grpstep}")
	void grpStepAdd(@Param("grp")int grp, @Param("grpstep")int grpstep);

}