@GetMapping("/registerForm01")
public String registerForm01(Model model) {
log.info("get방식 진입");
model.addAttribute("member", new Member());
return "registerForm01";
}
jsp에 전달할 데이터를 위해 model을 매개변수로 지정
속성명을 "member"로 지정하고 폼 객체(new Member())를 모델에 추가함
스프링 폼 태그를 사용할 때 model로 폼 객체 보내주지 않으면 에러 난다
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form modelAttribute="member" method="post" action="/registerForm01Post">
<p>유저ID :
<!-- <input type="text" id="userId" name="userId" placeholder="아이디" /> -->
<form:input path="userId" placeholder="아이디" />
</p>
<p>이름 :
<input type="text" name="userName" placeholder="이름" />
</p>
<p>
<input type="submit" value="등록" />
<button type="submit">등록</button>
<form:button name="register">등록</form:button>
</p>
</form:form>
<form:form> 의 modelAttribute 속성에다가 컨트롤러에 쓴 폼 객체의 속성명을 지정해야 한다
폼 객체의 속성명(member)과 스프링 폼 태그(<form:form)의 modelAttribute 속성값이 일치하지 않으면 에러가 발생한다
@GetMapping("/registerForm02")
public String registerForm02(Member member) {
log.info("모델없이 자바빈즈 객체 넘겨주기");
return "registerForm02";
}
컨트롤러 메서드의 매개변수로 자바빈즈(필드, 기본생성자, getter/setter) 객체가 전달이 되면 기본적으로 다시 화면(view, jsp)으로 전달한다
그리고 폼 객체의 속성명은 직접 지정하지 않으면 폼 객체의 클래스명(Member)의 맨 처음 문자를 소문자로 변환(member)하여 처리한다
<form:form modelAttribute="member" method="post" action="/registerForm01Post">
modelAttribute 에 member를 쓴다
만약 VO이름과 다른 이름을 쓰고 싶다면 @ModelAttribute 로 따로 지정해 주면 된다
@GetMapping("/registerForm03")
public String registerForm03(@ModelAttribute("user") Member member) {
log.info("모델없이 자바빈즈 객체 넘겨주고 어노테이션 사용해서 이름 지정");
return "registerForm03";
}
<form:form modelAttribute="user" method="post" action="/registerForm01Post">
그냥 인풋태그는 value로 값을 미리 세팅해 줄 수 있는데 스프링 폼 태그의 인풋 등을 사용하면 컨트롤러에 값 세팅해서 넘겨주면 알아서 값이 세팅된다
@GetMapping("/registerForm04")
public String registerForm04(@ModelAttribute("user") Member member) {
log.info("값 세팅해서 넘겨주기");
member.setUserId("leecs");
member.setUserName("이창섭");
return "registerForm04";
}
제출한 폼은 post방식으로 컨트롤러에서 받아준다
멤버VO에 받아도 되고 아래처럼 써도 된다
@PostMapping("/registerForm01Post")
public String registerForm01Post(
Member member) {
// @ModelAttribute("user") Member member, Model model) {
log.info("post!");
log.info(member.getPassword());
log.info(member.getHobby());
}
폼태그 속성
<input type="text" id="userId" name="userId" placeholder="아이디" />
<form:input path="userId" placeholder="아이디" />
그냥 인풋태그와 스프링 폼태그 인풋의 차이이다
form:input으로 쓰면 type="text"라는 뜻이고 path는 id와 name값을 의미한다
<form:input path="userId" placeholder="아이디" disabled="true" />
<form:input path="userName" placeholder="이름" readonly="true" />
disabled : 폼 항목 비활성화
readonly : 읽기 전용
둘 다 기본값은 false이다
<form:password path="password"/>
패스워드는 값을 설정해서 화면에 전달하더라도 패스워드 필드에 반영 안 된다 미리 세팅 안됨
<form:textarea path="introduction" rows="6" cols="30" />
<form:hidden path="coin" />
textarea와 hidden 은 단일 태그로 써준다
<form:label path="userId">유저ID :</form:label>
path 가 라벨태그의 for가 된다
<form:button name="register">등록</form:button>
<button id="register" name="register" type="submit">등록</button>
버튼은 요렇게 된다
<code><form:errors path="userId" /></code>
<font color="red"><form:errors path="userName" /></font>
입력값 검증 에러 표시는 이렇게 할 수 있다
결과는 각각 아래와 같이 나온다
그냥 form:errors만 쓰면 검정글씨로 나온당