본문 바로가기

웹 개발/JSP

[Web_JSP] 19

실습(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