Spring의 파라미터 처리방식과 포워딩 방식을 공부하며 요약 정리
@Controller
public class TestController {}
"main" 이라는 서블릿 주소 요청 시 자동으로 호출되는 requestMain() 메서드 정의
- @RequestMapping 어노테이션을 사용하여 GET 방식의 "main" 서블릿 주소 요청 받아 처리
@RequestMapping(value = "main", method = RequestMethod.GET)
public String requestMain() {
return "main"; // "/WEB-INF/views/main.jsp" 페이지로 이동하도록 요청
}
"push" 서블릿 주소 요청 시 자동으로 호출되는 push() 메서드 정의
=> 파라미터 : 없음 리턴타입 : String
=> push.jsp 페이지로 이동(Dispatch)
@RequestMapping(value = "push", method = RequestMethod.GET)
public String push(HttpServletRequest request) {
//HttpServletRequest 객체의 setAttribute() 메서드를 사용하여 객체(데이터) 저장 가능
// => 단, 내장 객체가 존재하지 않으므로 외부로부터 객체를 전달(주입) 받아야 함
// => 서블릿 주소를 처리하는 메서드 파라미터에 HttpServletRequest 타입 변수를 선언하면
// 톰캣에 의해 해당 객체가 자동으로 전달(주입) 됨
request.setAttribute("msg", "Hello, World!");
// => Dispatch 방식으로 이동 시 request 객체가 그대로 유지됨(= 저장 데이터가 유지됨)
return "push";
}
- org.springframework.ui.Model 타입을 파라미터로 지정 시데이터 저장이 가능한 Model 객체를 자동으로 전달받을 수 있음
- HttpServletRequest 객체와 성격이 유사하며, java.util.Map 객체 기반으로 만든스프링에서 제공하는 데이터 공유 객체
@RequestMapping(value = "push", method = RequestMethod.GET)
public String push(Model model) {
// request.setAttribute() 메서드와 마찬가지로 Model 객체의 addAttribute() 로 데이터 저장
// => request 객체와 범위(scope) 동일
// => request 객체와 동시 사용 불가(일반적인 데이터 저장 시 request 객체보다 더 많이 사용)
model.addAttribute("msg", "Hello, World! - Model 객체");
return "push";
}
spring 파라미터 처리방법 기본 3가지
// [ 파라미터 처리 방법1 ] 파라미터명과 동일한 매개변수를 선언하여 자동으로 전달받는 방법
// login.me 서블릿 주소 요청(로그인 비즈니스 로직)에 대해 로그인 작업을 처리할
// loginPost() 메서드 정의 => POST 방식 요청에 대한 처리
// => 서블릿 주소가 동일하더라도 요청 방식(GET ot POST)이 다르면 충돌이 발생하지 않음
// 로그인 폼에서 입력받은 아이디와 패스워드를 전달받아 출력 후 메인페이지로 이동
// @RequestMapping(value = "login.me", method = RequestMethod.POST)
// public String login(@RequestParam String id, @RequestParam String passwd) {
// System.out.println("아이디 : " + id);
// System.out.println("패스워드 : " + passwd);
//
// // Redirect 방식으로 메인페이지로 포워딩
// return "redirect:/main";
// }
// [ 파라미터 처리 방법2 ] Map 객체를 통해 파라미터명을 key, 파라미터값을 value 로 전달받는 방법
// @RequestMapping(value = "login.me", method = RequestMethod.POST)
// public String login(@RequestParam Map<String, String> params) {
// // 아이디와 패스워드가 "id", "passwd" 라는 키로 Map 객체에 자동 저장됨
// System.out.println("아이디(Map) : " + params.get("id"));
// System.out.println("패스워드(Map) : " + params.get("passwd"));
//
// // Redirect 방식으로 메인페이지로 포워딩
// return "redirect:/main";
// }
// [ 파라미터 처리 방법3 ] VO 객체 생성을 통해 일치하는 멤버변수에 전달받는 방법
// => @ModelAttirbute 어노테이션을 사용하여 VO 객체타입 변수를 지정(어노테이션 생략 가능)
@RequestMapping(value = "login.me", method = RequestMethod.POST)
public String login(@ModelAttribute MemberVO member, HttpSession session) {
// 아이디와 패스워드가 MemberVO 객체 내의 id, passwd 변수에 자동 저장됨
System.out.println("아이디(MemberVO) : " + member.getId());
System.out.println("패스워드(MemberVO) : " + member.getPasswd());
// 만약, 아이디가 "admin" 이고, 패스워드가 "1234" 이면 로그인 성공이므로
// session 객체에 로그인 성공한 아이디 저장
if(member.getId().equals("admin") && member.getPasswd().equals("1234")) {
session.setAttribute("sId", member.getId());
}
// Redirect 방식으로 메인페이지로 포워딩
return "redirect:/main";
}
리다이렉트 방식 포워딩 처리를 수행하기 위해서는 return "redirect:/포워딩주소" 형식으로 지정
@RequestMapping(value = "redirect", method = RequestMethod.GET)
public String redirect() {
// 리다이렉트 방식 포워딩 시 데이터 전달 방법 => URL 뒤에 파라미터형식으로 데이터 전달
String name = "홍길동";
int age = 20;
// 주의! URL 을 통해 파라미터 직접 전달 시 한글, 한자 등 유니코드 문자 포함할 경우 깨짐
// <http://localhost:8081/test/dispatcher?name=hong&age=20> => 영문, 숫자 등은 정상 표기
// <http://localhost:8081/test/dispatcher?name=>???&age=20 => 한글, 한자 등은 깨짐
// => 따라서, java.net.URLEncoder 클래스의 encode() 메서드를 호출하여 데이터 인코딩 필요
try {
name = URLEncoder.encode(name, "UTF-8");
} catch (UnsupportedEncodingException e) {
System.out.println("잘못된 인코딩 방식 지정!");
e.printStackTrace();
}
// dispatcher 서블릿 주소 요청 시 이름과 나이를 파라미터로 전달하여 redirect 방식 포워딩
return "redirect:/dispatcher?name=" + name + "&age=" + age;
// <http://localhost:8081/test/dispatcher?name=%ED%99%8D%EA%B8%B8%EB%8F%99&age=20>
// => 인코딩 시 각 문자가 Unicode(3Byte) 형식으로 인코딩 됨
// (주소표시줄의 텍스트 복사하면 인코딩 된 데이터가 %XX%XX%XX 형식으로 표시됨)
}
// 만약, 인코딩 된 데이터를 다시 원래 형식으로 되돌려야 할 경우
// 인코딩(Encoding)의 반대 작업인 디코딩(Decoding) 작업 필요
// 단, 현재 저장된 파라미터를 Model 객체 등에 저장 시 디코딩 불필요
// try {
// String decodedName = URLDecoder.decode(name, "UTF-8");
// System.out.println(name + ", " + decodedName);
// } catch (UnsupportedEncodingException e) {
// System.out.println("잘못된 디코딩 방식 지정!");
// e.printStackTrace();
// }
서블릿 요청 처리 메서드 정의 시 @RequestParam 어노테이션을 사용하여 파라미터 데이터라는 표시를 명확하게 명시 가능 => 또한, @RequestParam 어노테이션에 defaultValue 속성을 추가하여 기본값 설정 가능 ex) @RequestParam(defaultValue = "기본값") 변수선언문
@RequestMapping(value = "dispatcher", method = RequestMethod.GET)
public String dispatcher(
Model model, @RequestParam String name,
@RequestParam(defaultValue = "0") int age) {
// => 만약, age 라는 파라미터가 존재하지 않더라도 해당 변수 기본값을 0 으로 설정
model.addAttribute("name", name);
model.addAttribute("age", age);
return "redirect";
}
ModelAndView : 데이터를 저장하는 Model 객체 관리와 iew 페이지의 포워딩 처리를 함께 수행하는 객체
=> ModelAndView 객체를 사용하는 메서드 정의 시 리턴타입을 ModelAndView 타입으로 지정
public class TestVO {
private String subject;
private String content;
public TestVO(String subject, String content) {
super();
this.subject = subject;
this.content = content;
}
}
//-------------------------------------------------------------------------------
@RequestMapping(value = "mav", method = RequestMethod.GET)
public ModelAndView modelAndView() {
// ModelAndView 객체를 통해 전달할 데이터를 저장하기 위해 HashMap 객체 생성
Map<String, TestVO> map = new HashMap<String, TestVO>();
map.put("key", new TestVO("제목", "내용"));
// 기존의 객체를 저장 후 뷰페이지로 포워딩하는 방법
// model.addAttribute("map", map);
// return "model_and_view";
// ModelAndView 객체를 사용하여 객체 저장 후 뷰페이지로 포워딩하는 방법
// => 객체 생성 : new ModelAndView("이동할 페이지", "데이터(객체)의 키", 데이터(객체));
// => 포워딩 방식은 기존과 동일한 Dispatch 방식으로 포워딩
return new ModelAndView("model_and_view", "map", map);
}
//------------------------------------------------------------------------------
<h1>model_and_view.jsp</h1>
<%-- Map 객체("map") 내의 TestVO 객체("key") 에 접근하여 데이터 가져오기 --%>
<h3>제목 : ${map.key.subject }</h3>
<h3>내용 : ${map.key.content }</h3>
Service 객체를 직접 생성하지 않고, 자동 주입 기능을 위한 어노테이션 사용 @Inject(자바-플랫폼 공용) 또는 @Autowired(스프링 전용) 어노테이션 사용 가능 어노테이션 지정 후 자동 주입으로 객체를 생성하면 저장될 클래스 타입 변수 선언 단, 해당 클래스는 반드시 어노테이션을 통해 역할이 지정되어야 한다!
public class MemberController {
@Autowired
private MemberService service;
//MemberService service = new MemberService();
//@AutoWired 어노테이션을 통해 MemberService 객체를 별도로 생성하지 않아도
//자동 주입(= 의존 주입 = DI)되므로 객체를 직접 생성하지 않고 사용 가능
}
반응형