새글등록하기
- URI가
/board/write
일때 새글등록폼(GET)과 새글등록(POST) 기능이 작동하도록 한다.
코드
Controller
@RequestMapping(value="/board/write" ,method=RequestMethod.GET)
public String writeForm() {
return "board/write";
}
@RequestMapping(value="/board/write", method=RequestMethod.POST)
public void write() { // 리턴값이 void이면 value가 리턴됨.
System.out.println("post/board/write");
}
- 직접 method 쓰기 귀찮다 : Spring 4.3버전부터 새로운 Annotation이 나왔다.
@GetMapping
, @PostMapping
//@RequestMapping(value="/board/write", method=RequestMethod.POST)
@PostMapping("/board/write")
public void write(BoardVO board) { // Spring은 VO를 파라미터로 받으면 알아서 vo에 넣어줌
System.out.println("post/board/write");
}
index.jsp
<a href="${ pageContext.request.contextPath }/board/write">새글등록</a>
write.jsp
<form action="${ pageContext.request.contextPath }/board/write" method="post"
name="writeForm" onsubmit="return doWrite()">
<!--GET방식과 POST 방식의 URI가 같을 땐 action을 생략할 수 있다. -->
<form method="post" name="writeForm" onsubmit="return doWrite()">
- JavaScript로 사용자가 정확한 값을 입력했는지 체크하는 방법도 있지만 Spring의 기술만으로 체크할 수도 있다.
- 지금까지는 한 번 요청이 오면 이전에 입력한 내용은 모두 사라진다.
- 사용자가 입력한 내용을 공유영역에 올려서 다시 요청하는 방법이 필요하다.
- 직접 코드를 짜는 건 굉장히 불편 : Spring Form 태그를 사용하자
1. 라이브러리 호출
- 적용할 jsp 파일에서 아래의 코드를 추가하여 Spring form 라이브러리를 호출한다.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form>
<input>
<!-- 위는 아래와 같이 쓸 수 있다 -->
<form:input>
2. 속성
modelAttribute과 Path
- GET방식에서도 VO를 공유영역에 등록시켰다면 그것을 참조할 수 있도록 하는 속성
Controller
에서 아래와 같이 등록한 후
@GetMapping("/board/write")
public String writeForm(Model model) {
LoginVO userVO = session.getAttribute("userVO");
String writer=userVO.getId();
//공유영역에 객체등록
model.addAttribute("boardVO", new BoardVO());
return "board/write";
}
- jsp 쪽에서 `modelAttribute와 Path속성으로 이전에 입력한 값을 기억시킬 수 있다.
<form:form method="post" modelAttribute="boardVO">
<table border="1" style="width:100%;">
<tr>
<th>제목</th>
<td>
<form:input path="title"/>
</td>
</tr>
</table>
<form:button type="submit">등록</form:button>
</form:form>
Validation체크
Hibernate Validator Engine
- 7버전은 java 9버전부터 사용가능하므로 6.0.2버전을 pom.xml에 붙여넣는다.
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
Controller
- Errors 또는 BindingResult 를 파라미터로 넣는다.
hasErrors()
메소드를 사용하여 에러인지 에러가 아닌지 체크
@PostMapping("/board/write")
public String write(@Valid BoardVO board, Errors error) {
// @Valid태그가 붙어있는 경우에만 @NotEmpty사용 가능
//Errors error 또는 BindingResult result 사용가능( Errors를 상속받은애임)
System.out.println("post/board/write");
System.out.println(board.toString());
System.out.println(error.hasErrors());
// 에러가 아니면 false, 에러면 true
return "redirect:/board";
}
@Valid와 속성들
- Controller에서 @Valid태그가 붙어있는 경우에만 VO에서 Annotation을 사용할 수 있다.
- 속성
- @NotEmpty(message=”에러메시지”)로 에러메시지 설정도 가능.
- @Min(value = “2”)
- @Length(min=2, max=40, message=”최소 2글자 이상 최대 40글자만 가능합니다”)
- @Pattern(regexp=”^[A-Za-z0-9]*$”, message=”특수기호는 사용할 수 없습니다”)
private int no;
@Length(min=2, max=40, message="최소 2글자 이상 최대 40글자만 가능합니다")
@NotEmpty(message="필수항목입니다")
private String title;
@NotEmpty(message="필수항목입니다")
private String writer;
@NotEmpty(message="필수항목입니다")
private String content;
private int viewCnt;
private String regDate;
- 에러메시지 접근
<form:errors path="title"/>
태그 사용
<form:form method="post" modelAttribute="boardVO">
<table border="1" style="width:100%;">
<tr>
<th>제목</th>
<td>
<form:input path="title"/>
<form:errors path="title"/>
</td>
</tr>
</table>
<form:button type="submit">등록</form:button>
</form:form>