KIC/MyBatis
day59 - MyBatis(게시판 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