실습(MVC(board))
- [Web_JSP] 18 이어서
1. config.xml
<?xml version="1.0" encoding="UTF-8"?>
http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias type="com.board.app.domain.vo.MemberVO" alias="memberVO"/>
<typeAlias type="com.board.app.domain.vo.FileVO" alias="fileVO"/>
<typeAlias type="com.board.app.domain.vo.BoardVO" alias="boardVO"/>
<typeAlias type="com.board.app.domain.vo.BoardDTO" alias="boardDTO"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/board"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/mapper/MemberMapper.xml"/>
<mapper resource="com/mybatis/mapper/BoardMapper.xml"/>
<mapper resource="com/mybatis/mapper/FileMapper.xml"/>
</mappers>
</configuration>
2. BoardListOk.java
package com.board.app.board;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.app.action.Action;
import com.board.app.action.ActionInfo;
import com.board.app.domain.dao.BoardDAO;
public class BoardListOk implements Action{
@Override
public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
HashMap<String, Integer> boardMap = new HashMap<>();
ActionInfo actionInfo = new ActionInfo();
BoardDAO boardDAO = new BoardDAO();
//전체 게시글 개수
int total = boardDAO.getTotal();
//사용자가 요청한 페이지
String temp = req.getParameter("page");
//사용자가 요청한 페이지가 null이면 1페이지를,
//null이 아니면 요청한 페이지를 page에 담아준다.
int page = temp == null ? 1 : Integer.parseInt(temp);
//한 페이지에 출력되는 게시글의 개수
int rowCount = 10;
//한 화면에 나오는 페이지 번호 수
int pageSize = 10;
//페이지에서 출력되는 게시글 중 첫번째 게시글의 인덱스
int startRow = (page - 1) * rowCount;
//화면에 출력되는 페이지 번호 중
//시작 페이지(1, 11, 21, ....)
int startPage = ((page - 1) / pageSize) * pageSize + 1;
//끝 페이지(10, 20, 30, ...)
int endPage = startPage + pageSize - 1;
//실제 마지막 게시글이 출력되는 마지막 페이지 번호
int realEndPage = (int)Math.ceil(total / (double)rowCount);
//만약 화면에서의 마지막 페이지가 실제 마지막 페이지보다 크다면,
//실제 마지막 페이지를 endPage에 담아준다.
//endPage는 항상 10단위로 끝나기 때문에, 14페이지가 마지막 페이지일 경우
//14페이지를 endPage에 담아준다.
endPage = endPage > realEndPage ? realEndPage : endPage;
//DB에서 필요한 데이터를 Map에 담는다.
boardMap.put("startRow", startRow);
boardMap.put("rowCount", rowCount);
//시작 인덱스와, 개수를 전달하여 게시글 목록을 가져온 뒤 requestScope에 담아준다.
req.setAttribute("boardList", boardDAO.selectAll(boardMap));
//현재 페이지를 requestScope에 담아준다.
req.setAttribute("page", page);
req.setAttribute("startPage", startPage);
req.setAttribute("endPage", endPage);
req.setAttribute("realEndPage", realEndPage);
req.setAttribute("total", total);
actionInfo.setRedirect(false);
actionInfo.setPath("/app/board/boardList.jsp");
return actionInfo;
}
}
3. BoardWrite.java
package com.board.app.board;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.board.app.action.Action;
import com.board.app.action.ActionInfo;
import com.board.app.domain.dao.MemberDAO;
public class BoardWrite implements Action{
@Override
public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
HttpSession session = req.getSession();
MemberDAO memberDAO = new MemberDAO();
ActionInfo actionInfo = new ActionInfo();
String memberId = memberDAO.getInfo((Integer)session.getAttribute("memberNumber")).getMemberId();
req.setAttribute("memberId", memberId);
req.setAttribute("page", req.getParameter("page"));
actionInfo.setRedirect(false);
actionInfo.setPath("/app/board/boardWrite.jsp");
return actionInfo;
}
}
4. BoardWriteOk.java
package com.board.app.board;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.app.action.Action;
import com.board.app.action.ActionInfo;
import com.board.app.domain.dao.BoardDAO;
import com.board.app.domain.dao.FileDAO;
import com.board.app.domain.vo.BoardVO;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
public class BoardWriteOk implements Action {
@Override
public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
String uploadPath = "D:\\web_1900_hds\\jsp\\workspace\\board\\WebContent\\upload";
int fileSize = 1024 * 1024 * 5; //5M
BoardDAO boardDAO = new BoardDAO();
FileDAO fileDAO = new FileDAO();
BoardVO boardVO = new BoardVO();
ActionInfo actionInfo = new ActionInfo();
MultipartRequest multipartRequest = new MultipartRequest(req, uploadPath, fileSize, "UTF-8", new DefaultFileRenamePolicy());
boardVO.setBoardTitle(multipartRequest.getParameter("boardTitle"));
boardVO.setBoardContent(multipartRequest.getParameter("boardContent"));
//세션은 req로 받아야 한다.
boardVO.setMemberNumber((Integer)req.getSession().getAttribute("memberNumber"));
//게시글 추가
boardDAO.insert(boardVO);
//파일 추가
fileDAO.insert(multipartRequest, boardDAO.getSeq());
actionInfo.setRedirect(true);
actionInfo.setPath(req.getContextPath() + "/board/BoardListOk.bo");
return actionInfo;
}
}
5. BoardUpdate.java
package com.board.app.board;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.app.action.Action;
import com.board.app.action.ActionInfo;
import com.board.app.domain.dao.BoardDAO;
public class BoardUpdate implements Action{
@Override
public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
int page = Integer.parseInt(req.getParameter("page"));
int boardNumber = Integer.parseInt(req.getParameter("boardNumber"));
ActionInfo actionInfo = new ActionInfo();
BoardDAO boardDAO = new BoardDAO();
// 회원의 번호로 게시글의 정보 뿐만 아니라 회원의 아이디까지 가져와주는 쿼리 실행
req.setAttribute("board", boardDAO.selectDetail(boardNumber));
req.setAttribute("page", page);
actionInfo.setRedirect(false);
actionInfo.setPath("/app/board/boardUpdate.jsp");
return actionInfo;
}
}
6. BoardUpdateOk.java
package com.board.app.board;
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.app.action.Action;
import com.board.app.action.ActionInfo;
import com.board.app.domain.dao.BoardDAO;
import com.board.app.domain.dao.FileDAO;
import com.board.app.domain.vo.BoardVO;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
public class BoardUpdateOk implements Action {
@Override
public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
String uploadPath = "D:\\web_1900_hds\\jsp\\workspace\\board\\WebContent\\upload";
int fileSize = 1024 * 1024 * 5; //5M
BoardVO boardVO = new BoardVO();
BoardDAO boardDAO = new BoardDAO();
FileDAO fileDAO = new FileDAO();
ActionInfo actionInfo = new ActionInfo();
int boardNumber = 0, page = 0;
MultipartRequest multipartRequest = new MultipartRequest(req, uploadPath, fileSize, "UTF-8", new DefaultFileRenamePolicy());
page = Integer.parseInt(multipartRequest.getParameter("page"));
boardNumber = Integer.parseInt(multipartRequest.getParameter("boardNumber"));
boardVO.setBoardTitle(multipartRequest.getParameter("boardTitle"));
boardVO.setBoardContent(multipartRequest.getParameter("boardContent"));
boardVO.setBoardNumber(boardNumber);
boardDAO.update(boardVO);
fileDAO.select(boardNumber).forEach(file -> {
File f = new File(uploadPath, file.getFileName());
if(f.exists()) { f.delete();}
});
fileDAO.delete(boardNumber);
fileDAO.insert(multipartRequest, boardNumber);
actionInfo.setRedirect(true);
//목록보기(페이지 기억)
actionInfo.setPath(req.getContextPath() + "/board/BoardListOk.bo?page=" + page);
return actionInfo;
}
}
7. BoardDetailOk.java
package com.board.app.board;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.app.action.Action;
import com.board.app.action.ActionInfo;
import com.board.app.domain.dao.BoardDAO;
import com.board.app.domain.dao.FileDAO;
public class BoardDetailOk implements Action {
@Override
public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//사용자가 선택한 게시글 번호를 파라미터로 전달받는다.
int boardNumber = Integer.parseInt(req.getParameter("boardNumber"));
int page = Integer.parseInt(req.getParameter("page"));
BoardDAO boardDAO = new BoardDAO();
FileDAO fileDAO = new FileDAO();
ActionInfo actionInfo = new ActionInfo();
//게시글 번호로 조회한 게시글의 전체 정보를 requestScope에 저장한다.
req.setAttribute("board", boardDAO.selectDetail(boardNumber));
req.setAttribute("page", page);
req.setAttribute("files", fileDAO.select(boardNumber));
//상세보기로 왔다면, 조회수를 1 증가시켜준다.
boardDAO.updateReadCount(boardNumber);
//requestScope에 데이터를 담았기 때문에 forward로 페이지까지 req객체를 유지한다.
actionInfo.setRedirect(false);
actionInfo.setPath("/app/board/boardDetail.jsp");
return actionInfo;
}
}
8. BoardDeleteOk.java
package com.board.app.board;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.app.action.Action;
import com.board.app.action.ActionInfo;
import com.board.app.domain.dao.BoardDAO;
public class BoardDeleteOk implements Action{
@Override
public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
int boardNumber = Integer.parseInt(req.getParameter("boardNumber"));
BoardDAO boardDAO = new BoardDAO();
ActionInfo actionInfo = new ActionInfo();
boardDAO.delete(boardNumber);
actionInfo.setRedirect(true);
actionInfo.setPath(req.getContextPath() + "/board/BoardListOk.bo");
return actionInfo;
}
}
'웹 개발 > JSP' 카테고리의 다른 글
[Web_JSP] 21 (0) | 2022.06.09 |
---|---|
[Web_JSP] 20 (0) | 2022.06.08 |
[Web_JSP] 18 (0) | 2022.06.06 |
[Web_JSP] 17 (0) | 2022.06.05 |
[Web_JSP] 16 (0) | 2022.06.04 |