우리는 jsp로 개발을 할 때 HttpServletRequest의 getParametar() 메소드를 이용하여 값을 받아 올 수 있었다. spring에서는 @RequestParam 어노테이션을 사용하여 값을 받아올 수 있다.
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
System.out.println("username : " + username);
System.out.println("age : " + age);
response.getWriter().write("ok");
}
기존에 우리가 HttpServletRequest를 사용하여 값을 받아오던 방식이다.
아직은 jsp에 익숙해서 이 방식도 불편하다고 생각하지 않지만 @RequestParam 을 사용하면
더욱 간편하게 작성할 수 있다.
@RequestParam을 사용한 방법들에 대해 알아보자.
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2( @RequestParam("username") String username , @RequestParam("age") int age){
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok";
}
url
@ResponseBody
view 조회를 무시하고 , HTTP message body에 직접 해당 내용 입력!!
화면이동이 되지않고 return 값이 화면에 바로 출력된다.
@RequestParam
파라미터 이름으로 바인딩된다.
name 속성이 파라미터 이름으로 사용
http 파라미터 이름이 변수 이름과 같으면 @RequestParam("변수이름") 생략가능
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(@RequestParam String username , @RequestParam int age){
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok";
}
String, int 등 단순타입이면 @RequestParam 도 생략가능하다.
MVC내부에서 required=false를 적용한다.
추천하지 않음
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4( String username , int age){
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(@RequestParam(required = true) String username
,@RequestParam(required = false) Integer age){
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok";
}
http://localhost:9090/request-param-required?username=test&age=20
/request-param-required -> username이 없으므로 에러
/request-param-required?username= -> 빈 문자로 통과
/request-param-required?username=test ->null을 int에 입력하는 것이 불가능 , 따라서 Integer로 변경해야 함
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParameDefault(
@RequestParam(required = true, defaultValue = "geust") String username ,
@RequestParam(required = false, defaultValue = "-1") Integer age){
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok";
}
http://localhost:9090/request-param-default?username=test&age=20
/request-param-default?username=test&age=20 ->
/request-param-default?username=test -> age는-1
/request-param-default?username= ->username = geust
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap( @RequestParam Map<String, Object> paramMap ){
System.out.println("username : " + paramMap.get("username"));
System.out.println("age : " + paramMap.get("age"));
return "ok";
}
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1( @RequestParam String username, @RequestParam int age ){
helloData hello = new helloData();
hello.setUsername(username);
hello.setAge(age);
System.out.println("username : " + hello.getUsername());
System.out.println("age : " + hello.getAge());
return "ok";
}
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(@ModelAttribute helloData helloData ){
System.out.println("username : " + helloData.getUsername());
System.out.println("age : " + helloData.getAge());
System.out.println("hello : " + helloData.toString());
return "ok2";
}
String,int 같은 단순 타입 -> @RequestParam
객체 -> @ModelAttribute
ResponseParam은 값을 화면으로 넘겨준다.
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
ModelAndView mav = new ModelAndView("response/hello").addObject("data","hello");
return mav;
}
@ResponseBody // 페이지를 이동하지않고 리턴된 문자열만 화면에 보여지게된다. 넣지안도록 주의한다.
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data", "model data");
return "response/hello";
}