빈 검증 - 글 수정
게시글을 표현하는 Article 클래스의 수정은 '글쓰기에서 빈 검증'에서 다루었다.
아래에서 modifyForm() 메소드는 내용이 없는 빈 객체(Article 객체)를 생성해 뷰에 전달해야 한다. 이건 스펙이니 따라야 한다. 게시글 수정을 처리하는 메소드(아래 modify() 메소드)에는 빈 검증 로직을 추가한다. 이 메소드의 매개 변수 리스트에서 @Valid 어노테이션이 적용된 매개 변수 다음에는 반드시 BindingResult 타입의 매개 변수를 선언해야 한다. 그렇지 않으면 HTTP 400 에러가 발생한다.
BbsController.java
//수정 페이지 포워딩
@RequestMapping(value="/modify", method=RequestMethod.GET)
public String modifyForm(Integer articleNo, String boardCd, Model model) {
Article article = boardService.getArticle(articleNo);
String boardNm = boardService.getBoardNm(article.getBoardCd());
//수정페이지에서의 보일 게시글 정보
model.addAttribute("article", article);
model.addAttribute("boardNm", boardNm);//아래 테스트 화면처럼 '자유게시판'을 표시하기 위해
return "bbs/modify";
}
//게시글 수정 처리
@RequestMapping(value="/modify", method=RequestMethod.POST)
public String modify(@Valid Article article, BindingResult bindingResult,
Integer page,
String searchWord,
Model model,
MultipartHttpServletRequest mpRequest) throws Exception {
//검증 로직
if (bindingResult.hasErrors()) {
String boardNm = boardService.getBoardNm(article.getBoardCd());
model.addAttribute("boardNm", boardNm);//아래 테스트 화면처럼 '자유게시판'을 표시하기 위해
return "bbs/modify";
}
//관리자가 수정하더라도 글 소유자를 유지
String email = boardService.getArticle(article.getArticleNo()).getEmail();
article.setEmail(email);
boardService.modifyArticle(article);
//파일 업로드 -기존과 같음..
//파일데이터 삽입 중 setArticleNo(articleNo)를 setArticleNo(article.getArticleNo())로
searchWord = URLEncoder.encode(searchWord, "UTF-8");
return "redirect:/bbs/view?articleNo=" + article.getArticleNo() +
"&boardCd=" + article.getBoardCd() +
"&page=" + page +
"&searchWord=" + searchWord
}
아래를 참조해 기존 JSP 파일을 수정한다. <sf:errors> 태그는 사용자에게 검증 에러를 표시하는 스프링 폼 태그이다.
modify.jsp
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<sf:form id="modifyForm" action="modify" method="post" modelAttribute="article"
enctype="multipart/form-data" onsubmit="return check()">
<input type="hidden" name="articleNo" value="${param.articleNo }" />
<input type="hidden" name="boardCd" value="${param.boardCd }" />
<input type="hidden" name="page" value="${param.page }" />
<input type="hidden" name="searchWord" value="${param.searchWord }" />
<sf:errors path="*" cssClass="error" />
<table id="write-form">
<tr>
<td>제목</td>
<td>
<sf:input path="title" style="width: 90%" /><br />
<sf:errors path="title" cssClass="error" />
</td>
</tr>
<tr>
<td colspan="2">
<sf:textarea path="content" rows="17" cols="50" /><br />
<sf:errors path="content" cssClass="error" />
</td>
</tr>
<tr>
<td>파일첨부</td>
<td><input type="file" name="attachFile" /></td>
</tr>
</table>
<div style="text-align: center;padding-bottom: 15px;">
<input type="submit" value="전송" />
<input type="button" value="상세보기" onclick="goView()" />
</div>
</sf:form>
아래는 수정 화면에서 입력 필드에 모두 지우고 전송 버튼을 눌렀을 때의 화면이다. (스타일시트에 .error { color: red; }가 추가되어 있어야 한다.)
- Getting started with Hibernate Validator
- Validation - Empty int field
- http://stackoverflow.com/questions/14715248/simple-springmvc-3-login-doesnt-work
- http://stackoverflow.com/questions/6227547/spring-3-validation-not-working
- http://stackoverflow.com/questions/8909482/spring-mvc-3-ambiguous-mapping-found
- 예제로 쉽게 배우는 스프링 프레임워크 3.0(한빛미디어) - 사카타 코이치
- Spring in Action(Jpub) - 크레이그 월즈
- spring-framework-reference.pdf
- MyBatis Getting started
