메서드(HttpServletRequest request){ request.getParameter(”파라미터명”) }
HttpServletRequest 객체를 메서드의 매개변수로 받아서 request.getParameter()를 통해 요청 파라미터 값을 받아옴
많이 사용하지는 않지만 그래도 알아야함
@PostMapping("/join")
public void register(HttpServletRequest request) {
System.out.println("/request/join : POST");
// join.jsp의 form태그에서 값을 해당 메서드로 리턴을 하도록 했음
System.out.println("id : " + request.getParameter("userId"));
System.out.println("pw : " + request.getParameter("userPw"));
System.out.println("hobby : " + Arrays.toString(request.getParameterValues("hobby")));
// 체크박스는 여러개이므로 배열로 받아와서 진행
// 값이 잘 들어오는 것을 확인
}
메서드(@RequestParam(”파라미터 변수명”) String 변수명)
@RequestParam(value = “파라미터 값”, required = false, defaultValue=”기본값”)
@PostMapping("/join")
public void register(@RequestParam("userId") String id,
@RequestParam("userPw") String pw,
@RequestParam(value="hobby", required = false, defaultValue = "no hobby person") List<String> hobbies) {
System.out.println("id : " + id + " pw : " + pw + " hobby : " + hobbies);
// @RequestParam을 통해서 값을 받아올 수 있음
// @RequestParam("파라미터 변수명") 해당 메서드에서 사용하고 싶은 타입과 변수명 이렇게 작성하면 됨
// 배열 타입의 값이 없을 때 에러가 날 수 있으므로 @RequestParam의 매개값으로 required와 defaultValue를 지정하여 값이 들어오지 않았을 때
// 대체할 수 있는 값으로 지정할 수 있음
}
만약 요청을 받은 파라미터의 이름과 VO 클래스의 변수명이 일치할 때 사용 가능
폼 태그의 값을 받아 처리할 수 있는 VO클래스를 먼저 생성하고 파라미터의 이름과 VO클래스의 변수명을 일치하게 생성하면 커맨드 객체를 통해 값을 쉽게 받아올 수 있음
사전에 파라미터명과 변수명을 동일하게 작성한다면 쉽게 요청 파라미터 값을 가져옴 (많이 쓸 듯...?)
UserVO
package com.spring.basic.model;
import java.util.List;
public class UserVO {
private String userId;
private String userPw;
private String userName;
private List<String> hobby;
// 커맨드 객체를 활용하기 위해서는 파라미터 변수명과 똑같이 작성해야함
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserPw() {
return userPw;
}
public void setUserPw(String userPw) {
this.userPw = userPw;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
}
UserVO객체를 매개변수로 작성하면 파라미터의 값을 모두 가지고 와서 파라미터의 이름과 UserVO객체의 변수명과 같으면 값을 모두 넣어서 리턴
커맨드 객체를 활용하여 요청 값을 가져오는 방법이 가장 편리하고 효율적인 것 같음
@PostMapping("/join")
public void register(UserVO user) {
System.out.println("id : " + user.getUserId() + " pw : " + user.getUserPw() + " hobby : " + user.getHobby());
// 한글은 깨짐 왜냐면 post방식으로 보내기 때문이며 setcharacter~~하는 것보다는 spring에서 제공하는 filter패키지를 web.xml에 넣어줌
}
메서드(Model model) {model.addAttribute() }
View에 데이터만 전달하기 위한 객체
메서드에 매개변수로 Model객체를 넣어주고 메서드가 끝나기 전에 매개변수로 지정한 Model 객체에 데이터를 넣어주면 자동으로 지정한 경로로 데이터가 이동
Model 객체에 데이터를 넣기 위해서는 객체이름.addAttribute(”파라미터명”, 값) 으로 넣을 수 있음
View에서 el태그를 활용하여 쉽게 값을 가져올 수 있음
@GetMapping("/test")
public void test(@RequestParam("age") int age, Model model) {
// /response/test를 부를 때 model과 age값을 가져옴
// 모델에 값을 담아줌
model.addAttribute("age", age);
model.addAttribute("nick", "개");
// 모델은 메소드가 끝나기 전에 값을 담아놓으면 자동으로 view페이지에 보냄
// 현재 void이므로 경로를 알 수 있음
// view에서 el을 활용하여 값을 가져올 수 있음
}
메서드(@ModelAttribute(”파라미터명”) 사용 변수){ }
@RequestParam + model.addAttribute() 처럼 동작
매개변수로 ModelAttribute(”파라미터명”) 을 넣으면 자동으로 Model 객체에 값이 들어가게 되므로 addAttribute를 작성할 필요가 없고 매개변수로 Model객체를 넣지 않아도 됨
@GetMapping("/test2")
public void test2(@ModelAttribute("info") UserVO user) {
// Model 객체에 addAttribute를 작성하지 않고 그냥 값을 넣어줌
System.out.println("매서드 내의 콘솔 출력 : " + user.toString());
// /response/test2.jsp 에 값을 보냄
}
ModelAndView
데이터와 뷰의 이름을 함께 전달하기 위한 객체
ModelAndView 객체를 생성하고 객체.addObject(”변수명”, “값”) 으로 값을 넣어주고 객체.setViewName(”경로”) 를 통해 보낼 경로 지정
Model 객체를 사용하면서 사용자가 보는 View도 제어하는 객체
// 3. ModelAndView 객체를 활용한 처리
@GetMapping("/test3")
public ModelAndView test3() {
ModelAndView mv = new ModelAndView();
mv.addObject("userName", "김철수");
mv.addObject("userAge" , 30);
// 값을 넣어줌
mv.setViewName("/response/test3");
// 보낼 경로 지정
return mv;
}
참고 form action
RedirectAttributes
redirect 이동 시 파라미터 값을 전달하는 방법
jsp의 sendredirect 기능 (요청을 받아서 응답을 하고 다시 요청을 보냄)을 사용하고 싶을 때 사용하는 객체이며 메서드의 매개변수로 들어감
RedirectAttributes 객체를 사용해서 redirect할 때 값을 추가해서 보낼 수 있음
데이터를 일회성으로 전달할 때 사용하며 return에 redirect: 키워드와 함께 사용
참고 Model 객체를 사용하게 되면 Model 내부 데이터가 redirect가 되었을 때 url에 파라미터 값으로 붙어서 들어옴
@PostMapping("/login")
// response/res-redirect-form 여기서 받은 값
public String login(@RequestParam("userId") String id,
@RequestParam("userPw") String pw,
@RequestParam("userPwChk") String pwChk,
RedirectAttributes ra) {
// form태그에서 사용자가 입력한 값을 @RequestParam("파라미터명")으로 받아옴
System.out.println("/login: POST 요청 발생 ");
System.out.println("값 확인 : " + id + " " + pw + " " + pwChk);
if(id.equals("")) {
// model.addAttribute("msg", "아이디는 필수값이예요");
// res-redirect-form으로 다시 보내줌
ra.addFlashAttribute("msg", "아이디는 필수 값이예요");
// redirect 상황에서 일회성으로 데이터를 전송할 때 사용하는 메서드
// url뒤에 데이터가 붙지 않고 한번 이용 후 알아서 소멸
return "redirect:/response/login";
// redirect: 라는 키워드로 특정 url에 다시 요청을 보냄
// redirect 상황에서 model 객체를 사용하게 되면 model 내부의 데이터가 재 요청이
// 들어올 때 파라미터 값으로 붙어서 들어옴 데이터가 url 주소 뒤에 ?와 함께 노출되어 전달
}else if(!pw.equals(pwChk)){
ra.addFlashAttribute("msg", "비밀번호 확인란을 체크하세요");
return "redirect:/response/login";
}else {
return null;
}
}
Controller에 공통적으로 사용되는 uri가 존재한다면 @Controller Annotation 밑에 @RequestMapping(”매핑 uri”)을 활용하여 공통 uri 처리 가능
공통 uri 지정하면 @RequsetMapping annotation에 많은 값을 작성하지 않아도 됨
@Controller
@RequestMapping("/request")
// 컨트롤러 자체에 공통 URI 맵핑하여 /request를 작성하지 않아도 됨
public class RequestController {
public RequestController() {
System.out.println("RequestController 생성");
// 자동 bean등록이 되어 있기 때문에 서버가 활성화되면 자동으로 생성되어 컨트롤러에 저장됨
}
// @RequestMapping("/request/test")
@RequestMapping("/test")
// /request/test라는 요청이 들어오면 밑의 메소드를 실행하라 라는 뜻
// 리턴값인 "test"는 디스패처로 가고
// 디스패처는 viewresolver에 보내주고 경로를 완성해주고
// view에 해당 파일이 있는지 확인 후 요청에 응답함
public String testCall() {
System.out.println("/request/test 요청이 들어옴");
return "test";
}