1. 핸들러 매핑으로 핸들러 조회
2. 핸들러 어댑터 조회
3. 핸들러 어댑터 실행
뷰 리졸버
1. 핸들러 어댑터를 통해 논리뷰 이름을 획득
2. ViewResolver를 호출
3. InternalResourceViewResolver 반환
4. InternalResourceView는 foward()를 호출해서 처리 할수 있을때만 사용
5. view.render() 호출
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process(){
return new ModelAndView("new-form");
}
}
해당 url로 이 메서드가 호출, 모델과 뷰 정보를 담아서 반환
@Controller
public class SpringMemberSaveControllerV1 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/members/save")
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
ModelAndView mv = new ModelAndView("save-result");
// mv.getModel().put("member",member);
mv.addObject("member",member);
return mv;
}
}
repository에 member 저장, 그후 모델에 mv.addObject로 member객체 넘긴다
@Controller
public class SpringMemberListControllerV1 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/members")
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
List<Member> members = memberRepository.findAll();
ModelAndView mv = new ModelAndView("members");
mv.addObject("members",members);
return mv;
}
}
세개로 나눴지만 사실 requestmapping은 메서드 단위로도 적용할수 있기 때문에 통합이 가능하다
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
@RequestMapping("/new-form")
public ModelAndView newForm(){
return new ModelAndView("new-form");
}
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping
public ModelAndView members(HttpServletRequest request, HttpServletResponse response) {
List<Member> members = memberRepository.findAll();
ModelAndView mv = new ModelAndView("members");
mv.getModel().put("members", members);
return mv;
}
@RequestMapping("/save")
public ModelAndView save(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
ModelAndView mv = new ModelAndView("save-result");
// mv.getModel().put("member",member);
mv.addObject("member",member);
return mv;
}
}
클래스 레벨에 @RequestMapping을 두면 메서드 레벨과 url이 조합된다.
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
@GetMapping("/new-form")
public String newForm(){
return "new-form";
}
private MemberRepository memberRepository = MemberRepository.getInstance();
@GetMapping
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members",members);
return "members";
}
@PostMapping("/save")
public String save(@RequestParam("username") String username,
@RequestParam("age") int age,
Model model) {
// String username = request.getParameter("username");
// int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
// ModelAndView mv = new ModelAndView("save-result");
// mv.getModel().put("member",member);
// mv.addObject("member",member);
model.addAttribute("member", member);
return "save-result";
}
}
@RequestParam 요청 파라미터를 쉽게 받을수 있다.
modelandview를 생성할 필요없이 .addAttribute로 넣고 반환은 view의 논리이름을 해주면 된다.