[JSP/Servlet] 9. 게시글 쓰기개발자가 되기까지 (2023.08.16~2024.04.15)/[Servlet] Basic Web2023. 12. 11. 01:23
Table of Contents
검색 / 페이지네이션 하면서 막혔던 숨,
여기서 쉬면 된다.
정말로 게시글을 쓰는 것만 만들어주면 된다.
게시글을 작성하는 페이지를 먼저 만들어주기 위해 webapp > board > register.jsp 파일을 생성한다.
작성자 이름과 작성자 아이디가 일치했으면 했고, 글을 쓸 때 작성자를 노출하고 싶지 않았다.
그래서 작성자는 <input type="hidden">으로 ses.id 값만 서버로 보낼 수 있게 했다.
register.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>
<h1>자유게시판 글쓰기</h1>
<form action="/brd/insert" method="post">
제목 : <input type="text" name="title"><br>
<!-- 작성자는 글쓰기에서 노출 안시키고 값만 서버로
(리스트에는 작성자 명을 띄워야 하니까) -->
<input type="hidden" value="${ses.id }"><br>
내용 :<br>
<textarea rows="10" cols="30" name=content></textarea><br>
<button type="submit">완료</button>
<a href="/brd/list"><button type="button">취소</button></a>
</form>
</body>
</html>
게시글 쓰기 화면
BoardController부터 boardMapper까지 순차적으로 코드를 작성한다.
게시글 등록에 성공하면 alert를 띄울거라 jsp에 script를 주기 전에 미리 적어두었다.
BoardController.java
package controller;
import java.io.IOException;
import java.util.List;
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 javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.BoardVO;
import domain.MemberVO;
import domain.PagingVO;
import handler.PagingHandler;
import service.BoardService;
import service.BoardServiceImpl;
@WebServlet("/brd/*")
public class BoardController extends HttpServlet {
// ... (기존 코드)
case "register":
destPage = "/board/register.jsp";
break;
case "insert":
try {
// ses.id 값 받아와야 하니까
HttpSession ses = request.getSession();
MemberVO mvo = (MemberVO) ses.getAttribute("ses");
String writer = mvo.getId();
//register.jsp에서 받아오는 것은 title / content
String title = request.getParameter("title");
String content = request.getParameter("content");
BoardVO bvo = new BoardVO(title, writer, content);
log.info(">>> 글쓰기 >>> {}", bvo);
isOk = bsv.insert(bvo);
log.info(">>> insert " + (isOk > 0 ? "OK" : "FAIL"));
if(isOk > 0) {
request.setAttribute("msg_new", "new");
}
destPage = "/brd/list";
} catch (Exception e) {
log.info(">>> insert error");
e.printStackTrace();
}
break;
}
// ... (기존 코드)
}
BoardService.interface
package service;
import java.util.List;
import domain.BoardVO;
import domain.PagingVO;
public interface BoardService {
List<BoardVO> getList(PagingVO pgvo);
int getTotal(PagingVO pgvo);
int insert(BoardVO bvo);
}
BoardServiceImpl.java
package service;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.BoardVO;
import domain.PagingVO;
import repository.BoardDAO;
import repository.BoardDAOImpl;
public class BoardServiceImpl implements BoardService {
// ... (기존 코드)
@Override
public int insert(BoardVO bvo) {
log.info(">>> insert check 2");
return bdao.insert(bvo);
}
}
BoardDAO.interface
package repository;
import java.util.List;
import domain.BoardVO;
import domain.PagingVO;
public interface BoardDAO {
List<BoardVO> selectList(PagingVO pgvo);
int getTotal(PagingVO pgvo);
int insert(BoardVO bvo);
}
BoardDAOImpl.java
package repository;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.BoardVO;
import domain.PagingVO;
import orm.DatabaseBuilder;
public class BoardDAOImpl implements BoardDAO {
// ... (기존 코드)
@Override
public int insert(BoardVO bvo) {
log.info(">>> insert check 3");
int isOk = sql.insert("BoardMapper.reg", bvo);
if (isOk > 0) sql.commit();
return isOk;
}
}
boardMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="BoardMapper">
// ... (기존 코드)
<insert id="reg">
insert into board(title, writer, content)
value (#{title}, #{writer}, #{content})
</insert>
<!-- 예비구문 -->
// ... (기존 코드)
</mapper>
list.jsp에서 글쓰기 버튼의 a태그 경로를 설정해준다.
게시글 등록에 성공하면 띄울 alert도 설정해 주었다.
list.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>
<tr>
<th>No</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
<!-- DB에서 가져온 리스트를 c:forEach를 통해 반복
var="bvo"는 BoardVO 객체를 참조한다. -->
<c:forEach items="${list}" var="bvo">
<tr>
<td>${bvo.bno }</td>
<td><a href="#">${bvo.title }</a></td>
<td>${bvo.writer }</td>
<td>${bvo.regdate }</td>
<td>${bvo.readcount }</td>
</tr>
</c:forEach>
</table>
<a href ="/brd/register"><button>글쓰기</button></a>
<!-- 페이지네이션 -->
// ... (기존 코드)
<script type="text/javascript">
const msg_new = `<c:out value="${msg_new}" />`;
console.log(msg_new);
if(msg_new == 'new') {
alert('게시글을 등록했습니다.');
}
</script>
</body>
</html>
글쓰기 성공 시 alert
글쓰기 등록에 성공하면 등록한 게시물이 제일 상단에 보여야한다.
글쓰기 완료 후 리스트
[JSP/Servlet] 9. 게시글 쓰기
(다음 게시물 예고편)
[JSP/Servlet] 10. 게시글 상세 페이지
728x90
@rlozlr :: 얼렁뚱땅 개발자
얼렁뚱땅 주니어 개발자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!