1. @ModelAttribute를 이용한 커맨드 객체 이름 지정
아래와 같이 ModelAttribute를 이용해서 클래스 이름을 변경해서 뷰 코드에서 사용할 때 이용가능하다.
view 단에서 접근 할 때 $(memberInfo.name)이렇게 접근하면 된다.
@RequestMapping(method = RequestMethod.POST)
public String regist(
@ModelAttribute("memberInfo") MemberRegistRequest memRegReq,
BindingResult bindingResult) {
new MemberRegistValidator().validate(memRegReq, bindingResult);
if (bindingResult.hasErrors()) {
return MEMBER_REGISTRATION_FORM;
}
memberService.registNewMember(memRegReq);
return "member/registered";
}
2. @ModelAttribute 애노테이션을 이용한 공통 모델
아래와 같이 목록화면과 상세보기화면에서 함께 사용되는 데이터가 있을 경우 @ModelAttribute를 사용하면 된다. -코드 중복 막을 수 있음
따라서 event/list 화면영역과 event/detail 화면 영역에서 모두 ${recEventList}로 데이터 불러올 수 있다.
물론 , 목록 컨트롤러에서는 ${evnetList}, ${evnetTypes} 등을 이용해서 데이터를 불러올 수도 있다.
@Controller
@RequestMapping("/event")
public class EventController {
private static final String REDIRECT_EVENT_LIST = "redirect:/event/list";
private EventService eventService;
public EventController() {
eventService = new EventService();
}
@ModelAttribute("recEventList")
public List<Event> recommend() {
return eventService.getRecommendedEventService();
}
@RequestMapping("/list")
public String list(SearchOption option, Model model) {
List<Event> eventList = eventService.getOpenedEventList(option);
model.addAttribute("eventList", eventList);
model.addAttribute("eventTypes", EventType.values());
return "event/list";
}
@InitBinder
protected void initBinder(WebDataBinder binder) {
CustomDateEditor dateEditor = new CustomDateEditor(new SimpleDateFormat("yyyyMMdd"), true);
binder.registerCustomEditor(Date.class, dateEditor);
}
@RequestMapping("/detail")
public String detail(HttpServletRequest request, Model model) throws IOException {
String id = request.getParameter("id");
if (id == null)
return REDIRECT_EVENT_LIST;
Long eventId = null;
try {
eventId = Long.parseLong(id);
} catch (NumberFormatException e) {
return REDIRECT_EVENT_LIST;
}
Event event = getEvent(eventId);
if (event == null)
return REDIRECT_EVENT_LIST;
model.addAttribute("event", event);
return "event/detail";
}
############################################################
@ModelAttribute("recEventList")
public List<Event> recommend() {
return eventService.getRecommendedEventList();
}
@RequestMapping("/list")
public String list(@ModelAttribute("recEventList") List<Event> recEventList,
Model model) {
//이런 식으로 @ModelAttribute 애노테이션이 적용된 메서드의 객체(public List<Event> recommend())를
//@RequestMapping애노테이션이 적용된 메서드에서 접근할 수 있다.
3. @ModelAttribute 를 이용한 페이지 내 권한 부여
prde.tistory.com/36페이지 수준 권한부여 여기를 참조
4. Model vs. ModelMap vs. ModelAndView
Model model
model.addAttribute("hello", "aaa"); // ${hello}로 접근
ModelAndView
1) Model을 이용해 뷰에 전달할 데이터 설정 //mav.addObject("questions", question);
2) 결과를 보여줄 뷰 이름 리턴 // mav.setViewName("경로");
@GetMapping
public ModelAndView form() {
List<Question> questions = createQuestions();
ModelAndView mav = new ModelAndView();
mav.addObject("qusetions", questions);
mav.setViewName("survey/surveyForm");
return mav;
}
ModelMap
Model은 인터페이스이고 ModelMap은 클래스이다. (즉, 같은 것임)
modelMap.addAttribute("hello", "bbb");
https://cocobi.tistory.com/140
'Back-end > Spring-핵심& webMVC' 카테고리의 다른 글
MessageSource 메시지 국제화 처리 (0) | 2021.06.05 |
---|---|
QueryString, request.getParameter, request.getParameterValues (0) | 2021.06.03 |
ch5. 컴포넌트 스캔(#스프링5 프로그래밍 입문-최범균 저) (0) | 2021.05.07 |
ch4. 의존자동주입(#스프링5 프로그래밍 입문-최범균 저) (0) | 2021.05.06 |
JSP 태그 라이브러리 (0) | 2021.05.05 |