Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

soozya

[FRONT, BACK] 글 쓰기 (Spring MyBatis) 본문

👩🏻‍💻프로젝트/👩🏻개인프로젝트

[FRONT, BACK] 글 쓰기 (Spring MyBatis)

soozya 2023. 9. 19. 21:50

[👩🏻‍💻소스코드]

 

[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를 실행 

3

 


[💻결과]