설명
시작
core2.controller > request 패키지 생성
@Controller
public class RequestParamController {
@RequestMapping("/request-param-v1")
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
response.getWriter().write("username : " + username);
response.getWriter().write("age : " + age);
}
}
설명
@ResponseBody를 사용하면 return값이 스트링 값일 경우, view 조회를 무시하고
HTTP BODY에 바로 내용을 출력 할 수 있다
-> response.getWriter().write 대용으로 사용 가능
@RequestParam을 사용해 파라미터 이름을 바인딩 할 수 있는데, 이때 ( ) 안의 값은 form 태그의 경우 name속성 값이 파라미터 이름으로 사용된다.
따라서 메서드 파라미터 안에서만 정의해주고 나면 return을 이용해 HTTP BODY에 바로 표현해주면 다음과 같은 결과가 출력된다.
RequestParamController 수정
...
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(@RequestParam("username") String username , @RequestParam("age") int age)
throws IOException {
return "username : " + username + "<br>" + "age : " + age;
}
}
출력
설명
...
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(@RequestParam String username , @RequestParam int age) throws IOException {
return "username : " + username + "<br>" + "age : " + age;
}
}
출력
설명
...
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username , int age) throws IOException {
return "username : " + username + "<br>" + "age : " + age;
}
}
출력
설명
required = true을 파라미터 안에 넣어준다면 반드시 파라미터 값이 들어와야 한다.
uri 예시)
...
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(@RequestParam(required=true) String username , @RequestParam(required=false) Integer age)
throws IOException {
return "username : " + username + "<br>" + "age : " + age;
}
}
출력
설명
defaultBalue
...
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(@RequestParam(required=true , defaultValue = "guest") String username,
@RequestParam(required=false, defaultValue = "-1") Integer age)
throws IOException {
return "username : " + username + "<br>" + "age : " + age;
}
}
출력
설명
...
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap)
throws IOException {
return "username : " + paramMap.get("username") + "<br>" + "age : " + paramMap.get("age");
}
}
출력
@Getter @Setter @ToString
public class HelloData {
private String username;
private int age;
}
설명
...
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@RequestParam String username, @RequestParam int age){
HelloData hello = new HelloData();
hello.setUsername(username);
hello.setAge(age);
return hello.toString();
}
}
출력
설명
- 기존에 값을 일일이 받아서 저장해주고 값을 불러왔어야 했지만 @ModleAttribute를 이용하면 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주는 과정을자동화 시켜주어 코드를 줄일 수 있다.
...
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(@ModelAttribute HelloData hellodata){
return hellodata.toString();
}
}
출력
설명
@ModelAttribute도 생략이 가능하다
@RequestParam은 String, int와 같은 단순 타입일 경우 생략가능하고
@ModelAttribute는 객체 타입일 경우 생략 가능하다.
@ResponseBody
@RequestMapping("/model-attribute-v3")
public String modelAttributeV3( HelloData hellodata){
return hellodata.toString();
}
출력
core2.controller > response 패키지 생성
resources.templates > response 폴더 생성
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p th:text="${data}">empty</p>
</body>
</html>
@Controller
public class ResponseViewController {
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
ModelAndView mav = new ModelAndView("response/hello").addObject("data","hello!");
return mav;
}
}
출력
...
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data", "model data");
return "response/hello";
}
}
출력
전체 코드