JSP 9일 (23.04.04)

Jane·2023년 4월 4일
0

IT 수업 정리

목록 보기
98/124

1. 게시판 글 작성하기

BoardController.java (조건문 추가)

		else if(com.equals("/write_view.do")) {
			/*http://localhost:8282/servlet_yjy_board/write_view.do*/
			
			viewPage = "write_view.jsp";
		} else if(com.equals("/write.do")) {
			/*http://localhost:8282/servlet_yjy_board/write.do*/
			command = new BWriteCommand();
			command.execute(request, response);
			viewPage = "list.do";			
		}

BWriteCommand.java

package edu.global.board.command;

import java.io.IOException;
import java.util.List;

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 edu.global.board.dao.BDao;
import edu.global.board.vo.BoardVO;

public class BWriteCommand implements BCommand {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {

		String bname = request.getParameter("bname");
		String btitle = request.getParameter("btitle");
		String bcontent = request.getParameter("bcontent");
		
		
		BDao dao = new BDao(); 
		dao.write(bname, btitle, bcontent);

	}

}

BDao.java (함수 추가)

	/* 5. Content Write */
	public int write(String bname, String btitle, String bcontent) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;

		int rn = 0;
		try {
			String query = "insert into mvc_board (bid, bname, btitle, bcontent, bhit, bgroup, bstep, bindent) values (mvc_board_seq.nextval, ?, ?, ?, 0, mvc_board_seq.currval, 0, 0 )";
			connection = dataSource.getConnection();
			preparedStatement = connection.prepareStatement(query);

			preparedStatement.setString(1, bname);
			preparedStatement.setString(2, btitle);
			preparedStatement.setString(3, bcontent);
			rn = preparedStatement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (preparedStatement != null) {
					preparedStatement.close();
				}
				if (connection != null) {
					connection.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return rn;
	}

2. 게시판 답변 파트

  • BID : 댓글을 등록해도 BID는 하나씩 증가
    (글이든 댓글이든 생성된만큼 증가한다)
  • BGROUP : 원본글 밑의 댓글임을 확인할 수 있도록 그룹을 지어준다.
    (원본글의 BGROUP은 BID, 댓글의 BGROUP은 원본글의 BGROUP)
  • BSTEP / BINDENT (글과 댓글의 좌표 표현 / BGROUP 기준)

2-1. 답변 화면

BoardController.java (조건문 추가)

		else if(com.equals("/reply_view.do")) {
			/*http://localhost:8282/servlet_yjy_board/reply_view.do?bid=19*/
			command = new BReplyViewCommand();
			command.execute(request, response);
			viewPage = "reply_view.jsp";		
		}

BReplyViewCommand.java

package edu.global.board.command;

import java.io.IOException;
import java.util.List;

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 edu.global.board.dao.BDao;
import edu.global.board.vo.BoardVO;

public class BReplyViewCommand implements BCommand {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {

		String bid = request.getParameter("bid");
		
		BDao dao = new BDao();
		
		BoardVO vo = dao.replyView(bid);
		
		request.setAttribute("reply_view", vo);
	}

}
}

BDao.java (함수 추가)

/* 6. Reply View */
	public BoardVO replyView(String strId) {
		BoardVO board = null;

		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {

			String query = "select * from mvc_board where bid = ?";

			connection = dataSource.getConnection();
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, Integer.valueOf(strId));
			resultSet = preparedStatement.executeQuery();

			while (resultSet.next()) {
				int bid = resultSet.getInt("bid");
				String bname = resultSet.getString("bname");
				String btitle = resultSet.getString("btitle");
				String bcontent = resultSet.getString("bcontent");
				Timestamp bdate = resultSet.getTimestamp("bdate");
				int bhit = resultSet.getInt("bhit");
				int bgroup = resultSet.getInt("bgroup");
				int bstep = resultSet.getInt("bstep");
				int bindent = resultSet.getInt("bindent");

				board = new BoardVO(bid, bname, btitle, bcontent, bdate, bhit, bgroup, bstep, bindent);

			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (resultSet != null)
					resultSet.close();
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();

			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		return board;
	}

reply_view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>답변</title>
</head>
<body>

	<table width="500" cellpadding="0" cellspacing="0" border="1">
		<form action="reply.do" method="post">
			<input type="hidden" name="bid" value="${reply_view.bid}"> <input
				type="hidden" name="bgroup" value="${reply_view.bgroup}"> <input
				type="hidden" name="bstep" value="${reply_view.bstep}"> <input
				type="hidden" name="bindent" value="${reply_view.bindent}">
			<tr>
				<td>번호</td>
				<td>${reply_view.bid}</td>
			</tr>
			<tr>
				<td>히트</td>
				<td>${reply_view.bhit}</td>
			</tr>
			<tr>
				<td>이름</td>
				<td><input type="text" name="bname" value="${reply_view.bname}"></td>
			</tr>
			<tr>
				<td>제목</td>
				<td><input type="text" name="btitle"
					value="${reply_view.btitle}"></td>
			</tr>
			<tr>
				<td>내용</td>
				<td><textarea rows="10" name="bcontent">${reply_view.bcontent}</textarea></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="답변"> <a
					href="list.do">목록</a></td>
			</tr>
		</form>
	</table>


</body>
</html>
  • input type="hidden" :: 필요한 정보를 가져오되, 사용자에게 보여주지 않는다.

2-2. 답변 등록

BoardController.java (조건문 추가)

	else if(com.equals("/reply.do")) {
			/*http://localhost:8282/servlet_yjy_board/reply.do*/
			command = new BReplyCommand();
			command.execute(request, response);
			viewPage = "list.do";			
		}

BReplyCommand.java

package edu.global.board.command;

import java.io.IOException;
import java.util.List;

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 edu.global.board.dao.BDao;
import edu.global.board.vo.BoardVO;

public class BReplyCommand implements BCommand {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		String bid = request.getParameter("bid");
		String bname = request.getParameter("bname");
		String btitle = request.getParameter("btitle");
		String bcontent = request.getParameter("bcontent");
		String bgroup = request.getParameter("bgroup");
		String bstep = request.getParameter("bstep");
		String bindent = request.getParameter("bindent");

		BDao dao = new BDao();
		dao.reply(bid, bname, btitle, bcontent, bgroup, bstep, bindent);

	}

}

BDao.java (함수 추가)

/* 댓글 창 관련 함수 */
	public int replyShape(String strGroup, String strStep) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;

		int rn = 0;
		
		try {
			String query = "update mvc_board set bstep = bstep + 1 where bgroup = ? and bstep > ?";
			/* bgroup 안에 해당하는 댓글이면서, bstep이 해당하는 곳보다 클 때 step을 하나씩 증가시킨다. */
			
			connection = dataSource.getConnection();
			preparedStatement = connection.prepareStatement(query);

			preparedStatement.setString(1, strGroup);
			preparedStatement.setString(2, strStep);
			rn = preparedStatement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (preparedStatement != null) {
					preparedStatement.close();
				}
				if (connection != null) {
					connection.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return rn;
	}
/* 7. Reply */
	public int reply(String bid, String bname, String btitle, String bcontent, String bgroup, String bstep,
			String bindent) {

		Connection connection = null;
		PreparedStatement preparedStatement = null;

		int rn = 0;

		replyShape(bgroup, bstep); // step을 +1하기

		try {

			String query = "insert into mvc_board (bid, bname, btitle, bcontent, bgroup, bstep, bindent) values (mvc_board_seq.nextval, ?, ?, ?, ?, ?, ?)";

			connection = dataSource.getConnection();
			preparedStatement = connection.prepareStatement(query);

			preparedStatement.setString(1, bname);
			preparedStatement.setString(2, btitle);
			preparedStatement.setString(3, bcontent);
			preparedStatement.setInt(4, Integer.parseInt(bgroup));
			preparedStatement.setInt(5, Integer.parseInt(bstep) + 1);
			preparedStatement.setInt(6, Integer.parseInt(bindent) + 1);

			rn = preparedStatement.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();

			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		return rn;
	}
  • list 함수의 쿼리에서 그룹은 내림차순, 댓글은 오름차순으로 되어 있다.
String query = "select * from mvc_board order by bgroup desc, bstep asc";

list.jsp (댓글 부분 html 수정)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 리스트</title>
</head>
<body>
	<table width="500" cellpadding="0" cellspacing="0" border="1">
		<tr>
			<td>번호</td>
			<td>이름</td>
			<td>제목</td>
			<td>날짜</td>
			<td>히트</td>
		</tr>
		<c:forEach var="board" items="${boards}">
			<!-- request.setAttribute에 맞춰서 쓴다 -->
			<tr>
				<td>${board.bid}</td>
				<td>${board.bname}</td>
				<td><c:forEach begin="1" end="${board.bindent}">[Re]</c:forEach> <a
					href="content_view.do?bid=${board.bid}">${board.btitle}</a></td>
				<td>${board.bdate}</td>
				<td>${board.bhit}</td>
			</tr>
		</c:forEach>
		<tr>
			<td colspan="5"><a href="write_view.do">글작성</a></td>
		</tr>
	</table>
</body>
</html>
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글