Computer Science/Spring

#7 Model Data

꿈꾸는어린이 2018. 5. 26. 15:57


//

Model Data

  • Controller가 request 처리 후 view에 전달하는 데이터

  • Command 객체, request 처리 결과, view 생성에 필요한 참조 데이터 등

<br>

ModelAndView를 이용한 Model Data 설정

  • Controller의 처리 결과를 출력할 view 이름 지정

  • View에 전달할 데이터 저장

  • [ Constructors ]

    public ModelAndView(String viewName)

    public ModelAndView(String viewName, Object modelObject)

    생성자를 통해 전달하는 경우는 View에 전달할 객체가 하나인 경우에 유용함.

  • [ Setters ]

    public void setViewName(String viewName)

    public ModelAndView addObject(String attributeName, Object modelObject)

<br>

@ModelAttribute

  • parameter나 return 객체에 이름을 부여하고 view에 전달

    1. 여러 view에서 공통으로 참조되는 모델 데이터 생성

  @Controller
public class GameSearchController {
@Autowired
private SearchService searchService;

static final Logger LOGGER = LoggerFactory.getLogger(GameSearchController.class);

 
 //여러 view에서 공통으로 참조되는 모델 데이터 생성
@ModelAttribute("searchTypeList") //view에서 참조될 모델 객체의 이름
public List<SearchType> referenceSearchTypeList() {
List<SearchType> options = new ArrayList<SearchType>();
options.add(new SearchType(1, "전체"));
options.add(new SearchType(2, "아이템"));
options.add(new SearchType(3, "캐릭터"));
return options;
}

@ModelAttribute("popularQueryList")
public String[] getPopularQueryList() {
return new String[] { "게임", "창천2", "위메이드" };
}

...
}

<br>

"/search/main" view

  
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>게임 검색 메인</title>
</head>
<body>
인기 키워드: <c:forEach var="popularQuery" items="${popularQueryList}">${popularQuery} </c:forEach>
<form action="game.do">
<select name="type">
<c:forEach var="searchType" items="${searchTypeList}">
<option value="${searchType.code}">${searchType.text}</option>
</c:forEach>
</select>
<input type="text" name="query" value=""/>
<input type="submit" value="검색" />
</form>
</body>
</html>

<br>

service searchType

  
public class SearchType {

private int code;
private String text;

public SearchType(int code, String text) {
this.code = code;
this.text = text;
}

public int getCode() {
return code;
}

public void setCode(int code) {
this.code = code;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

<br>

  1. Command 객체 초기화

    • GET request에 대해 form의 항목들을 초기화 한 후 view에 출력

    • POST request에 대해 form에 입력된 값들을 전달

  @Controller
@RequestMapping("/account/create.do")
public class CreateAccountController {

@ModelAttribute("memeber")  //command 객체 이름 저장
public MemberInfo formBacking(HttpServletRequest request) {
if (request.getMethod().equalsIgnoreCase("GET")) {
MemberInfo mi = new MemberInfo(); //command 객체 생성
Address address = new Address();
address.setZipcode(autoDetectZipcode(request.getRemoteAddr()));
mi.setAddress(address); //address필드 초기화
return mi;
} else {
return new MemberInfo();//command 객체 생성
}
}

private String autoDetectZipcode(String remoteAddr) {
return "000000";
}

@RequestMapping(method = RequestMethod.GET)
public String form() {
return "account/creationForm";
     //formBacking()에 의해 생성 및 초기화된 "memeber"객체가 자동적으로 view에 전달됨
}

@RequestMapping(method = RequestMethod.POST)
public String submit(@ModelAttribute("memeber") MemberInfo memberInfo,
BindingResult result){
     //formBacking()에 의해 생성된 "memeber"객체에 form입력 값들이 저장된 후, memeberInfo로 참조됨
new MemberInfoValidator().validate(memberInfo, result);
if (result.hasErrors()) {
return "account/creationForm";
}
// accountService.createAccount(memberInfo); // 요청 처리
return "account/created"; //"member"객체가 view에 전달됨
}
}

<br>

creationForm.jsp

  
<title>계정 생성</title>
</head>
<body>
<form:form commandName="memeber" method="post">
아이디: <form:input type="text" path="id" value="${id}" />
<form:errors path="id" />
<br/>
이름: <form:input type="text" path="name" value="${name}" />
<form:errors path="name" />
<br/>
우편번호: <form:input type="text" path="address.zipcode" value="${address.zipcode}" />
<form:errors path="address.zipcode" />
<br/>
주소1: <form:input type="text" path="address.address1" value="${address.address1}" />
<form:errors path="address.address1" />
<br/>
주소2: <form:input type="text" path="address.address2" value="${address.address2}" />
<form:errors path="address.address2" />
<br/>
<input type="submit" value="전송"/>
</form:form>
</body>

'Computer Science > Spring' 카테고리의 다른 글

#9 HTTP Session 사용  (0) 2018.06.16
#8 Form 입력 값 검증  (0) 2018.06.16
#6 Command 객체 이용한 Form 전송 처리  (2) 2018.05.25
#5 Spring MVC 구조  (0) 2018.05.25
#4 Bean 객체의 life-cycle 관리  (0) 2018.05.14