파라미터 (요청 시 전달값)를 받는 방법
👉🏻 앞으로 3번과 4번 위주로 진행할 것
1️⃣ HttpServletRequest 객체를 이용해서 전달받기 (기존의 jsp / servlet 방식)
👉🏻 해당 메소드의 매개변수로 HttpServletRequest 객체를 전달받아야 함
👉🏻 해당 메소드 호출 시 자동으로 Spring에 의해 객체가 생성돼서 매개변수로 주입해 줌
⌨️ 잘 실행되는지 확인 ver.
@RequestMapping(value="login.me")
public void loginMember(HttpServletRequest request) {
// HttpServletRequest request가 어디서 왔는지 궁금해하지 마라!!
// 스프링이 자동으로 생성해서 나에게 줌
String userId = request.getParameter("userId");
String userPwd = request.getParameter("userPwd");
System.out.println("userId: " + userId);
System.out.println("userPwd: " + userPwd);
}
2️⃣ @RequestParam 어노테이션을 이용하는 방법
👉🏻 request.getParameter("키")로 밸류를 뽑아 오는 역할을 대신해 주는 어노테이션
👉🏻 어노테이션의 value 속성으로 jsp에서 작성했던 name 속성값을 담으면 알아서 해당 매개변수로 요청 시 전달값을 받아 옴
👉🏻 만약, 넘어온 값이 비어 있는 형태라면 defaultValue 속성으로 기본값 지정 가능
👉🏻 value 값을 일치하지 않게 적으면 무조건 defaultValue 기준으로 넘어가므로 주의할 것!
⌨️ 잘 실행되는지 확인 ver.
@RequestMapping(value="login.me")
public void loginMember(@RequestParam(value="userId", defaultValue="없음") String userId
, @RequestParam(value="userPwd") String userPwd) {
System.out.println("userId: " + userId);
System.out.println("userPwd: " + userPwd);
}
👉🏻 만약, 넘어온 값이 비어 있는 형태라면 defaultValue 속성으로 기본값 지정 가능
👉🏻 value 값을 일치하지 않게 적으면 무조건 defaultValue 기준으로 넘어가므로 주의할 것!
3️⃣ @RequestParam 어노테이션을 생략하는 방법 (2️⃣의 연장선)
👉🏻 단, 매개변수명을 jsp의 name 속성값과 동일하게 세팅해 둬야 자동으로 값이 주입됨
👉🏻 또한, 위에서 썼던 defaultValue 같은 추가적인 속성을 사용할 수 없음
👉🏻 name 속성값이 매개변수명과 일치하지 않는다면 null 값 뜸!
⌨️ 잘 실행되는지 확인 ver.
@RequestMapping("login.me") // 어노테이션 내의 키-밸류 세트가 1개라면 "value=" 생략 가능
public void loginMember(String userId, String userPwd) {
System.out.println("userId: " + userId);
System.out.println("userPwd: " + userPwd);
// 잘 출력됨을 확인했다면 객체로 가공해서 넘기면 됨
Member m = new Member();
m.setUserId(userId);
m.setUserPwd(userPwd);
// Service 단에 m을 전달하면서 조회
// 결과에 따른 응답화면을 지정
}
4️⃣ 커맨드 객체 방식
👉🏻 해당 메소드의 매개변수로 요청 시 전달값을 담고자 하는 VO 클래스 타입을 세팅 후 요청 시 전달값의 키값(name 속성값)과 VO 클래스의 정의되어 있는 필드명을 일치시켜 주면 Spring이 내부적으로 해당 전달값을 뽑아 VO 객체로 가공해 넘겨 주는 방식
👉🏻 반드시 jsp의 name 속성값과 담고자 하는 필드명이 동일해야 함
@RequestMapping("login.me")
public void loginMember(Member m) {
System.out.println("userId: " + m.getUserId());
System.out.println("userPwd: " + m.getUserPwd());
}
✔️ 이 방식의 원리
1) Spring에 의해 내부적으로 요청 시 전달값이 뽑힘
2) Spring에 의해 내부적으로 "기본생성자"를 통해 VO 객체가 생성됨
3) Spring에 의해 요청 시 name 속성값과 일치하는 해당 VO의 필드를 찾아 setter 메소드로 가공
요청 처리 후 응답 데이터를 담고 응답 페이지로 포워딩 또는 url 재요청 하는 방법
💻 기존의 Controller 코드
@RequestMapping("login.me")
public void loginMember(Member m) {
Member loginUser = memberService.loginMember(m);
// 요청 결과에 따른 응답 화면 처리
if(loginUser == null) { // 로그인 실패
// 에러 문구를 응답 페이지에 실어서 포워딩
} else { // 로그인 성공
// loginUser를 sessionScope에 담고 메인 페이지로 url 재요청
}
}
1️⃣ 스프링에서 제공하는 Model 객체를 사용하는 방법
👉🏻 Model 객체는 기존의 requestScope와 같은 역할 (요청에 대한 응답 페이지만 사용할 수 있는 scope)
👉🏻 포워딩할 응답 뷰로 전달하고자 하는 데이터를 key-value로 담을 수 있음
👉🏻 Model에 데이터를 담은 후 응답 페이지를 포워딩 하려면 해당 응답페이지 파일명을 "문자열로 리턴" 해 주면 됨
[표현법]
기존의 requestScope에 담기: request.setAttribute("키", 밸류);
Spring의 Model 객체에 값 담기: model.addAttribute("키", 밸류);
💻 1️⃣ 방법을 적용한 Controller 코드
👉🏻 문자열로 리턴하기 때문에 반환형을 void에서 String으로 변경
👉🏻 Spring의 기본 설정(servlet-context.xml에서 지정한 접두어, 접미어 제외) 고려한 return 구문 설정
👉🏻 매개변수 Model, HttpSession 기재 (스프링이 알아서 가지고 와 줌)
👉🏻 model.addAttribute("키", 밸류) 메소드 사용
⌨️ 주석 X ver.
@RequestMapping("login.me")
public void loginMember(Member m, Model model, HttpSession session) {
Member loginUser = memberService.loginMember(m);
if(loginUser == null) { // 로그인 실패
model.addAttribute("errorMsg", "로그인 실패");
return "common/errorPage";
} else { // 로그인 성공
session.setAttribute("loginUser", loginUser);
return "redirect:/";
}
}
⌨️ 주석 O ver.
@RequestMapping("login.me")
public String loginMember(Member m, Model model, HttpSession session) {
Member loginUser = memberService.loginMember(m);
// 요청 결과에 따른 응답 화면 처리
if(loginUser == null) { // 로그인 실패
// 에러 문구를 응답 페이지에 실어서 포워딩
model.addAttribute("errorMsg", "로그인 실패");
// * 포워딩 방식: url 주소는 그대로고 화면만 바꿔치기 해 주는 개념
// => 문자열을 리턴 할 때 파일 경로를 포함한 파일명을 제시
// 내가 리턴하고 싶은 경로: /WEB-INF/views/common/errorPage.jsp
// 접두어와 접미어 제외: common/errorPage
return "common/errorPage";
} else { // 로그인 성공
// loginUser를 sessionScope에 담고 메인 페이지로 url 재요청
session.setAttribute("loginUser", loginUser);
/*
* * url 재요청 방식: 주소창에 url을 요청하는 방식
* => 문자열을 리턴할 때 redirect: 을 붙여서 주소값을 제시
* 예) redirect:요청할url주소
*
* 내부적으로 리턴값을 받아 주는 DispatcherServlet이
* 해당 요청할 url 주소를 받아 response.sendRedirect(리턴값) 메소드를 호출하는 원리
*/
return "redirect:/";
// redirect:뒤에 붙는 슬래시(/)가 의미하는 바: contextPath 뒤에 붙는 /를 의미함(== 메인페이지)
}
}
2️⃣ 스프링에서 제공하는 ModelAndView 객체를 사용하는 방법
👉🏻 Model은 데이터를 키-밸류 세트로 담을 수 있는 requestScope와 같은 공간이라고 한다면 View는 응답뷰에 대한 정보를 담을 수 있는 공간임
👉🏻 ModelAndView 객체는 Model 객체와 View 객체를 결합한 형태
(단, Model 객체는 단독 존재가 가능하나 View 객체는 그럴 수 없음)
✔️ 즉, 1번 방식은 Model에 데이터를 담고 문자열로 리턴했다면 ModelAndView 객체에서는 데이터를 담고 응답페이지까지 한 큐에!
[표현법]
👉🏻 ModelAndView 객체에 데이터를 담고자 한다면: mv.addObject("키", 밸류값);
👉🏻 ModelAndView 객체에 응답뷰에 대한 데이터를 담고자 한다면: mv.setViewName("응답뷰경로또는url주소");
💻 2️⃣ 방법을 적용한 Controller 코드
👉🏻 ModelAndView 객체 타입을 리턴하기 때문에 반환형을 void에서 ModelAndView으로 변경
👉🏻 Spring의 기본 설정(servlet-context.xml에서 지정한 접두어, 접미어 제외) 고려한 return 구문 설정
👉🏻 매개변수 ModelAndView, HttpSession 기재 (스프링이 알아서 가지고 와 줌)
👉🏻 mv.addObject("키", 밸류), mv.setViewName("경로및url") 메소드 사용
@RequestMapping("login.me")
public ModelAndView loginMember(Member m, ModelAndView mv, HttpSession session) {
Member loginUser = memberService.loginMember(m);
if(loginUser == null) { // 로그인 실패
// model.addAttribute("errorMsg", "로그인 실패");
mv.addObject("errorPage", "로그인 실패");
// return "common/errorPage";
mv.setViewName("common/errorPage"); // 포워딩
// ModelAndView 객체를 이용해서 응답페이지를 지정할 경우 또한 ViewResolver에 의해 접두어와 접미어를 생략한 형태로 지정해야만 함
} else { // 로그인 성공
session.setAttribute("loginUser", loginUser);
// return "redirect:/";
mv.setViewName("redirect:/"); // url 재요청방식
}
// 어느 경우에나 mv를 리턴하기 때문에 따로 2번 적을 필요 없이 조건문 밖에 기술해도 됨!
return mv;
}