본문 바로가기
study/Mybatis

[Mybatis] 20. Mybatis - controller, Dao, Mapper

by 금이패런츠 2022. 4. 20.
728x90
반응형
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 model.Board;
import model.BoardDao;

@WebServlet("/board/*") // http://localhost:8088/jsp3/board/**** 요청시 호출되는 클래스 
public class BoardController extends MskimRequestMapping{
	private BoardDao dao = new BoardDao();
	/*
	 *    boardid,pageNum,column,find 파라미터
	 */
	@RequestMapping("list")
	//http://localhost:8088/jsp3/board/list?boardid=1
	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 파라미터값을 boardid 이름으로 저장
			session.setAttribute("boardid", request.getParameter("boardid"));
			session.setAttribute("pageNum", "1"); //pageNum값을 session 속성으로 등록
		}
		String boardid = (String) session.getAttribute("boardid");
		if (boardid == null) boardid = "1"; //boardid의 기본값을 1로 설정
		
		int pageInt = 1; //현재 페이지
		int limit = 10;  //한페이지당 출력하는 게시물의 건수 

		//pageNum 파라미터값이 존재하면 session 속성값으로 등록 
		if (request.getParameter("pageNum") != null) {
			session.setAttribute("pageNum", request.getParameter("pageNum"));
		}
		String pageNum = (String) session.getAttribute("pageNum");
		if (pageNum == null) {
			pageNum = "1";  //pageNum의 기본값을 1로 설정
		}
		pageInt = Integer.parseInt(pageNum);

		String column = request.getParameter("column");
		String find = request.getParameter("find");
		if(column==null || column.trim().equals("")) {
			column = null;
			find = null;
		}
		if(find==null || find.trim().equals("")) {
			column = null;
			find = null;
		}
		//boardcount : 게시물종류별 등록된 게시물 건수 
		int boardcount = dao.boardCount(boardid,column,find);
		//list : 해당 페이지에 출력될 게시물 객체들
		List<Board> list = dao.list(pageInt, limit, boardid,column,find);
        //화면에 보여주기 위한 게시물 번호 출력
		//boardcount  pageInt   boardnum
		//   23           1        23
		//   23           2        13 
		//   23           3        3 
		int boardnum = boardcount - (pageInt - 1) * limit;
		int bottomLine = 3; //화면에 출력될 페이지 갯수 
		/*
		 * startPage : 페이지 시작 번호
		 * endPage   : 페이지 종료 번호
		 *   pageInt  startPage   endPage
		 *      1         1          3
		 *      2         1          3
		 *      3         1          3
		 *      4         4          6
		 *      5         4          6
		 */
		int startPage = (pageInt - 1) / bottomLine * bottomLine + 1;
		int endPage = startPage + bottomLine - 1;
		//maxPage : 게시물 건수에 의한 최대 페이지
		//  boardcount  maxPage
		//      11        2
		//      20        2
		int maxPage = (boardcount / limit) + (boardcount % limit == 0 ? 0 : 1);
		if (endPage > maxPage)	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("writeForm")
	public String writeForm(HttpServletRequest request, HttpServletResponse response) {
		String boardid = (String) request.getSession().getAttribute("boardid");
		String login = (String) request.getSession().getAttribute("login");
		if (boardid == null) boardid = "1"; 
		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) {
		//this.getServletContext() : application 객체 
		// getServletContext.getRealPath("/") : 웹어플리케이션의 폴더 정보 
		//path : 웹어플리케이션의 폴더의 upload라는 하위폴더 
		String path = this.getServletContext().getRealPath("/") + "/upload/";
		
		String ip = request.getHeader("X-Forwarded-For");
	    System.out.println("IP1:"+ip);
	    if (ip == null) ip = request.getRemoteAddr();
	    System.out.println("IP2:"+ip);
		File f = new File(path);
		//f.exists() : 파일이 존재 : true, 존재하지 않으면:false 
		if(!f.exists()) f.mkdirs(); //path 폴더가 존재하지 않으면 폴더 생성 => 파일이 업로드될 폴더 생성
		
		int size = 10 * 1024 * 1024; //10M
		MultipartRequest multi = null;
		try {
			/*  MultipartRequest 객체
			 *    request : 요청정보. => 파라미터정보, 파일정보 저장 
			 *    path : 파일이 업로드될 폴더
			 *    size : 최대 파일 업로드의 크기 설정 
			 *    "UTF-8" : 파라미터값의 인코딩 설정 
			 *  => 1. 파라미터정보 조회.
			 *     2. 파일업로드 
			 */
			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()); //클라이언트의 주소 
		//session 속성에 등록된 boardid 값 
		String boardid = (String) request.getSession().getAttribute("boardid");
		if (boardid==null)  boardid = "1"; //공지사항
		board.setBoardid(boardid); //게시판종류 저장 
		if (board.getFile1() == null) //업로드 파일이 없는 경우
			board.setFile1("");			
		int num = dao.maxnum(); //등록된 최대 num값 조회 
		board.setNum(++num); //등록된 최대 num값 + 1
		board.setGrp(num);   //원글의 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";
	}	
	@RequestMapping("info")
	public String info(HttpServletRequest request, HttpServletResponse response) {
		int num = Integer.parseInt(request.getParameter("num"));
		//b : num값에 해당하는  board의 내용을 db에서 읽어서 저장 객체 
		Board b = dao.selectOne(num);
		dao.readcntAdd(num); //조회수 증가 
		request.setAttribute("b", b);
		return "/view/board/info.jsp";
	}	
	@RequestMapping("updateForm")
	public String updateForm(HttpServletRequest request, HttpServletResponse response) {
		int num = Integer.parseInt(request.getParameter("num"));
		Board b = dao.selectOne(num);
		request.setAttribute("b", b);
		return "/view/board/updateForm.jsp";
	}	
	/*
	  1. 파일 업로드 하기
	  2. 파라미터정보를 Board 객체 저장.
	  3. 비밀번호 일치  
	     첨부파일의 변경이 없는 경우 file2 파라미터의 내용을 file1 프로퍼티에 저장하기 
         파라미터의 내용으로 해당 게시물의 내용을 수정하기.
		 boolean BoardDao.update(Board)               
	           수정성공 :수정성공 메시지 출력 후  info 페이지 이동
	           수정실패 :수정실패 메시지 출력 후 updateForm 페이지 이동         
	  4. 비밀번호 불일치 
          비밀번호 오류 메세지 출력하고, updateForm로 페이지 이동
	 */
	@RequestMapping("update")
	public String update(HttpServletRequest request, HttpServletResponse response) {
		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();
		}
		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"));
		}
		Board dbboard = dao.selectOne(board.getNum());
		String msg = "비밀번호가 틀렸습니다";
		String url = "updateForm?num=" + board.getNum();
		if (board.getPass().equals(dbboard.getPass())) {
			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("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, grp, grplevel, grpstep
	       답글정보 : writer, pass, subject, content => 등록정보
	   2. 같은 grp 값을 사용하는 게시물들의 grpstep 값을 1 증가 하기.
	      void BoardDao.grpStepAdd(grp,grpstep)
	   3. Board 객체를 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();
		}
		Board board = new Board();
		board.setWriter(request.getParameter("writer"));
		board.setPass(request.getParameter("pass"));
		board.setSubject(request.getParameter("subject"));
		board.setContent(request.getParameter("content"));
		String boardid = request.getParameter("boardid");
		board.setBoardid(boardid);
		board.setFile1("");
		board.setIp(request.getLocalAddr());
		//원글 정보
		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"));
		String msg = "답변 등록시 오류 발생";
		String url = "replyForm?num=" + num;
		board.setNum(dao.maxnum() + 1); //등록된 최대 num값 + 1
		dao.grpStepAdd(grp, grpstep); //같은 grp 중 원글보다 하위의 글들의 grpstep 값을 1증가
		board.setGrp(grp); //답변글 grp값
		board.setGrplevel(grplevel + 1); //답변글 grplevel값 
		board.setGrpstep(grpstep + 1);   //답변글 grpstep값
		if (dao.insert(board)) {
			msg = "답변 등록 완료";
			url = "list?boardid="+boardid;
		}
		request.setAttribute("msg", msg);
		request.setAttribute("url", url);
		return "/view/alert.jsp";		
	}	
	@RequestMapping("deleteForm")
	public String deleteForm(HttpServletRequest request, HttpServletResponse response) {
//		int num = Integer.parseInt(request.getParameter("num")); //원글의 게시물 번호
//		request.setAttribute("num", num);
		return "/view/board/deleteForm.jsp";
	}	
	/*
	   1. num,pass 파라미터를 변수에 저장.
	   2. 입력된 비밀번호와 db 비밀번호 검증
	            틀린경우 : 비밀번호 오류 메시지 출력, deleteForm 페이지 이동
	   3. 비밀번호가 맞는 경우 : 게시물 삭제.
	           BoardDao.delete(num)
	           삭제 성공 : 삭제 성공 메시지 출력, list 페이지 이동
	           삭제 실패 : 삭제 실패 메시지 출력, info 페이지 이동
	 */
	@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;
		// 비밀번호 확인
		//pass : 화면에 입력된 비밀번호
		//board.getPass() : db에 등록된 비밀번호 
		if (pass.equals(board.getPass())) {
			if (dao.delete(num)) {
				msg = " 게시글이 삭제 되었습니다";
			} else {
				msg = " 게시글 삭제를 실패 하였습니다";
			}
			url = "list?boardid="+board.getBoardid();
		}
		request.setAttribute("msg", msg);
		request.setAttribute("url", url);
		return "/view/alert.jsp";
	}
}

package model;

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

import org.apache.ibatis.session.SqlSession;

import model.mapper.BoardMapper;

public class BoardDao {
    private Class<BoardMapper> cls = BoardMapper.class;
    private Map<String,Object> map = new HashMap<>();
    
	public int boardCount(String boardid, String column, String find) {
		SqlSession session = DBConnection.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 {
			DBConnection.close(session);
		}
		return 0;
	}

	public List<Board> list
	    (int pageInt, int limit, String boardid, String column, String find) {
		//pageInt : 조회하는 페이지번호.
		//limit   : 페이지당 조회되는 게시물 건수. 한페이지에 10건씨만 조회 
		//boardid : 게시판 종류. 1:공지사항, 2:자유게시판, 3:QNA
		SqlSession session = DBConnection.getConnection();
		try {
			map.clear();
			map.put("boardid",boardid);
			map.put("column",column);
			map.put("find",find);
			/*
			 * pageInt   start    end 
			 *    1 :     1       10   => 1페이지는 1 ~ 10번까지 게시물
			 *    2 :     11      20   => 1페이지는 11 ~ 20번까지 게시물
			 */
			map.put("start",(pageInt-1)*limit + 1);
			map.put("end", pageInt*limit);
			return session.getMapper(cls).list(map);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
		return null;
	}
	public int maxnum() {
		SqlSession session = DBConnection.getConnection();
		try {
			return session.getMapper(cls).maxnum();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
		   DBConnection.close(session);
		}
		return 0;
	}
	
	public boolean insert(Board board) {
		SqlSession session = DBConnection.getConnection();
		try {
			session.getMapper(cls).insert(board);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
		return false;
	}	
	public Board selectOne(int num) {
		//num : 게시글 번호. board 테이블의 기본키값
		SqlSession session = DBConnection.getConnection();
		try {
		   return session.getMapper(cls).selectOne(num);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
		return null;
	}
	public void readcntAdd(int num) {
		SqlSession session = DBConnection.getConnection();
		try {
			session.getMapper(cls).readcntAdd(num);		
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
	}

	public boolean update(Board board) {
		SqlSession session = DBConnection.getConnection();
		try {
			int cnt = session.getMapper(cls).update(board);
			return cnt > 0;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
		return false;
	}

	public void grpStepAdd(int grp, int grpstep) {
		SqlSession session = DBConnection.getConnection();
		try {
			session.getMapper(cls).grpStepAdd(grp,grpstep);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
	}
	public boolean delete(int num) {
		SqlSession session = DBConnection.getConnection();
		try {
			int cnt = session.getMapper(cls).delete(num);
			if (cnt > 0) return true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
		return false;
	}

	public List<Board> mainlist(String boardid) {
		SqlSession session = DBConnection.getConnection();
		try {
			map.clear();
			map.put("boardid",boardid);
			return session.getMapper(cls).mainlist(map);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(session);
		}
		return null;
	}	
}

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.Member;

public interface MemberMapper {

	@Insert("insert into member (id,pass,name,gender,tel,email,picture)"
			+ " values(#{id},#{pass},#{name},#{gender},#{tel},#{email},#{picture})")
	int insert(Member mem);

	@Select({"<script>",
		   "select * from member ",
		   "<if test='id != null'> where id=#{id}</if>",
		   "order by id",
		"</script>"}) 
	List<Member> select(Map<String, Object> map);

	@Update("update member set name=#{name}, gender=#{gender}, email=#{email}, "
			+ " tel=#{tel}, picture=#{picture} where id=#{id}")
	int update(Member mem);

	@Delete("delete from member where id=#{id}")
	int delete(String id);

	@Select("select id from member where email = #{email} and tel = #{tel}")
	String idSearch(@Param("email") String email, @Param("tel") String tel);

	@Select("select pass from member " 
	          + " where id =#{id}  and email = #{email} and tel = #{tel}")
	String pwSearch(Map<String, Object> map);

	@Update("update member set pass=#{pass} where id=#{id}")
	int updatePass(@Param("id") String id, @Param("pass") String pass);

}
728x90
반응형