글 수정

수정 페이지로 이동시키는 링크를 설정한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- attribute : vo -->
<title>${ vo.subject }</title>
<div class="container">
	<h1>글 내용 보기</h1>
	<ul>
		<li>글 번호</li>
		<li>${ vo.postno }</li>
		<li>작성자</li>
		<li>${ vo.username }</li>
		<li>등록일</li>
		<li>${ vo.regdate }</li>
		<li>조회수</li>
		<li>${ vo.hitcount }</li>
		<li>제목</li>
		<li>${ vo.subject }</li>
		<li>내용</li>
		<li>${ vo.content }</li>
	</ul>
	<div>
		<a href="/myapp/board/boardEdit?postno=${ vo.postno }">수정</a>
		<a href="#">삭제</a>
	</div>
</div>

컨트롤러 모델&뷰

컨트롤러에 service.boardView()를 이용해서 해당 글에 대한 정보를 가져온다.

// 글 수정
@RequestMapping("/board/boardEdit")
public ModelAndView boardEdit(int postno) {
	ModelAndView mav = new ModelAndView();
	
	mav.addObject("vo", service.boardView(postno));
	mav.setViewName("board/boardEdit");
	
	return mav;
}

뷰페이지

boardEdit.jsp는 boardPost.jsp를 가져와서 기존 내용만 넣어주면 된다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- attribute : vo -->
<script>
	function formCheck(){
		if(document.getElementById("subject").value == ""){
			alert("제목을 입력하세요.");
			return false;
		}
		if(document.getElementById("content").value == ""){
			alert("내용을 입력하세요.");
			return false;
		}
		return true;
	}
</script>
<title>글 수정</title>
<div class="container">
	<h1>글 수정 form</h1>
	<form method="post" action="/myapp/board/boardEditOk" onsubmit="return formCheck()">
		<input type="hidden" name="postno" value="${ vo.postno }">
		<ul>
			<li>제목</li>
			<li><input type="text" name="subject" id="subject" size="50" value="${ vo.subject }"></li>
			<li>
				<textarea name="content" id="content" rows="20" cols="100">${ vo.content }</textarea>
			</li>
			<li><input type="submit" value="등록"></li>
		</ul>
	</form>
</div>

컨트롤러에서 boardEditOk를 매핑해서 수정된 글을 고치자.

이번엔 컨트롤러에서 미리 service와 뷰페이지 이름까지 다 정한 후 Service, SQL문으로 넘어가자.

컨트롤러 매핑

// 글 수정 저장
@PostMapping("/board/boardEditOk")
public ModelAndView boardEdit(BoardVO vo, HttpSession session) {
	ModelAndView mav = new ModelAndView();
	
	// 로그인한 사용자가 자기글만 수정할 수 있도록 한다
	vo.setUsername((String)session.getAttribute("logUsername"));
	
	mav.addObject("result", service.boardEditOk(vo));
	mav.addObject("postno", vo.getPostno());
	mav.setViewName("board/boardEditOk");
	
	return mav;
}

Service

package com.poby.myapp.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.poby.myapp.dao.BoardDAO;
import com.poby.myapp.vo.BoardVO;
import com.poby.myapp.vo.PageVO;

@Service
public class BoardServiceImpl implements BoardService {
	@Inject
	BoardDAO dao;

	@Override
	public int boardPostOk(BoardVO vo) {
		return dao.boardPostOk(vo);
	}

	@Override
	public List<BoardVO> boardList(PageVO pvo) {
		return dao.boardList(pvo);
	}

	@Override
	public int totalData(PageVO pvo) {
		return dao.totalData(pvo);
	}

	@Override
	public BoardVO boardView(int postno) {
		return dao.boardView(postno);
	}

	@Override
	public int boardEditOk(BoardVO vo) {
		return dao.boardEditOk(vo);
	}

}

쿼리문

<update id="boardEditOk">
	UPDATE board_tbl SET subject=#{subject}, content=#{content}
	WHERE postno=${postno} AND username=#{username}
</update>

쿼리문의 결과(성공:1, 실패:0)를 boardEditOk.jsp로 넘겨주어 실행결과에 따라서 뒤로가기 혹은 수정한 글 보기 페이지로 이동시키자.

뷰페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- attribute : result -->
<c:if test="${ result==0 }">
	<script>
		alert("수정 실패.");
		history.back();
	</script>
</c:if>
<c:if test="${ result>0 }">
	<script>
		location.href = "/myapp/board/boardList?postno=${postno}";
	</script>
</c:if>

※ 500에러 : 로그인이 안 된 상태에서 수정 시도

아이디 세션값이 null이기 때문에 컨트롤러에서 vo.setUsername에서 에서가 발생한다.

+ Recent posts