수업(국비지원)/Mybatis
[MYBATIS] (MVC 2) 게시판 목록 보기 시간 수정(list, BoardController)
byeolsub
2023. 4. 21. 21:06
📌 list.java 추가
<%@ 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">
<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의 정수값
/* 문제
* dao.boardCount(boardid) :
* board 테이블의 boardid값에 해당하는 게시물 건수 리턴
*/
int boardcount = dao.boardCount(boardid); //boardcount : 전체 게시판 종류별 등록된 게시물의 건수
List<Board> list = dao.list(pageInt, limit, boardid); //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";
}
}