@RequestParam
, @ModelAttribute
을 사용하면 요청 파라미터를 매우 편리하게 이용할 수 있다.💡 기본 예시
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(@RequestParam("username") String memberName, @RequestParam("age") int memberAge) {
// 콘솔창에 띄우기
System.out.println("username : " + memberName);
System.out.println("age : " + memberAge);
// 브라우저에 띄우기
return "ok v2";
}
📌
@ResponseBody
- view조회를 무시하고, HTTP message body에 직접 해당 내용 입력
http://localhost:9090/request-param-v2?username=홍길동&age=17
- @RequestParam("username") String memberName
- username으로 파싱해서 String memberName으로 받아옴
- memberName = 홍길동
- @RequestParam("age") int memberAge
- age로 파싱해서 int memberAge으로 받아옴
- memberAge = 17
💡 HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam("XXX") 생략 가능
@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 v3";
}
@RequestParam("username") String memberName
→@RequestParam String username
💡 String, int 등의 단순 타입이면 @RequestParam도 생략가능
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok v4";
}
@RequestParam String username, @RequestParam int age
→String username, int age
💡 파라미터값에 대한 필수 여부
@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 required";
}
required = false
: 파라미터 누락 가능
required = true
: 파라미터 반드시 필요
int등 단순 변수 타입에 null값 ❌ -> wrapper 타입으로 변경 Integer age
💡 defaultvalue : 기본값 세팅
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(@RequestParam(required = true, defaultValue = "guest") String username, @RequestParam(required = false, defaultValue = "-1") Integer age) {
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok defaultValue";
}
required = true
: 파라미터 반드시 필요
defaultValue = "guest"
: username 기본값 "guest"
defaultValue = "-1"
: age 기본값 "-1"
localhost:9090/request-param-default?username=
처럼 빈 문자열도 사용가능
사용자 정의 객체
사용 시 💡 기본 예시
public class HelloData {
private String username;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "HelloData [username=" + username + ", age=" + age + "]";
}
}
@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("helloData : " + helloData.toString());
return "ok hellodata";
}
@ModelAttribute
: 다음의 코드 자동화HelloData helloData = new HelloData(); helloData.setUsername(username); helloData.setAge(age);
💡 @ModelAttribute
생략가능
@ResponseBody
@RequestMapping("/model-attribute-v3")
public String modelAttributeV3(HelloData helloData) {
System.out.println("username : " + helloData.getUsername());
System.out.println("age : " + helloData.getAge());
System.out.println("helloData : " + helloData.toString());
return "ok hellodata3";
}
@ModelAttribute HelloData helloData
→HelloData helloData
💡 뷰 생성
<!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>
💡 사용 예시
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
ModelAndView mav = new ModelAndView("response/hello")
.addObject("data","hello");
return mav;
}
new ModelAndView("response/hello")
: 뷰 경로
.addObject("data","hello")
: 데이터 담는 곳
"data"
: key 값
"hello"
: value 값
💡 사용 예시
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data","hello2");
return "response/hello";
}
model.addAttribute("data","hello2")
: 데이터 담는 곳
"data"
: key 값
"hello2"
: value 값
💡 @ResponseBody를 사용한다면
@ResponseBody
@RequestMapping("/response-view-v3")
public String responseViewV3(Model model) {
model.addAttribute("data","hello2");
return "response/hello";
}
@ResponseBody
❌ : response/body로 뷰 리졸버가 실행되어서 뷰를 찾고 렌더링
@ResponseBody
⭕ : 뷰 리졸버를 실행하지 않고 , http 메시지 바디에 직접 response/body라는 문자열을 반환