soozya
[FRONT, BACK] 글 쓰기 (Spring MyBatis) 본문
[👩🏻💻소스코드]
[FRONT]
[write.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="Board.*"%>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>::함께 여행::</title>
<link href="css/other.css" rel="stylesheet">
<link href="css/bootstrap.min.css" rel="stylesheet">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<div class="left_title"><a href="main.jsp">함께 여행</a></div>
<p>
<h2 class="com1 text-center"><b>커뮤니티</b></h2>
<p> <hr>
<h5 class="com2"><b>여행에 대한 자유로운 대화를 나누어보세요!</b></h5>
<div>
<form class="com_fm" action="write.do">
<table class="write_tb">
<tr>
<td height="40" align="center" valign="middle" width="10%"><b>글 제목</b></td>
<td height="40" width="90%">
<input type="text" name="title" size="139"
placeholder="제목을 입력해 주세요." required />
</td>
</tr>
<tr>
<td align="center" valign="top"><b>글 내용</b></td>
<td><textarea name="content" rows="10" cols="140"
placeholder="내용을 입력해 주세요." required></textarea>
</td>
</tr>
</table>
<button type="submit" class="btn btn-primary write_up"
onclick="alert('작성이 완료되었습니다.')">글쓰기</button>
</form>
<button type="submit" class="btn btn-secondary write_cancel"
onclick="history.back()">취소</button>
</div>
<jsp:include page="footer.jsp" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</body>
</html>
[BACK]
[tripboard.xml]
<!-- 2.글쓰기 시 게시물 번호 -->
<select id="getPostNum" resultType="int">
select max(num) from tripboard
</select>
<!-- 3.글쓰기 -->
<insert id="write" parameterType="board">
insert into tripboard(num, title, content, cdate)
values(#{num}, #{title}, #{content}, sysdate)
</insert>
[sqlMapBoardDAO.java]
public class SqlMapBoardDAO extends SqlSessionDaoSupport implements BoardDAO {
@Override
public int getPostNum() throws DataAccessException {
Integer result = (Integer)getSqlSession().selectOne("getPostNum");
if (result != null) {
return result.intValue() + 1;
} else {
return 1; // 결과가 null인 경우 1을 반환하여 첫 번째 글번호로 설정
}
}
@Override
public void write(BoardCommand data) throws DataAccessException{
//글 쓰기insert : .insert("id",전달할 매개변수)
getSqlSession().insert("write",data);
}
[BoardDAO.java]
package Board;
import java.util.List;
import org.springframework.dao.DataAccessException;
public interface BoardDAO {
//2.글쓰기 시 게시물 번호
public int getPostNum() throws DataAccessException;
//3.글쓰기
public void write(BoardCommand data) throws DataAccessException;
[WriteAction.java]
package Board;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
//데이터를 직접 입력받는 경우 AbstractCommandController 사용
//Controller 상속: 웹상에서의 일반적인 요청명령어
public class WriteAction extends AbstractCommandController {
BoardDAO dao;
public void setDao(BoardDAO dao) {
this.dao=dao;
System.out.println("Write의 setDao() 호출: " +dao);
}
/*
1. request(요청객체) 2. response(응답객체)
3.입력받은 값을 저장한 객체(Object(모두 입력이 가능함))
4. BindException:사용자가 값을 입력 시 발생하는 에러 처리 객체
* */
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object command,
BindException error)
throws Exception {
// TODO Auto-generated method stub
System.out.println("WriteAction 실행됨!");
request.setCharacterEncoding("utf-8");
BoardCommand data=(BoardCommand)command;
int PostNum=dao.getPostNum();
data.setNum(PostNum);
dao.write(data); //BoardDAO의 write()~
//("redirect:/요청명령어") : 요청명령어로 이동
return new ModelAndView("redirect:/list.do");
}
}
[💬설명]
1️⃣ tripboard.xml : sql 구문이 select로 시작하는 경우 <select>를, insert로 시작하는 경우 <insert> 태그 사용
# resultType : sql구문에서 반환값이 있는 경우에 사용되며, 대부분 select 구문에서 쓰임
# parameterType : 매개변수를 입력 받아 처리해주는 SQL구문에서 사용
where 조건식에서 입력 받는 자료형
# 여기에서 쓰이는 board는 SqlMapConfig.xml에서 설정했던 BoardCommand에 해당함
2️⃣ SqlMapBoardDAO.java
# 인터페이스(BoardDAO) 구현을 위해 implements 사용함
# getSqlSession()을 이용하여 SqlSession 객체를 편히 얻어오기 위해 SqlSessionDaoSupport을 상속받음
➡ getSqlSession() = tripboard.xml의 sql 구문을 호출하는 것
# selectOne : 레코드 한 개만 가져올 때
- 원래는 return (Integer)getSqlSession().selectOne("getPostNum");을 썼는데 글번호가 증가하지 않고 0으로 유지되고
에러가 발생하기도 해서, 소스코드를 수정함..
👉🏻 변수 result를 만들어 getPostNum의 값을 불러와 만약 null값이 아니라면 기존의 숫자에 +1을 해주고, null이라면 기본 값을 1로 주기로 해서 에러를 해결했다.
(수정 코드)
(기존 코드)
3️⃣ BoardDAO.java
# DataAccessException : spring전용 예외처리 클래스로, try ~ catch 생략 가능함
4️⃣ WriteAction.java
# 글 번호를 증가시키기 위해 getPostNum을 먼저 실행하고, write를 실행
[💻결과]
'👩🏻💻프로젝트 > 👩🏻개인프로젝트' 카테고리의 다른 글
[React] Git과 연결하기 (0) | 2023.11.07 |
---|---|
[BACK] 글 삭제하기 (Spring MyBatis) (0) | 2023.09.20 |
[FRONT, BACK] 글 상세보기 (Spring MyBatis) (0) | 2023.09.20 |
[FRONT, BACK] 글 목록보기 (Spring MyBatis) (0) | 2023.09.19 |
[SPRING MyBatis] 게시판 만들기 기본 설정 (0) | 2023.09.15 |