MVC 모델2로 게시판 만들기

Model2Board라고 Dynamic Web project를 하나 만들어 준다.

① 커넥션풀을 설정하자
그 다음에 server.xml에 context 경로 링크가 자동설정 되려면 Model2Board 프로젝트를 한번 실행해 줘야 한다.
Run on Server 버튼을 눌러 실행해준다.

Servers 폴더의 server.xml 에 들어가, 맨 아래쪽에 Context 태그를 보면 Model2Board가 생긴 것을 알수 있다.

* 커넥션풀을 사용하려면 commons.apache.org/에서 3개의 JAR을 다운받아, WebContent / WEB-INF / lib에 복사해서넣어줘야 한다.
다음, 아래 Model2Board의 Context 태그에 <Resource 태그를 추가해준다.

② DAO 클래스를 만들자
Java Resources 폴더의 src 폴더에 model이라는 이름으로 패키지를 만든다.
model 클래스의 오른쪽마우스 class를 생성하고, BoardDAO라는 이름으로 만든다.
BoardDAO.java
package model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import model.BoardBean;
public class BoardDAO {
Connection con;
PreparedStatement pstmt;
ResultSet rs;
public void getcon() {
try {
<!--String dbURL = "jdbc:oracle:thin:@DESKTOP-OHJGL9K:1522:xe";
String dbID = "c##BBC";
String dbPassword = "1234";
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(dbURL, dbID, dbPassword);-->
String dbURL = "jdbc:mysql://localhost:3306/WebMarketDB?serverTimezone=UTC";
String dbID = "root";
String dbPassword = "1234";
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(dbURL, dbID, dbPassword);
} catch (Exception e) {
e.printStackTrace();
}
}
//전체 게시글의 갯수를 리턴하는 메소드
public int getAllCount(){
int count = 0;
getcon();
try {
//쿼리 준비
String sql ="select count(*) from board";
pstmt =con.prepareStatement(sql);
//쿼리 실행후 결과를 리턴
rs = pstmt.executeQuery();
// count는 단일 행함수이기때문에 행이1개밖에 없으므로,
// while문을 돌릴 필요가 없다.
if(rs.next()){ //데이터가 있다면,
count = rs.getInt(1);
}
con.close();
}catch(Exception e) {
e.printStackTrace();
}
return count;
}
//모든 화면에 보여질 데이터 10개씩 추출해서 리턴하는 매소드
public Vector<BoardBean> getAllBoard(int startRow , int endRow){
Vector<BoardBean> v = new Vector<>(); //벡터타입으로 리턴해줘야 하기 때문에
getcon(); //겟커넥션을 이용해서 데이터베이스에 연결하고,
try {
//쿼리 준비
//select안의 select 문인 서브쿼리이다.
//ref(글그룹)을 기준으로 desc 내림차순으로 정렬했다. 최신글이 가장위로
//re_step(답변형 글그룹)은 오름차순으로 정렬했다.
//그 테이블을 A라고 지칭하고,
//Rownum(순번매기기)은 오라클만 가지고 있는 column명이다. 자동으로 무조건 만들어진다.
// Rnum이 startRow보다 크고, endRow보다 작은 레코드들을 가져와라
// 결론은 자식글까지 합쳐서 최신글 10개를 가져오라는 의미이다.
String SQL = "select * from (select A.* ,Rownum Rnum from (select *from board order by ref desc ,re_stop asc)A)"
+ "where Rnum >= ? and Rnum <= ?";
//쿼리실행할 객체 선언
pstmt = con.prepareStatement(SQL);
//?값을 대입
pstmt.setInt(1,startRow);
pstmt.setInt(2,endRow);
//쿼리를 실행후 결과를 저장
rs = pstmt.executeQuery();
//데이터 개수가 몇개인지 모르기에 반복문을 이용하여 데이터를 추출
while(rs.next()){
//데이터를 패키징(가방 = Boardbean클래스를 이용)해줌
BoardBean bean = new BoardBean();
bean.setNum(rs.getInt(1));
bean.setWrite(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_stop(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
//패키징한 데이터를 벡터에 저장
v.add(bean);
}
con.close();
}catch(Exception e) {
e.printStackTrace();
}
return v;
}
//하나의 게시글을 저장하는 메소드 호출
public void insertBoard(BoardBean bean) {
getcon();
//빈 클래스에 넘어오지 않았던 데이터들을 초기화 해주어야 합니다.
int ref = 0;// 글 그룹을 의미 = 쿼리를 실행시켜 가장큰 ref 값을 가져온후 +1을 더해주면 된다
int re_step = 1;//새글이기에 = 부모 글이기에
int re_level = 1; //새글
try {
//가장큰 ref값을 읽어오는 쿼리 준비
String refSQL = "SELECT max(ref) FROM BOARD";
//쿼리실행 객체
pstmt = con.prepareStatement(refSQL);
//쿼리를 실행후 결과를 리턴
rs = pstmt.executeQuery();
if(rs.next()){//결과 값이 있다면
ref = rs.getInt(1)+1;//최대 값에 +1을 더해서 글 그룹을 설정
}
//실제로 게시글 전체값을 테이블에 저장
String SQL = "INSERT INTO BOARD VALUES(board_seq.NEXTVAL,?,?,?,?,sysdate,?,?,?,0,?)";
pstmt = con.prepareStatement(SQL);
//?의 값을 맵핑
pstmt.setString(1, bean.getWriter());
pstmt.setString(2, bean.getEmail());
pstmt.setString(3, bean.getSubject());
pstmt.setString(4, bean.getPassword());
pstmt.setInt(5, ref);
pstmt.setInt(6, re_stop);
pstmt.setInt(7, re_level);
pstmt.setString(8, bean.getContent());
//쿼리를 실행하시오
pstmt.executeUpdate();
//자원 반납
con.close();
}catch(Exception e) {
e.printStackTrace();
}
}
//BoardInfo 하나의 게시글 리턴하는 메소드
//리턴은 BoardBean 으로 잡아준다.
public BoardBean getOneBoard(int num){
BoardBean bean = new BoardBean();
getcon();
try {
//조회수 증가 쿼리
String readsql = "update board set readcount = readcount+1 where num=?";
pstmt = con.prepareStatement(readsql);
pstmt.setInt(1,num);
pstmt.executeUpdate();
//한 게시글에 대한 정보를 리턴해주는 쿼리를 작성
String SQL = "select * from board where num=?";
//쿼리실행 객체
pstmt = con.prepareStatement(SQL);
pstmt.setInt(1,num);
//쿼리 실행후 결과를 리턴
rs= pstmt.executeQuery();
//하나의 게시글이 존재한다면
if(rs.next()) {
bean.setNum(rs.getInt(1));
bean.setWrite(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_stop(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
}
con.close();
}catch(Exception e) {
e.printStackTrace();
}
return bean;
}
//답변글이 저장되는 메소드
public void reWriteBoard(BoardBean bean){
//부모글 그룹과 글레벨 글 스텝을 읽어드림
int ref =bean.getRef();
int re_step = bean.getRe_step();
int re_level = bean.getRe_level();
getcon();
try {
/////////////////////핵심 코드 ////////////////////////
//부모글 보다 큰 re_level의 값을 전부 1씩 증가시켜줌
String levelsql = "update board set re_level=re_level+1 where ref=? and re_level > ?";
//쿼리 삽입 객체 선언
pstmt = con.prepareStatement(levelsql);
pstmt.setInt(1 , ref);
pstmt.setInt(2 , re_level);
//쿼리 실행
pstmt.executeUpdate();
//답변글 데이터를 저장
String sql ="insert into board values(board_seq.NEXTVAL,?,?,?,?,sysdate,?,?,?,0,?)";
pstmt = con.prepareStatement(sql);
//?에 값을 대입
pstmt.setString(1, bean.getWrite());
pstmt.setString(2, bean.getEmail());
pstmt.setString(3, bean.getSubject());
pstmt.setString(4, bean.getPassword());
pstmt.setInt(5, ref);//부모의 ref 값을 넣어줌
pstmt.setInt(6, re_step+1);//답글이기에 기존 부모글 re_step에 1 증가해서 넣어줌
pstmt.setInt(7, re_level + 1); // 답글이기에 기존 부모글 re_level에 1 증가해서 넣어줌
pstmt.setString(8, bean.getContent());
//쿼리를 실행하시오
pstmt.executeUpdate();
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
//Boardupdate용 Delete시 하나의 게시글을 리턴
//조회수는 증가하지 않고, 하나의 게시글을 리턴하는 메소드
public BoardBean getOneUpdateBoard(int num){
//리턴 타입 선언
BoardBean bean = new BoardBean();
getcon();
try {
//쿼리준비
String SQL = "select * from board where num=?";
//쿼리실행객체
//쿼리실행 객체
pstmt = con.prepareStatement(SQL);
pstmt.setInt(1,num);
//쿼리 실행후 결과를 리턴
rs= pstmt.executeQuery();
if(rs.next()) {
bean.setNum(rs.getInt(1));
bean.setWrite(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_stop(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
}
con.close();
}catch(Exception e) {
e.printStackTrace();
}
return bean;
}
//하나의 게시글을 수정하는 메소드
public void updateBoard(int num ,String subject , String content){
//데이터베이스 연결
getcon();
try {
//쿼리 준비
String sql = "update board set subject=? , content= ? where num = ?";
//쿼리 실행할 객체 선언
pstmt = con.prepareStatement(sql);
//?에 값을 대입 하기
pstmt.setString(1,subject);
pstmt.setString(2,content);
pstmt.setInt(3,num);
//쿼리 실행후 결과를 리턴
pstmt.executeUpdate();
//자원 반납
con.close();
}catch(Exception e) {
e.printStackTrace();
}
}
//하나의 게시글을 삭제하는 매소드
public void deleteBoard(int num){
getcon();
try {
//쿼리 준비
String sql = "delete from board where num=?";
//쿼리 실행할 객체 선언
pstmt = con.prepareStatement(sql);
//?
pstmt.setInt(1,num);
//쿼리 실행
pstmt.executeUpdate();
//자원 반납
con.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
③ bean 클래스를 만든다.
모델 패키지에 BoardBean이라는 클래스를 추가해준다.
BoardBean.java
package model;
public class BoardBean{
private int num;
private String write;
private String email;
private String subject;
private String password;
private String reg_date;
private int ref;
private int re_stop;
private int re_level;
private int readcount;
private String content;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWrite() {
return write;
}
public void setWrite(String write) {
this.write = write;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getReg_date() {
return reg_date;
}
public void setReg_date(String reg_date) {
this.reg_date = reg_date;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getRe_stop() {
return re_stop;
}
public void setRe_stop(int re_stop) {
this.re_stop = re_stop;
}
public int getRe_level() {
return re_level;
}
public void setRe_level(int re_level) {
this.re_level = re_level;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
④ 서블릿 클래스를 만들어준다.
Java Resources 폴더의 src 폴더에서 control 패키지를 만든다.
여기에 BoardListCon이라고 서블릿을 만든다.
BoardListCon.java
package control;
import java.io.IOException;
import java.util.Vector;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardBean;
import model.BoardDAO;
@WebServlet("/BoardListCon.do")
public class BoardListCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//화면에 보여질 게시글의 개수를 지정
int pageSize=10;
//현재 보여지고 있는 페이지의 넘버 값을 읽어드림
String pageNum = request.getParameter("pageNum");
//처음 BoardListCon.do를 실행하면 당연히 PageNum값이 없으므로 null처리를 해줘야한다.
//null 처리
if(pageNum==null){
pageNum="1";
}
//전체 게시글의 갯수 파악
int count = 0;
//jsp페이지 내에서 보여질 게시글의 넘버링 숫자값을 저장하는 변수
int number = 0;
//현재 보여지고 있는 페이지 문자를 숫자로 변환
int currentPage =Integer.parseInt(pageNum);
//전체 게시글의 갯수를 가져와야 하기에 데이터 베이스 객체 생성
BoardDAO bdao = new BoardDAO();
//카운트는 getAllcount()메소드를 쓰겠다.
//boardDAo클래스로 가서 getAllCount 메소드를 정의해준다.
count =bdao.getAllCount();
//현재 보여질 페이지 시작 번호를 설정
int startRow = (currentPage-1)*pageSize+1;
int endRow =currentPage * pageSize;
//최신글 10개를 기준으로 게시글 리턴 받아주는 메소드 호출
Vector<BoardBean> v = bdao.getAllBoard(startRow , endRow);
number = count - (currentPage -1)*pageSize;
/////////////////////////////////////////수정 삭제시 비밀번호가 틀렸다면
String msg =request.getParameter("msg");
////////////////////////////////////////////BoardList.jsp쪽으로 request객체에 담아서 넘겨줌
request.setAttribute("v",v );
request.setAttribute("number",number);
request.setAttribute("pageSize", pageSize);
request.setAttribute("count", count);
request.setAttribute("currentPage", currentPage);
request.setAttribute("msg", msg);
RequestDispatcher dis = request.getRequestDispatcher("BoardList.jsp");
dis.forward(request ,response);
}
}
⑤ WebContent 파일에서 BoardList.jsp 파일을 만들어준다.
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<!--msg에 1이나 2값을 줘서 수정 삭제에 대한 팝업을 만들어라 -->
<c:if test = "${msg != null}">
<<script>
alert("수정/삭제 비밀번호가 틀렸습니다");
</script>
</c:if>
<center>
<h2>전체 게시글 보기</h2>
<table width="700" border="1" bordercolor="skyblue">
<tr height = "40">
<td colspan="5" align="right">
<button onclick="location.href ='BoardWriteForm.jsp'">글쓰기</button>
</td>
</tr>
<tr height = "40">
<td width = "50" align ="center">번호 </td>
<td width = "320" align ="center">제목</td>
<td width = "100" align ="center">작성자 </td>
<td width = "150" align ="center">작성일 </td>
<td width = "80" align ="center">조회수</td>
</tr>
<c:set var="number" value="${number}" /> 글번호number변수를 선언하고 값을 미리받아온다.
<c:forEach var="bean" items="${v}"> //forEach문을 이용하여 원하는 데이터를 뿌려준다.
// 값을 받아와서 써야하기 때문에, el문을 써줘야한다. v를 받아서 하나씩 bean타입으로 빼겟다는 말
<tr height = "40">
<td width = "50" align ="center">${number}</td> //number값은 1씩 줄여줘야한다.
<td width = "320" align ="Left">
<c:if test="${bean.re_step>1}">
<c:forEach var="j" begin="1" end="${(bean.re_step-1)*5}">
</c:forEach>
</c:if>
<a href="BoardInfoControl.do?num=${bean.num}">${bean.subject}</a>
</td>
<td width = "100" align ="Left">${bean.write}</td>
<td width = "150" align ="Left">${bean.reg_date} </td>
<td width = "80" align ="Left">${bean.readcount}</td>
</tr>
<c:set var="number" value="${number-1}" /> //for문이 끝나기전에 number를 1씩감소시킨다.
</c:forEach>
</table>
<!-- 페이지 카운터링 소스 작성 -->
<c:if test="${count>0}">
<c:set var="pageCount" value="${count /pageSize + (count%pageSize == 0 ? 0 : 1 )}" />
<c:set var="startPage" value="${1}" />
<c:if test="${currentPage%10 != 0}">
<!--결과를 정수형으로 리턴 받아야 하기에 fmt -->
<fmt:parseNumber var="result" value="${currentPage/10}" integerOnly="true"/>
<c:set var="startPage" value="${result*10+1}" />
</c:if>
<c:if test="${currentPage%10 == 0}">
<!--결과를 정수형으로 리턴 받아야 하기에 fmt -->
<c:set var="startPage" value="${(result-1)*10+1}" />
</c:if>
<!-- 화면에 보여질 페이지 처리 숫자를 표현 -->
<c:set var="pageBlock" value="${10}" />
<c:set var="endPage" value="${startPage+pageBlock-1}" />
<c:if test="${endPage > pageCount}">
<c:set var="endPage" value="${pageCount}" />
</c:if>
<!--이전 링크를 결지 파악 -->
<c:if test="${startPage > 10}">
<<a href="BoardListCon.do?pageNum=${startPage-10}">[이전]</a>
</c:if>
<!-- 페이징 처리-->
<c:forEach var="i" begin="${startPage}" end="${endPage}">
<a href="BoardListCon.do?pageNum=${i}" style ="text-decoration:none">[${i}]</a>
</c:forEach>
<!-- 다음 -->
<c:if test="${endPage < pageCount}">
<a href="BoardListCon.do?pageNum=${startPage+10}">[다음]</a>
</c:if>
</c:if>
</p>
</center>
</body>
</html>
BoardListCon.java를 실행해서 확인해본다.

BoardList.jsp 파일에서 카운터링 작업을 해준다.

글쓰기를 만들자.

BoardList.jsp에서 글쓰기버튼을 누르면 BoardWirteForm.jsp를 출력하기로 했다.
(자바코드가 안들어가기 때문에, 구지 컨트롤러를 거치지 않고 바로 jsp로 이동하기로 함)
WebContent파일에 BoardWriteForm.jsp 파일을 만든다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2> 게시글 쓰기 </h2>
//BoardWriteProcCon.do 컨트롤러를 실행한다.
<form action = "BoardWriteProcCon.do" method = "post">
<table width ="600" border = "1" bordercolor = "gray">
<tr height="40">
<td align = "center" width ="150">작성자</td>
<td width="450"><input type= "text" name = "write" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">제목</td>
<td width="450"><input type= "text" name = "subject" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">이메일</td>
<td width="450"><input type= "email" name = "email" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">비밀 번호</td>
<td width="450"><input type= "password" name = "password" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">글 내용</td>
<td width="450"><textarea rows= "10" cols = "60" name = "content"></textarea></td>
</tr>
<tr height="40">
<td align = "center" colspan = "2">
<input type= "submit" value="글쓰기">
<input type= "reset" value="다시 작성">
<button onclick="location.href='BoardListCon.do'">전체 게시글 보기</button>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>

Java Resources 폴더의 src폴더의 contrl 패키지에 BoardWriteProcCon 서블릿을 만든다.
@webServlet에는 "/BoardWriteProcCon.do"라고 지정해준다.
BoardWriteProcCon.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardBean;
import model.BoardDAO;
@WebServlet("/BoardWriteProcCon.do")
public class BoardWriteProcCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//빈클래스로 데이터를 읽어 드림
BoardBean bean = new BoardBean();
bean.setWrite(request.getParameter("writer"));
bean.setSubject(request.getParameter("subject"));
bean.setEmail(request.getParameter("email"));
bean.setPassword(request.getParameter("password"));
bean.setContent(request.getParameter("content"));
// DAO 객체 생성시킨다.
BoardDAO bdao = new BoardDAO();
//데이터 저장 메소드를 호출 , 데이터 베이스 쪽으로 빈 클래스를 넘겨줌
bdao.insertBoard(bean); //BoardDAO.java로가서 insertBoard메소드를 만들러간다
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request ,response);
}
}
모델1에서는 BoardBean 객체 생성시킨 다음, setProperty 하였는데 모델2에서는 일일이 다 만들어줘야한다.




글읽기를 해보자

Java Resources 폴더의 src폴더의 control패키지에서 BoardInfoControl이라는 서블릿을 만든다.
@webServlet("/BoardInfoContrl.do")라고 바꿔준다.
BoardInfoControl.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardBean;
import model.BoardDAO;
@WebServlet("/BoardInfoControl.do")
public class BoardInfoControl extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//BoardList.jsp에서 num을 여기로 넘겼기 때문에 num을 받아온다.
//num(pk)으로 한 게시글의 정보를 리턴해주기 위해 받아온거다.
//공백 제거후 정수형으로 바뀜
int num = Integer.parseInt(request.getParameter("num").trim());
//데이터 베이스 접근
BoardDAO bdao = new BoardDAO();
//boardbean타입으로 num기준으로 하나의 게시글을 리턴
//getOneBoard 메소드는 BoardDAO.java로 가서 생성해준다.
BoardBean bean = bdao.getOneBoard(num);
request.setAttribute("bean", bean);
//RequestDispatcher 인터페이스를 이용
RequestDispatcher dis = request.getRequestDispatcher("BoardInfo.jsp");
dis.forward(request ,response);
}
}
WebContent 파일에서 BoardInfo.jsp를 만들자.
BoardInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2>게시글 보기</h2>
<table width = "600" border = "1">
<tr height = "40">
<td width = "100" align ="center">글번호 </td>
<td width = "180" align ="left">${bean.num}</td>
<td width = "120" align ="center">조회수 </td>
<td width = "180" align ="center">${bean.readcount} </td>
</tr>
<tr height = "40">
<td width = "100" align ="center">작성자 </td>
<td width = "180" align ="left">${bean.writer}</td>
<td width = "120" align ="center">작성일 </td>
<td width = "180" align ="center">${bean.reg_date}</td>
</tr>
<tr height = "40">
<td width = "120" align ="center">이메일 </td>
<td colspan = "3" align ="center">${bean.email}</td>
</tr>
<tr height = "40">
<td width = "120" align ="center">제목 </td>
<td colspan = "3" align ="center">${bean.subject}</td>
</tr>
<tr height = "80">
<td width = "120" align ="center">글 내용 </td>
<td colspan = "3" align ="center">${bean.content}</td>
</tr>
<tr height = "40">
<td align ="center" colspan = "4">
<input type="button" value="답글쓰기"
onclick="location.href='BoardReWriteCon.do?num=${bean.num}&ref=${bean.ref}&re_stop=${bean.re_stop}&re_level=${bean.re_level}'">
<input type="button" value="수정하기" onclick="location.href='BoardUpdateCon.do?num=${bean.num}'">
<input type="button" value="삭제하기" onclick="location.href='BoardDeleteCon.do?num=${bean.num}'">
<input type="button" value="목록보기" onclick="location.href='BoardListCon.do'">
</td>
</tr>
</table>
</center>
</body>
</html>
이제 , 답글쓰기를 하자
BoardInfo.jsp에서 답글쓰기를 누르면 BoardReWriteCon으로 간다.
모델1에서는 답글쓰기누르면 BoardReWriteForm.jsp로가서 BoardReWriteProc.jsp 로 갔었다.
하지만 모델2에서는 서블릿으로 먼저 간다음 BoardReWirteForm.jsp로 가줘야한다.
JavaResources 폴더의 src폴더에 control패키지에서 BoardReWirteCon 서블릿을 만들어 준다.
@WebServlet("/BoardReWirteCon.do")로 바꿔준다.
BoardReWirteCon.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/BoardReWriteCon.do")
public class BoardReWriteCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//답글쓰기는 num가 시퀀스가 있기때문에 자동으로 부여가 된다.
//num이 필요가 없다.
int ref = Integer.parseInt(request.getParameter("ref"));
int re_step = Integer.parseInt(request.getParameter("re_step"));
int re_level = Integer.parseInt(request.getParameter("re_level"));
//이제, jsp쪽으로 떠넘겨줘야한다.왜? 답변글써야하니까 for문으로
request.setAttribute("ref", ref);
request.setAttribute("re_step", re_step);
request.setAttribute("re_level", re_level);
RequestDispatcher dis = request.getRequestDispatcher("BoardReWriteForm.jsp");
dis.forward(request ,response);
}
}
이제, WebContent파일에 BoardReWirteForm.jsp를 만든다.
BoardReWirteForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2>답변글 입력하기</h2>
<form action="BoardReWriteProcCon.do" method="post">
<table width="600" border="1" bordercolor="gray" >
<tr height = "40">
<td width="150" align="center"> 작성자</td>
<td width="450"><input type ="text" name="write" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">제목</td>
<td width="450"><input type ="text" name="subject" value ="[답변]" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">이메일</td>
<td width="450"><input type ="email" name="email" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">비밀 번호</td>
<td width="450"><input type ="password" name="password" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">글 내용</td>
<td width="450"><textarea rows="10" cols="60" name="content"></textarea></td>
</tr>
<!--form에서 사용자로부터 입력바지 않고 데이터를 넘김 -->
<tr height ="40">
<td align ="center" colspan="2">
<input type="hidden" name ="ref" value="${ref}">
<input type="hidden" name ="re_stop" value="${re_stop}">
<input type="hidden" name ="re_level" value="${re_level}">
<input type="submit" value="답글 쓰기 완료">
<input type="reset" value="취소">
<input type="button" onclick="location.href='BoardListCon.do'" value="전체글보기">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
Java Resources 폴더의 src 폴더의 control에서 BoardReWirteProcCon 서블릿을 만든다.
@WebServlet("/BoardReWirteProcCon.do") 라고 수정해준다.
BoardReWirteProcCon.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardBean;
import model.BoardDAO;
@WebServlet("/BoardReWriteProcCon.do")
public class BoardReWriteProcCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//빈에 넘어온 데이터를 저장하자.
BoardBean bean= new BoardBean();
bean.setWrite(request.getParameter("writer"));
bean.setSubject(request.getParameter("subject"));
bean.setEmail(request.getParameter("email"));
bean.setPassword(request.getParameter("password"));
bean.setContent(request.getParameter("content"));
//모델2에서는 이제, ref, re_step, re_level도 넘어온다.
bean.setRef(Integer.parseInt(request.getParameter("ref")));
bean.setRe_stop(Integer.parseInt(request.getParameter("re_step")));
bean.setRe_level(Integer.parseInt(request.getParameter("re_level")));
//데이터 베이스 객체 생성
//dao에서 reWirteBoard를 이용하여 bean데이터를 데이터베이스에 저장한다.
BoardDAO bdao = new BoardDAO();
bdao.reWriteBoard(bean);
//컨트롤 서블릿부터 가야하니까
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request ,response);
}
}
글 수정을 만들자.


Java Resources 폴더의 src폴더의 control에서 BoardUpdateCon.java 서블릿을 만들어준다.
BoardUpdateCon.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardBean;
import model.BoardDAO;
@WebServlet("/BoardUpdateCon.do")
public class BoardUpdateCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//BoardList.jsp에서 num이 넘어온다.
int num = Integer.parseInt(request.getParameter("num"));
//데이터 베이스에서 num을 기준으로 하나의 게시글에 대한 정보를 리턴 메소드 호출
//BoardDAO.java로 가서 getOneUpdateBoard메소드를 생성한다.
BoardDAO bdao = new BoardDAO();
BoardBean bean = bdao.getOneUpdateBoard(num);
request.setAttribute("bean", bean);
RequestDispatcher dis = request.getRequestDispatcher("BoardUpdateForm.jsp");
dis.forward(request ,response);
}
}
이제, WebContent파일에서 BoardUpdateForm.jsp 파일을 만든다.
BoardUpdateForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<center>
<h2> 게시글 수정</h2>
<form action="BoardUpdateProcCon.do" method ="post">
<table width = "600" border = "1">
<tr height= "40">
<td width="120" align="center">작성자</td>
<td width="180" align="center">${bean.writer}</td>
<td width="120" align="center">작성자</td>
<td width="180" align="center">${bean.reg_date}</td>
</tr>
<tr height= "40">
<td width="120" align="center">제목</td>
<td width="480" colspan="3"> <input type="text" name="subject" value="${bean.subject}" size="60"></td>
</tr>
<tr height= "40">
<td width="120" align="center">패스워드</td>
<td width="480" colspan="3"> <input type="password" name="pass" size="60"></td>
</tr>
<tr height= "40">
<td width="120" align="center">글내용</td>
<td width="480" colspan="3"><textarea rows="10" cols="60" name="content" align="left">${bean.content}</textarea></td>
</tr>
<tr height= "40">
<td colspan="4" align="center">
<input type="hidden" name="num" value="${bean.num}">
// 모델1에서는 hidden으로 num값만 보냈고,
// 넘어가서는 데이터베이스에 접근하여 dao에 있는 getpass 메소드를 가져와
// 기존의 비밀번호와 보낸 비밀번호를 비교하였다.
// 그러나, 이번에는 기존에 저장된 password를 hidden으로 보내고, 새로입력한
// password를 같이보내서, 구지 데이터베이스 새로 접근하지 않고
// 비교하는 게 좋겠다.
<input type="hidden" name="password" value="${bean.password}">
<input type="submit" value="글수정">
<input type="button" onclick = "location.href='BoardListCon.do'" value="전체 글 보기">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
Java Reosurces 폴더의 src 폴더의 control 에서 BoardUpdateProcCon 서블릿을 만든다.
BoardUpdateProcCon.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardBean;
import model.BoardDAO;
@WebServlet("/BoardUpdateProcCon.do")
public class BoardUpdateProcCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//폼에서 넘어온 데이터를 받아줌
// 패스워드는 여기서 비교만 하기에 읽어들이기만 하면된다.
// num를 기준으로 데이터를 수정해줘야하기에 num은 반드시 데이터베이스로 넘겨줘야한다.
// 글내용과 글제목도 수정할 수 있기에, 이것도 데이터베이스로 넘긴다.
int num = Integer.parseInt(request.getParameter("num"));
String password = request.getParameter("password");
String pass = request.getParameter("pass");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
//password값과 pass값을 비교 해야합니다
if(password.equals(pass)) {//패스워드가 같다면 데이터를 수정
BoardDAO bdao = new BoardDAO(); //객체생성, 메소드호출하고 멤버변수사용위해
//데이터를 수정하기에 num 값은 필요하다.
// num를 기준으로 데이터를 수정해줘야하기에 num은 반드시 데이터베이스로 넘겨줘야한다.
// 글내용과 글제목도 수정할 수 있기에, 이것도 데이터베이스로 넘긴다.
// 3개의 데이터면 구지 빈으로 넘길 필요 없겠다.
//BoardDAO.java로 가서 updateBoard 생성한다.
bdao.updateBoard(num,subject,content);
//수정이 완료 되었다면 전체 게시글 보기로 이동
request.setAttribute("msg","수정이 완료 되었습니다");
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request ,response);
}else {
//비밀번호가 틀렸다면 이전 페이지로 이동
request.setAttribute("msg","수정시 비밀번호가 맞지 않습니다");
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request ,response);
}
}
}
삭제하기를 하자.
Java Resources 폴더의 src 폴더의 control에서 BoardDeleteCon 서블릿을 만든다.
BoardDeleteCon.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardBean;
import model.BoardDAO;
/**
* Servlet implementation class BoardDeleteCon
*/
@WebServlet("/BoardDeleteCon.do")
public class BoardDeleteCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//글 삭제이기에 글번호를 입력받는다.
int num = Integer.parseInt(request.getParameter("num"));
//데이터 베이스에 접근하여 하나의 게시글에 대한 정보를 리턴 메소드 호출
BoardDAO bdao = new BoardDAO();
BoardBean bean = bdao.getOneUpdateBoard(num); //조회수를 증가시키지 않는 메소드
request.setAttribute("bean", bean);
RequestDispatcher dis = request.getRequestDispatcher("BoardDeleteForm.jsp");
dis.forward(request ,response);
}
}
WebContent폴더에서 BoardDeleteForm.jsp를 만든다.
BoardDeleteForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 삭제</title>
</head>
<body>
<center>
<form action = "BoardDeleteProCon.do" method="post">
<table width = "600" border = "1">
<tr height= "40">
<td width="120" align="center">패스워드</td>
<td width="480" colspan="3"> <input type="password" name="pass" size="60"></td>
</tr>
<tr height="40">
<td align ="center" colspan="4">
<input type ="hidden" name ="num" value="${bean.num}">
<input type ="hidden" name ="password" value="${bean.password}">
<input type ="submit" value="글삭제">
<input type ="button" onclick="location.href='BoardListCon.do'"value="전체글보기 ">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
Java Resources 폴더의 src폴더의 control에 BoardDeleteProcCon.java 서블릿을 만든다.
BoardDeleteProcCon.java
package control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.BoardDAO;
@WebServlet("/BoardDeleteProCon.do")
public class BoardDeleteProCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
reqPro(request ,response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//사용자로 부터 넘어온 데이터 3개를 받아줍니다
int num = Integer.parseInt(request.getParameter("num"));
String password = request.getParameter("password");
String pass = request.getParameter("pass");
//기존 패스워드 값과 delete form에서 작성한 패스워드를 비교
if(pass.equals(password)){
BoardDAO bdao = new BoardDAO();
//패스워드가 둘다 같다면
//BoardDAO.java로 가서 deleteBoard 메소드를 생성한다.
bdao.deleteBoard(num);
//수정이 완료 되었다면 전체 게시글 보기로 이동
request.setAttribute("msg","삭제가 완료 되었습니다");
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request ,response);
}else{
//비밀번호가 틀렸다면 이전 페이지로 이동
request.setAttribute("msg","수정시 비밀번호가 맞지 않습니다");
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request ,response);
}
}
}
'백엔드 > JSP' 카테고리의 다른 글
jsp 로 alert창 띄우고 페이지 이동시키기 (2) | 2021.05.03 |
---|---|
MVC 모델1로 게시판 만들기 (2) | 2021.04.28 |
MVC 패턴 연습> 회원 가입과 회원 보기를 모델2로 고치기 (0) | 2021.04.27 |
인프런 JSP MVC 모델2 ① (0) | 2021.04.26 |
인프런 JSP 강의 정리 (0) | 2021.04.26 |