@RequestMapping
을 잘 보면 클래스 단위가 아니라 메서드 단위에 적용된 것을 확인할 수 있다.
따라서 컨트롤러 클래스를 유연하게 하나로 통합할 수 있다.
경로 : hello.servlet1.web.springmvc.v2
package hello.servlet1.web.springmvc.v2;
import hello.servlet1.domain.member.Member;
import hello.servlet1.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 클래스 단위 -> 메서드 단위
* @RequestMapping 클래스 레벨과 메서드 레벨 조함
*/
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form")
public ModelAndView newForm(){
return new ModelAndView("new-form");
}
@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 mav = new ModelAndView("save-result");
mav.addObject("member",member);
return mav;
}
}
컨트롤러 클래스를 통합하는 것을 넘어서 조합도 가능하다.
/springmvc/v2/members
라는 부분에 중복이 잇다.
@RequestMapping("/springmvc/v2/members/new-form")
@RequestMapping("/springmvc/v2/members)
@RequestMapping("/springmvc/v2/members/save")
물론 이렇게 사용해도 되지만, 컨트롤러를 통합한 예제 코드를 보면 중복을 어떻게 제거 했는지 확인할 수 있다.
클래스 레벨에 @RequestMapping
을 두면 메서드 레벨과 조합이 된다.
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberContollerV2{}
조합 결과
클래스 레벨 @RequestMapping("/springmvc/v2/members)
메서드 레벨 @RequestMapping("/new-form")
-> /springmvc/v2/members/new-form
메서드 레벨 @RequestMapping("/save")
-> /springmvc/v2/members/save
메서드 레벨 @RequestMapping
-> /springmvc/v2/members실행 )
등록 : http://localhost:8080/springmvc/v2/members/new-form
목록 : http://localhost:8080/springmvc/v2/members
실무에서는 지금 부터 설명하는 방식을 주로 사용
경로 : hello.servlet.web.springmvc.v3
package hello.servlet1.web.springmvc.v3;
import hello.servlet1.domain.member.Member;
import hello.servlet1.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* v3
* Model 도입
* ViewName 직접 반화
* @RequestParam 사용
* @RequestMapping -> @GetMapping, @PostMapping
*/
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@GetMapping("/new-form")
public String newForm(){
return "new-form";
}
@PostMapping("/save")
public String save(
@RequestParam("username") String username,
@RequestParam("age") int age,
Model model
){
Member member = new Member(username, age);
memberRepository.save(member);
model.addAttribute("member",member);
return "save-result";
}
@GetMapping
public String members(Model model){
List<Member> members = memberRepository.findAll();
model.addAttribute("members",members);
return "members";
}
}
save()
, members()
를 보면 Model을 파라미터로 받는 것을 확인할 수 있다.
스프링 MVC도 이런 편의기능을 제공한다.
뷰의 논리 이름을 반환할 수 있다.
스프링은 HTTP 요청 파라미터를 @RequestParam
으로 받을 수 있다.
@RequestParam("username")
은 request.getParameter("username")
와 거의 같은 코드라 생각하면 된다.
물론 GET 쿼리 파라미터, POST Form 방식을 모두 지원
@RequestMapping
은 URL만 매칭하는 것이 아니라, HTTP Method도 함께 구분할 수 있다.
예를 들어서 URL이 new-form
이고, HTTP Method가 GET인 경우를 모두 만족하는 매핑하려면 다음과 같이 처리하면 된다.
@RequestMapping(value="/new-form",method=RequestMethod.GET)
이것을 @GetMapping
,@PostMapping
으로 더 편리하게 사용할 수 있다.
참고록 GET,Post,Put,Delete,Patch 모두 애노테이션을 준비되어 있다.
실행 )
등록 : http://localhost:8080/springmvc/v3/members/new-form
목록 : http://localhost:8080/springmvc/v3/members