Model 객체는 뷰(View)에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 한다.
[요청과 처리]
요청 : /
처리 : home(Locale locale, Model model)
model.addAttribute("serverTime", formatterDate)
Model 객체를 통해서 다양한 데이터를 뷰(View)에 전달할 수 있다.
[요청과 처리]
요청 : /read01
처리 : String read01(Model model)
model.addAttribute("userId", "hongkd");
model.addAttribute("password", "1234");
model.addAttribute("email", "aaa@ccc.com");
...
[요청과 처리]
요청 : /read02
처리 : String read02(Model model)
model.addAttribute(member);
[요청과 처리]
요청 : /read03
처리 : String read01(Model model)
model.addAttribute("user", member);
[요청과 처리]
요청 : /read04
처리 : String read01(Model model)
model.addAttribute("carArray", carArray);
model.addAttribute("carList", carList);
....
[요청과 처리]
요청 : /read05
처리 : String read05(Model model)
model.addAttribute("user", member);
[요청과 처리]
요청 : /read06
처리 : String read06(Model model)
model.addAttribute("user", member);
@ModelAttribute 어노테이션은 전달 받은 매개변수를 강제로 Model에 담아서 전달하도록 할 때 필요한 어노테이션입니다.
[요청과 처리]
요청 : /modelattribute/register01
처리 : String register01(String userId)
- 기본 타입의 매개변수는 페이지로 전달되지 않는다.
[요청과 처리]
요청 : /modelattribute/register02
처리 : String register02(@ModelAttribute("userId") String userId)
- @ModelAttribute 어노테이션을 이용해서 데이터를 전달한다
[요청과 처리]
요청 : /modelattribute/register03
처리 : String register03(@ModelAttribute("userId") String userId, @ModelAttribute("password") String password )
[요청과 처리]
요청 : /modelattribute/register04
처리 : String register04(Member member)
[요청과 처리]
요청 : /modelattribute/register05
처리 : String register05(Member member)
- Member 클래스 안에 있는 Address까지 출력 예시
RedirectAttributes는 일회성으로 데이터를 전달하는 용도로 사용된다.
[요청과 처리]
요청 : /redirectAttribute/register
처리 : String register(Member member, RedirectAttributes redirectAttributes)
- 일회성으로 해당 페이지에서 넘어온 데이터를 다시 요청할 시 데이터가 사라진다.
package org.hdcd.controller;
import java.time.Year;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.hdcd.vo.Address;
import org.hdcd.vo.Card;
import org.hdcd.vo.Member;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class ModelMemberController {
private static Logger logger = LoggerFactory.getLogger(AjaxMemberFileController.class);
/*
* 6장. 데이터 전달자 모델
* - Model 객체 이용
* 1) 매개변수에 선언된 Model 객체의 addAttribute() 메서드를 호출하여 데이터를 뷰(View)에 전달한다.
*/
@RequestMapping(value = "/read01", method = RequestMethod.GET)
public String read01(Model model) {
logger.info("read01");
model.addAttribute("userId", "hongkd");
model.addAttribute("password", "1234");
model.addAttribute("email", "aaa@ccc.com");
model.addAttribute("userName", "홍길동");
model.addAttribute("birthDay", "2022-11-28");
return "member/read01";
}
// 2) Model 객체에 자바빈즈 클래스 객체를 값으로만 전달할 때는
// 뷰에서 참조할 이름을 클래스명의 앞글자를 소문자로 변환하여 처리한다.
@RequestMapping(value = "/read02", method = RequestMethod.GET)
public String read02(Model model) {
logger.info("read02");
Member member = new Member();
member.setUserId("hongkd");
member.setPassword("1234");
member.setEmail("aaa@ccc.com");
member.setUserName("홍길동");
member.setBirthDay("2022-11-28");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONDAY, 10);
cal.set(Calendar.DAY_OF_MONTH, 7);
member.setDateOfBirth(cal.getTime());
model.addAttribute(member);
return "member/read02";
}
// 3) Model 객체에 자바빈즈 클래스 객체를 특정한 이름을 지정하여 전달할 수 있다
@RequestMapping(value = "/read03", method = RequestMethod.GET)
public String read03(Model model) {
logger.info("read03");
Member member = new Member();
member.setUserId("hongkd");
member.setPassword("1234");
member.setEmail("aaa@ccc.com");
member.setUserName("홍길동");
member.setBirthDay("2022-11-28");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONDAY, 10);
cal.set(Calendar.DAY_OF_MONTH, 7);
member.setDateOfBirth(cal.getTime());
model.addAttribute("user", member);
return "member/read03";
}
// 4) Model 객체를 통해 배열과 컬렉션 객체를 전달할 수 있다
@RequestMapping(value = "/read04", method = RequestMethod.GET)
public String read04(Model model) {
logger.info("read04");
String[] carArray = {"jeep", "bmw"};
List<String> carList = new ArrayList<String>();
carList.add("jeep");
carList.add("bmw");
String[] hobbyArray = {"Music", "Movie"};
List<String> hobbyList = new ArrayList<String>();
hobbyList.add("Music");
hobbyList.add("Movie");
model.addAttribute("carArray", carArray);
model.addAttribute("carList", carList);
model.addAttribute("hobbyArray", hobbyArray);
model.addAttribute("hobbyList", hobbyList);
return "member/read04";
}
// 5) Model 객체를 통해 중첩된 자바빈즈 객체를 전달할 수 있다
@RequestMapping(value = "/read05", method = RequestMethod.GET)
public String read05(Model model) {
logger.info("read05");
Member member = new Member();
Address address = new Address();
address.setPostCode("080908");
address.setLocation("seoul");;
member.setAddress(address);
List<Card> cardList = new ArrayList<Card>();
Card card1 = new Card();
card1.setNo("123456");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, 9);
cal.set(Calendar.DAY_OF_MONTH, 8);
card1.setValidMonth(cal.getTime());
cardList.add(card1);
Card card2 = new Card();
card2.setNo("456789");
cal.set(Calendar.YEAR, 2021);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH, 7);
card2.setValidMonth(cal.getTime());
cardList.add(card2);
member.setCardList(cardList);
model.addAttribute("user", member);
return "member/read05";
}
// 6) Model 객체를 통해 다양한 타입의 값을 전달할 수 있다.
@RequestMapping(value = "/read06", method = RequestMethod.GET)
public String read06(Model model) {
logger.info("read06");
Member member = new Member();
member.setUserId("hongkd");
member.setPassword("1234");
member.setEmail("aaa@ccc.com");
member.setUserName("홍길동");
member.setBirthDay("2022-11-28");
member.setGender("male");
member.setDeveloper("Y");
member.setForeigner(true);
member.setNationality("Canada");
member.setCars("jeep");
member.setHobby("Sports");
String[] carArray = { "jeep", "bmw" };
member.setCarArray(carArray);
List<String> carList = new ArrayList<String>();
carList.add("jeep");
carList.add("bmw");
member.setCarList(carList);
String[] hobbyArray = {"Music", "Movie"};
member.setHobbyArray(hobbyArray);
List<String> hobbyList = new ArrayList<String>();
hobbyList.add("Music");
hobbyList.add("Movie");
member.setHobbyList(hobbyList);
Address address = new Address();
address.setPostCode("090890");
address.setLocation("Daejeon");
member.setAddress(address);
List<Card> cardList = new ArrayList<Card>();
Card card1 = new Card();
card1.setNo("123456");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, 9);
cal.set(Calendar.DAY_OF_MONTH, 8);
card1.setValidMonth(cal.getTime());
cardList.add(card1);
Card card2 = new Card();
card1.setNo("456789");
cal.set(Calendar.YEAR, 1999);
cal.set(Calendar.MONTH, 10);
cal.set(Calendar.DAY_OF_MONTH, 7);
card2.setValidMonth(cal.getTime());
cardList.add(card2);
member.setCardList(cardList);
cal.set(Calendar.YEAR, 1999);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH, 2);
member.setDateOfBirth(cal.getTime());
String introduction = "안녕하세요\n 반갑습니다.";
member.setIntroduction(introduction);
model.addAttribute("user", member);
return "member/read06";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>read01 20221128</title>
</head>
<body>
<h3>1) 매개변수에 선언된 Model 객체의 addAttribute()메서드를 호출하여 데이터를 뷰(View)에 전달한다.</h3>
<p>Result</p>
userId : ${userId } <br/>
password : ${password } <br/>
userName : ${userName } <br/>
email : ${email } <br/>
birthDay : ${birthDay } <br/>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>read02 20221128</title>
</head>
<body>
<h3>
2) Model 객체에 자바빈즈 클래스 객체를 값으로만 전달할 때는
뷰에서 참조할 이름을 클래스명의 앞글자를 소문자로 변환하여 처리한다.
</h3>
<p>Result</p>
member.userId : ${member.userId } <br/>
member.password : ${member.password } <br/>
member.userName : ${member.userName } <br/>
member.email : ${member.email } <br/>
member.birthDay : ${member.birthDay } <br/>
member.dateOfBirth : ${member.dateOfBirth } <br/>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>read03 20221128</title>
</head>
<body>
<h3>
3) Model 객체에 자바빈즈 클래스 객체를 특정한 이름을 지정하여 전달할 수 있다
</h3>
<p>Result</p>
user.userId : ${user.userId } <br/>
user.password : ${user.password } <br/>
user.userName : ${user.userName } <br/>
user.email : ${user.email } <br/>
user.birthDay : ${user.birthDay } <br/>
user.dateOfBirth : ${user.dateOfBirth } <br/>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>read04 20221128</title>
</head>
<body>
<h3>
4) Model 객체를 통해 배열과 컬렉션 객체를 전달할 수 있다
</h3>
<p>Result</p>
<h4>hobbyArray : </h4>
<c:forEach items="${hobbyArray }" var="hobby">
<c:out value="${hobby }"/>
</c:forEach>
<h4>hobbyList : </h4>
<c:forEach items="${hobbyList }" var="hobby">
<c:out value="${hobby }"/>
</c:forEach>
<h4>carArray : </h4>
<c:forEach items="${carArray }" var="car">
<c:out value="${car }"/>
</c:forEach>
<h4>carList : </h4>
<c:forEach items="${carList }" var="car">
<c:out value="${car }"/>
</c:forEach>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>read05 20221128</title>
</head>
<body>
<h3>
5) Model 객체를 통해 중첩된 자바빈즈 객체를 전달할 수 있다
</h3>
<h4>user.address :</h4>
user.address.postCode : ${user.address.postCode }<br/>
user.address.location : ${user.address.location }<br/>
<hr/>
<h4>user.cardList :</h4>
<c:forEach items="${user.cardList }" var="card">
<c:out value="${card.no } ${card.validMonth }"/>
</c:forEach>
<br/><br/>
<c:forEach items="${user.cardList }" var="card">
<c:out value="${card.no }"/> <br/>
<c:out value="${card.validMonth }"/> <br/>
</c:forEach>
<br/>
<c:forEach items="${user.cardList }" var="card">
${card.no } ${card.validMonth } <br/>
</c:forEach>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>read06 20221128</title>
</head>
<body>
<h3>
6) Model 객체를 통해 다양한 타입의 값을 전달할 수 있다.
</h3>
user.userId : ${user.userId }<br/>
user.password : ${user.password }<br/>
user.userName : ${user.userName }<br/>
user.email : ${user.email }<br/>
user.birthDay : ${user.birthDay }<br/>
user.gender : ${user.gender }<br/>
user.hobby : ${user.hobby }<br/>
<c:forEach items="${user.hobbyArray }" var="hobby">
<c:out value="${hobby }"/> <br/>
</c:forEach>
<br/>
<c:forEach items="${user.hobbyList }" var="hobby">
<c:out value="${hobby }"/> <br/>
</c:forEach>
<br/>
user.foreigner : ${user.foreigner }<br/>
user.developer : ${user.developer }<br/>
user.nationality : ${user.nationality }<br/>
user.address.postCode : ${user.address.postCode }<br/>
user.address.location : ${user.address.location }<br/>
<c:forEach items="${user.cardList }" var="card">
<c:out value="${card.no } ${card.validMonth }"/> <br/>
</c:forEach>
<br/>
<c:forEach items="${user.cardList }" var="card">
<c:out value="${card.no }"/> <br/>
<c:out value="${card.validMonth }"/> <br/>
</c:forEach>
<br/>
<c:forEach items="${user.cardList }" var="card">
${card.no } ${card.validMonth } <br/>
</c:forEach>
<br/>
user.cars : ${user.cars } <br/>
<c:forEach items="${user.carArray }" var="car">
${car } <br/>
</c:forEach>
<br/>
<c:forEach items="${user.carList }" var="car">
${car } <br/>
</c:forEach>
<br/>
user.introduction : ${user.introduction }<br/>
user.dateOfBirth : ${user.dateOfBirth }<br/>
</body>
</html>
package org.hdcd.controller;
import org.hdcd.vo.Member;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class ModelAttributeMemberController {
private static final Logger logger = LoggerFactory.getLogger(ModelAttributeMemberController.class);
/*
* 3. @ModelAttribute 어노테이션
* - @ModelAttribute 어노테이션은 전달받은 매개변수를 강제로 Model에 담아서 전달하도록 할대 필요한 어노테이션이다.
*/
// 3번 @ModelAttribute 어노테이션입력 Form 페이지
@RequestMapping(value = "/modelattribute/registerForm", method = RequestMethod.GET)
public String registerForm() {
logger.info("registerForm");
return "member/registerModelAttributeForm";
}
// 1) 기본 자료형은 매개변수로 선언하더라고 기본적으로 전달되지 않는다.
@RequestMapping(value = "/modelattribute/register01", method = RequestMethod.POST)
public String register01(String userId) { //String userId 매개변수는 return "result"전달 놉
// 매개변수로 기본 자료형을 선언하더라도 결과 페이지로 전달되지 않는다.
logger.info("register01");
logger.info("userId : " + userId);
return "result";
}
// 2) 기본 자료형인 매개변수에 @ModelAttribute 어노테이션을 지정하여 데이터를 전달한다.
@RequestMapping(value = "/modelattribute/register02", method = RequestMethod.POST)
public String register02(@ModelAttribute("userId") String userId) {
// 모델 설정 안해도 ! 넘어감 이 @ModelAttribute 어노테이션 사용시
logger.info("register02");
logger.info("userId : " + userId);
return "result";
}
// 3) 기본 자료형인 매개변수가 여러 개인 경우 각각의 매개변수에 @ModelAttribute 어노테이션을 지정하여 데이터를 전달한다.
@RequestMapping(value = "/modelattribute/register03", method = RequestMethod.POST)
public String register03(@ModelAttribute("userId") String userId,
@ModelAttribute("password") String password ) {
// @ModelAttribute 어노테이션 각각 주면 매개변수 넘어간다! 모델 없이도 ㅎㅎ
logger.info("register03");
logger.info("userId : " + userId);
logger.info("password : " + password);
return "result";
}
// 4) 자바빈즈 규칙에 맞는 객체는 매개변수로 선언하면 기본적으로 전달된다
@RequestMapping(value = "/modelattribute/register04", method = RequestMethod.POST)
public String register04(Member member) {
// @ModelAttribute 어노테이션을 사용하지 않아도! 모델로 넘겨주지 않아도! 객체로 받는 즉시 넘겨줌 원하는 값 출력가능
logger.info("register04");
logger.info("member.getUserId() : " + member.getUserId());
logger.info("member.getPassword() : " + member.getPassword());
return "result";
}
// 5) 자바빈즈 규칙에 맞는 객체는 매개변수로 선언하면 기본적으로 전달된다 (2)
@RequestMapping(value = "/modelattribute/register05", method = RequestMethod.POST)
public String register05(Member member) {
logger.info("register05");
logger.info("member.getUserId() : " + member.getUserId());
logger.info("member.getPassword() : " + member.getPassword());
logger.info("member.getAddress().getPostCode() : " + member.getAddress().getPostCode());
logger.info("member.getAddress().getLocation() : " + member.getAddress().getLocation());
return "result";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register Model Attribute 20221129</title>
</head>
<body>
<h3>3. @ModelAttribute 어노테이션</h3>
<p>
요청 View : registerModelAttributeForm.jsp<br/>
컨트롤러 : ModelAttributeMemberController
</p>
<p>1) 기본자료형은 매개변수로 선언하더라도 기본적으로 전달되지 않는다.</p>
<form action="/modelattribute/register01" method="post">
userId : <input type="text" name="userId" value="hongkd"/><br/>
password : <input type="text" name="password" value="1234"/><br/>
<input type="submit" value="register01"/><br/>
</form><br/>
<p>2) 기본 자료형인 매개변수에 @ModelAttribute 어노테이션을 지정하여 데이터를 전달한다.</p>
<form action="/modelattribute/register02" method="post">
userId : <input type="text" name="userId" value="hongkd"/><br/>
password : <input type="text" name="password" value="1234"/><br/>
<input type="submit" value="register02"/><br/>
</form><br/>
<p>3) 기본 자료형인 매개변수가 여러 개인 경우 각각의 매개변수에 @ModelAttribute 어노테이션을 지정하여 데이터를 전달한다.</p>
<form action="/modelattribute/register03" method="post">
userId : <input type="text" name="userId" value="hongkd"/><br/>
password : <input type="text" name="password" value="1234"/><br/>
<input type="submit" value="register03"/><br/>
</form><br/>
<p> 4) 자바빈즈 규칙에 맞는 객체는 매개변수로 선언하면 기본적으로 전달된다.</p>
<form action="/modelattribute/register04" method="post">
userId : <input type="text" name="userId" value="hongkd"/><br/>
password : <input type="text" name="password" value="1234"/><br/>
<input type="submit" value="register04"/><br/>
</form><br/>
<p> 5) 자바빈즈 규칙에 맞는 객체는 매개변수로 선언하면 기본적으로 전달된다. (2)</p>
<form action="/modelattribute/register05" method="post">
userId : <input type="text" name="userId" value="hongkd"/><br/>
password : <input type="text" name="password" value="1234"/><br/>
postCode : <input type="text" name="address.postCode" value="12345"/><br/>
location : <input type="text" name="address.location" value="대전시"/><br/>
<input type="submit" value="register05"/><br/>
</form><br/>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Result 20221129</title>
</head>
<body>
<h3>Result</h3>
userId : ${userId }<br/>
password : ${password } <br/>
member.userId : ${member.userId }<br/>
member.password : ${member.password } <br/>
<c:if test="${not empty member.address.postCode }">
member.address.postCode : ${member.address.postCode }<br/>
</c:if>
<c:if test="${not empty member.address.location }">
member.address.location : ${member.address.location }<br/>
</c:if>
<!-- RedirectAttributes시에 사용 -->
msg : ${msg }
</body>
</html>
package org.hdcd.controller;
import org.hdcd.vo.Member;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
public class RedirectAttributeMemberController {
private static final Logger logger = LoggerFactory.getLogger(RedirectAttributeMemberController.class);
/*
* 4. @RedirectAttributes 어노테이션
* - @RedirectAttributes 어노테이션은 일회성으로 데이터를 전달하는 용도로 사용된다.
*/
@RequestMapping(value = "/redirectAttributes/registerForm", method = RequestMethod.GET)
public String registerForm() {
logger.info("redirectattribute registerForm");
return "member/registerRedirectAttributeForm";
}
// 1) RedirectAttributes는 일회성으로 데이터를 전달하는 용도로 사용 된다.
@RequestMapping(value = "/redirectattribute/register", method = RequestMethod.POST)
public String register(Member member, RedirectAttributes redirectAttributes) {
logger.info("register");
redirectAttributes.addFlashAttribute("msg", "success");
return "redirect:/redirectattribute/result";
}
// (1)번 처리후 넘어갈 결과 페이지
@RequestMapping(value = "/redirectattribute/result", method = RequestMethod.GET)
public String result() {
logger.info("result");
return "result";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register Redirect Attribute Form</title>
</head>
<body>
<h3>Register Form</h3>
<form action="/redirectattribute/register" method="post">
userId : <input type="text" name="userId" value="hongkd"/><br/>
password : <input type="text" name="password" value="1234"/><br/>
<input type="submit" value="register"/><br/>
</form>
</body>
</html>