FRAMEWORK/SPRING
@ModelAttribute 어노테이션
적외선
2014. 11. 5. 10:26
■ @ModelAttribute 어노테이션의 작업 수행
● @RequestMapping 어노테이션이 적용되지 않은 별도 메서드로 모델에 추가될 객체 생성(공통 데이터 생성)
=> @ModelAttribute 어노테이션을 메서드에 적용하면 해당 메서드가 생성한 객체가 뷰에 전달 됨
=> "뷰에 모델(Model) 전달(@ModelAttribute("popularFruit")" 게시물 참조
● 커맨드 객체의 초기화 작업 수행
=> @ModelAttribute 어노테이션이 적용된 메서드가 @RequestMapping 어노테이션이 적용된 메서드 보다 먼저 호출 됨
● @ModelAttribute 어노테이션이 적용된 메서드가 사용 가능한 파라미터
=> HttpServletRequest, Locale, @RequestParam 어노테이션 적용 파라미터, @PathVariable 어노테이션 적용 파라미터 등등
UserVO.java
package sp.mvc.vo; public class UserVO { private String userName; private String address; private String fruit; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getFruit() { return fruit; } public void setFruit(String fruit) { this.fruit = fruit; } @Override public String toString() { return "UserVO [userName=" + userName + ", address=" + address + ", fruit=" + fruit + "]"; } } |
UserController.java
package sp.mvc.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import sp.mvc.vo.UserVO; @Controller public class UserController { @ModelAttribute("userVo") public UserVO initData(HttpServletRequest req){ System.out.println("--- @ModelAttribute() ---"); if(req.getMethod().equalsIgnoreCase("GET")){ System.out.println("--- @ModelAttribute(): GET ---"); UserVO userVo = new UserVO(); userVo.setUserName("input name"); userVo.setAddress("input address"); userVo.setFruit("input fruit"); return userVo; }else{ System.out.println("--- @ModelAttribute(): POST ---"); return new UserVO(); } } @RequestMapping(value="/userForm.sp", method=RequestMethod.GET) public String userForm(){ System.out.println("----- UserController.userForm() : GET -----"); return "user/userForm"; } @RequestMapping(value="/userSave.sp", method=RequestMethod.POST) public ModelAndView userSave(@ModelAttribute("userVo") UserVO userVo, Model model){ System.out.println("----- UserController.userSave() : POST -----"); System.out.println("userInfo : " + userVo.toString()); model.addAttribute("msg", "SUCCESS"); ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("user/userInfo"); modelAndView.addObject("userVo", userVo); return modelAndView; } } |
● @ModelAttribute 어노테이션이 적용된 메소드가 @RequestMapping 어노테이션이 적용된 메소드 보다 먼저 호출되기 때문에, 커맨드 객체에 대한 초기화 작업이 필요하다면 커맨드 객체와 동일한 이름을 갖는 @ModelAttribute 어노테이션이 적용된 메소드를 이용 => (결과화면 참고)
main_config.xml
userForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>회원정보 입력</title> </head> <body> <form action="userSave.sp" method="post"> <table border="1"> <tr> <td>이름</td> <td><input type="text" name="userName" value="${userVo.userName}"/></td> </tr> <tr> <td>주소</td> <td><input type="text" name="address" value="${userVo.address}"/></td> </tr> </table> <input type="submit" name="submit" value="전송"/> </form> </body> </html> |
userInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>회원정보 출력</title> </head> <body> <h2>${msg}</h2> <form action="userView.sp" method="post"> <table border="1"> <tr> <td>이름</td> <td>${userVo.userName}</td> </tr> <tr> <td>주소</td> <td>${userVo.address}</td> </tr> </table> <input type="submit" name="submit" value="뷰"/> </form> </body> </html> |
결과
요청 URL http://localhost:8090/spring303/userForm.sp --- @ModelAttribute() --- --- @ModelAttribute(): GET --- ----- UserController.userForm() : GET -----
데이터 입력 후 '전송'버튼 클릭 --- @ModelAttribute() --- --- @ModelAttribute(): POST --- ----- UserController.userSave() : POST ----- userInfo : UserVO [userName=스누피, address=제주도 456, fruit=null]
|
출처 - http://0px.kr/314