ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • day59 - MyBatis(게시판 mybatis 적용)
    KIC/MyBatis 2021. 9. 7. 22:30
    반응형

    [board.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="board" >
    
    <select id="seqNextval" resultType="int">
    select multiboardseq.nextval from dual
    </select>
    <insert id="insertBoard" parameterType="board">
    
    insert into multiboard
    (num, name, pass, subject, content, file1, regdate, readcnt, ref,reflevel, refstep, boardid) values 
    (#{num}, #{name}, #{pass},#{subject},#{content}, #{file1}, 
    sysdate, 0,#{ref}, #{reflevel},#{refstep},#{boardid})
    
    </insert>
    <!-- 파라미터가 boardid 하나만 있으므로   parameterType은 String, 결과 값은 count 값이므로 int-->
    <select id="boardCount" parameterType="String" resultType="int">
    
    select count(*) count from multiboard where boardid=#{boardid} </select>
    
    <!-- 파라미터가 여러개이니 map으로, 결과 값은 * 로 여러개를 묶어 출력하니 board 로 -->
    <select id="list" parameterType="map" resultType="board">
    
    select * from (select rownum rnum,a.*
    
    from (select * from multiboard where boardid = #{boardid} order by ref desc, refstep) a )
    
    where rnum between #{start} and #{end}
    </select>
    
    <!-- select는 결과값이 select문을 통해 출력되기 때문에 parameterType 뿐만 아니라 resultType도 있어야 한다.  -->
    <select id="selectOne" parameterType="int" resultType="board">
    select * from multiboard where num=#{num}
    </select>
    
    <select id="readcntadd" parameterType="int">
    update  multiboard set readcnt = readcnt + 1  where num =#{num}
    </select>
    
    <update id="refstepadd" parameterType="map">
    update  multiboard set refstep = refstep + 1" + " where ref = #{ref} and refstep > #{refstep}
    </update>
    
    
    <update id="update" parameterType="board">
    update  multiboard set name=#{name},subject=#{subject},content=#{content},file1=#{file1}    where num=#{num}
    </update>
    
    <!-- insert, update, delete는 결과 값이 없기 때문에 resultType은 없고 parameterType은 있다.  -->
    <delete id="delete" parameterType="int">
    delete from multiboard where num=#{num}
    </delete>
    </mapper>

     

    [BoardController.java]

    package controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.oreilly.servlet.MultipartRequest;
    
    import dao.BoardMybatisDao;
    import model.Board;
    
    public class BoardController extends Action {
    	
    	public String list(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		/*
    		 * 게시물 목록 보기 
    		 * 1. pageNum 파라미터 존재. pageNum 파라미터 없으면 1로 설정. 
    		 * 2. 10건의 게시물 출력. => db에서
    		 *    해당 페이지에 출력되는 게시물만 조회. 순서 : 최근 게시물 순으로 
    		 * 3. 화면에 출력.
    		 * 4. boardid 파라메터가 없으면 session을 수정하지 않음 default는 1임
    		 */
    		HttpSession session = request.getSession();
    		// pageNum이 넘어와야 pageNum이 바뀜
    		if (request.getParameter("pageNum") != null) {
    			session.setAttribute("pageNum", request.getParameter("pageNum"));
    		}
    		// boardid가 넘어와야 세션이 변경됨 : 현재 게시판분류에 따른 입력,수정을 적용
    		if (request.getParameter("boardid") != null) {
    			session.setAttribute("boardid", request.getParameter("boardid"));
    			session.setAttribute("pageNum", "1");
    		}
    
    		
    		String pageNum = (String) session.getAttribute("pageNum");
    		if (pageNum == null) 	pageNum = "1";
    		int pageInt = Integer.parseInt(pageNum);
    		
    		String boardid = (String) session.getAttribute("boardid");
    		if (boardid == null)  	boardid = "1";
    		
    
    		
    		
    		int limit = 10; // 한페이지에 출력할 게시물 건수
    		BoardMybatisDao dao = new BoardMybatisDao();
    		int boardcount = dao.boardCount(boardid);// 등록된 전체 게시물의 건수
    		/*
    		 * pageInt-현재 페이지 넘버, 
    		 * limit-한페이지에 출력할 게시물 건수
    		 * boardcount--등록된 전체 게시물의 건수
    		 * boardid-공지사항(1),자유게시판(2), QnA(3)
    		 */
    		List<Board> list = dao.list(pageInt, limit, boardcount, boardid); // 화면에 출력된 게시물 데이터
    		// 13 ---> boardcount/limit : 4 + 1
    		//-----------paging 작업
    		int maxpage = (int) (boardcount / limit) + (boardcount % limit == 0 ? 0 : 1);
    		int bottomLine = 3;
    		// page 1,2,3 : 1, 4,5,6: 2
    		int startpage = 1 + (pageInt - 1) / bottomLine * bottomLine;
    		int endpage = startpage + bottomLine - 1;
    		if (endpage > maxpage) 	endpage = maxpage;
    		int boardnum = boardcount - (pageInt - 1) * limit;  //100개 1:100, 2:90, 3:80
    		//-----------paging 작업
    		
    		
    		
    
    		
    		//print list
    		request.setAttribute("boardcount", boardcount);  // 등록된 전체 게시물의 건수
    		request.setAttribute("list", list);  //프린트한 게시물
    		request.setAttribute("boardnum", boardnum); //게시물 시작번호
    		request.setAttribute("pageNum", pageNum);  //현재 페이지 번호
    		
    		//하단 paging
    		request.setAttribute("startpage", startpage); // 하단 시작 페이지
    		request.setAttribute("endpage", endpage);  //하단 end 페이지
    		request.setAttribute("bottomLine", bottomLine);  //하단 화면당 페이지 보기
    		request.setAttribute("maxpage", maxpage);  //총 페이지수
    	
    		//게시판 제목
    		request.setAttribute("boardName", getBoardName(boardid));  //게시판 제목 (공지시항, 자유게시판, QnA)
    		
    		return "/view/board/list.jsp";
    	}
    	
    	
    	public String getBoardName(String boardid) {
    		
    		String boardName = "";
    		switch (boardid) {
    		case "1": {   boardName="공지사항"; break;	}
    		case "2": {   boardName="자유게시판"; break;	}
    		case "3": {   boardName="QnA"; break;	}
    		default:
    			 boardName="공지사항";
    		}
    		
    		return boardName;
    	}
    	
    	
    	
    	
    	
    	
    
    	public String writeForm(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		String boardid = (String) request.getSession().getAttribute("boardid");
    		if (boardid == null)  	boardid = "1";
    		request.setAttribute("boardName", getBoardName(boardid));
    		return "/view/board/writeForm.jsp";
    	}
    
    	public String writePro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		/* 준비사항 :  WebContent/upfile folder작성하세요
    		 * 1. 파라미터 값을 model.Board 객체 저장. 
    		 * 2. sequence.nextval 처리 */
    		String uploadpath = request.getServletContext().getRealPath("/") + "upfile";
    		int size = 10 * 1024 * 1024;
    		MultipartRequest multi;
    		//boardid session 저장 내용 : default  1
    		String boardid = (String) request.getSession().getAttribute("boardid");
    		if (boardid == null) 	boardid = "1";  //1 공지사항
    		try {	multi = new MultipartRequest(request, uploadpath, size, "utf-8");
    			Board board = new Board();
    			board.setName(multi.getParameter("name"));	board.setPass(multi.getParameter("pass"));
    			board.setSubject(multi.getParameter("subject"));
    			board.setContent(multi.getParameter("content"));
    			board.setFile1(multi.getFilesystemName("file1"));		board.setBoardid(boardid);
    			if (board.getFile1() == null) 	board.setFile1("");
    			// 2. sequence nextval 입력
    			BoardMybatisDao dao = new BoardMybatisDao();
    			// 3. board 객체의 내용을 db에 insert 하기
    			String msg = "게시물 등록 실패";		String url = "board/writeForm";
    			if (dao.insert(board)) {		msg = "게시물 등록 성공";		url = "board/list";	}
    			request.setAttribute("msg", msg);
    			request.setAttribute("url", url);
    		} catch (IOException e) {
    			e.printStackTrace();		}
    		return "/view/alert.jsp";
    	}	
    
    	public String info(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		/*
    		 * : 게시물 상세 보기 :board/info?num=41 
    		 * 
    		 * 1. num 파라미터를 이용하여 db에 해당 게시물 조회 
    		 *      Board board = new BoardMybatisDao().selectOne(num); 
    		 * 2. 조회수 증가시키기. 
    		 * readcnt+1 new BoardDao().readcntadd(num); 
    		 * 
    		 * 3. 1번에서 조회한 게시물데이터를 화면에 출력하기
    		 */
    
    		int num = Integer.parseInt(request.getParameter("num"));
    		// 파라미터값읽기
    		BoardMybatisDao dao = new BoardMybatisDao();
    		Board board = dao.selectOne(num); // 게시물 조회
    		dao.readcntadd(num); // 조회건수증가
    		request.setAttribute("board", board);
    		String boardid = (String) request.getSession().getAttribute("boardid");
    		if (boardid == null)  	boardid = "1";
    		request.setAttribute("boardName", getBoardName(boardid));
    		
    		return "/view/board/info.jsp";
    	}
    
    	
    	public String updateForm(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		/*
    		 * 1. num 값의 게시물을 조회화여 화면 출력하기
    		 */
    		int num = Integer.parseInt(request.getParameter("num"));
    		Board board = new BoardMybatisDao().selectOne(num);
    		request.setAttribute("board", board);
    		return "/view/board/updateForm.jsp";
    	}
    
    	public String update(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		/*
    		 * 1. 파라미터정보들을 Board 객체 저장. 
    		 * 2. 비밀번호 검증 비밀번호
    		 * 일치 : 수정으로. 
    		 * 비밀번호 불일치 : 비밀번호 오류 메세지 출력하고, updateForm.jsp로 페이지 이동 3. 수정성공 : 수정성공
    		 * 메시지 출력 후 list.jsp 페이지 이동 수정실패 : 수정실패 메시지 출력 후 updateForm.jsp 페이지 이동
    		 */
    
    		// 파라미터 정보 Board 객체에 저장
    		Board board = new Board();
    		String uploadpath = request.getServletContext().getRealPath("/") + "upfile/";
    		MultipartRequest multi;
    		try {
    			multi = new MultipartRequest(request, uploadpath, 10 * 1024 * 1024, "euc-kr");
    
    			board.setNum(Integer.parseInt(multi.getParameter("num")));
    			board.setName(multi.getParameter("name"));
    			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"));
    			}
    			// 비밀번호 검증
    			BoardMybatisDao dao = new BoardMybatisDao();
    			Board dbBoard = dao.selectOne(board.getNum());
    			String msg = "비밀번호가 틀렸습니다.";
    			String url = "board/updateForm?num=" + board.getNum();
    
    			if (board.getPass().equals(dbBoard.getPass())) {
    				// 수정하기
    				if (dao.update(board)) {
    					msg = "게시물 수정 완료";
    					url = "board/list";
    				} else {
    					msg = "게시물 수정 실패";
    				}
    			}
    			request.setAttribute("url", url);
    			request.setAttribute("msg", msg);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		return "/view/alert.jsp";
    	}
    
    	public String deleteForm(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    
    		int num = Integer.parseInt(request.getParameter("num"));
    		request.setAttribute("num", num);
    		return "/view/board/deleteForm.jsp";
    	}
    
    	public String delete(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		/*
    		 * /WebContent/model1/board/delete.jsp 1. num,pass 파라미터를 변수에 저장. 2. 입력된 비밀번호와 db
    		 * 비밀번호 검증 틀린경우 : 비밀번호 오류 메시지 출력, deleteForm.jsp 페이지 이동 3. 게시물 삭제. 삭제 성공 : 삭제 성공
    		 * 메시지 출력, list.jsp 페이지 이동 삭제 실패 : 삭제 실패 메시지 출력, info.jsp 페이지 이동
    		 */
    
    		int num = Integer.parseInt(request.getParameter("num"));
    		String pass = request.getParameter("pass"); // 입력된 비밀번호
    		System.out.println(pass);
    		String msg = "비밀번호가 틀렸습니다!";
    		String url = "board/deleteForm?num=" + num;
    		BoardMybatisDao dao = new BoardMybatisDao();
    		Board board = dao.selectOne(num);
    		// board.getPass() : db에 저장된 비밀번호
    		if (pass.equals(board.getPass())) {
    			if (dao.delete(num)) {
    				msg = "게시글을 성공적으로 삭제하였습니다.";
    				url = "board/list";
    			} else {
    				msg = "게시글을 삭제하는데 실패하였습니다!";
    				url = "board/info?num=" + num;
    			}
    		}
    
    		request.setAttribute("url", url);
    		request.setAttribute("msg", msg);
    
    		return "/view/alert.jsp";
    	}
    
    	public String replyForm(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		/*
    		 * 답변글 쓰기 화면 
    		 * 1. 원글의 num을 파라미터로 받는다. 
    		 * 2. 원글의 num,ref,reflevel,refstep 정보를 저장 
    		 * 3. 입력 화면 표시
    		 */
    
    		int num = Integer.parseInt(request.getParameter("num"));// 파라미터값읽기
    		BoardMybatisDao dao = new BoardMybatisDao();
    		Board board = dao.selectOne(num); // 게시물 조회
    
    		request.setAttribute("board", board);
    		String boardid = (String) request.getSession().getAttribute("boardid");
    		if (boardid == null)  	boardid = "1";
    		request.setAttribute("boardName", getBoardName(boardid));
    		return "/view/board/replyForm.jsp";
    	}
    
    	
    	
    	
    	
    	
    	public String replyPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    		request.setCharacterEncoding("utf-8");
    		String boardid = (String) request.getSession().getAttribute("boardid");
    		if (boardid == null) 	boardid = "1";
    		Board board = new Board();
    		board.setNum(Integer.parseInt(request.getParameter("num")));
    		board.setRef(Integer.parseInt(request.getParameter("ref")));
    		board.setReflevel(Integer.parseInt(request.getParameter("reflevel")));
    		board.setRefstep(Integer.parseInt(request.getParameter("refstep")));
    		board.setName(request.getParameter("name"));
    		board.setPass(request.getParameter("pass"));
    		board.setSubject(request.getParameter("subject"));
    		board.setContent(request.getParameter("content"));
    		board.setFile1("");
    		board.setBoardid(boardid);
    		BoardMybatisDao dao = new BoardMybatisDao();
    		dao.refstepadd(board.getRef(), board.getRefstep());
    		// 3. Board 객체를 db에 insert 하기.
    		String msg = "답변등록시 오류발생";
    		String url = "board/replyForm?num=" + board.getNum();
    		if (dao.insert(board)) {
    			msg = "답변등록 완료";	url = "board/list";
    		}
    		request.setAttribute("url", url);
    		request.setAttribute("msg", msg);
    		return "/view/alert.jsp";
    	}
    	
    }
    300x250

    댓글

Designed by Tistory.