Spring08_스프링 폼태그

1 minute read



새글등록하기

  • 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()">  
  



Spring Form태그의 필요성

  • JavaScript로 사용자가 정확한 값을 입력했는지 체크하는 방법도 있지만 Spring의 기술만으로 체크할 수도 있다.
  • 지금까지는 한 번 요청이 오면 이전에 입력한 내용은 모두 사라진다.
    • 사용자가 입력한 내용을 공유영역에 올려서 다시 요청하는 방법이 필요하다.
    • 직접 코드를 짜는 건 굉장히 불편 : Spring Form 태그를 사용하자



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속성으로 이전에 입력한 값을 기억시킬 수 있다.
    • ${boardVO.title} 과 같다

<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>