-
[Spring]MVC-with annotation🏨Java 2021. 10. 9. 01:21728x90
🏨Spring MVC
1. ➰주요 annotation
- ✅@Controller
- spring 기반의 사용자 정의 http처리 클래스
- class 선언구
- ✅@Request Mapping
- client가 url상에 요청하는 이름, 방식과 매핑하는 설정
- 개별 메소드별 선언구
- ✅@ModelAttribute
- 메소드의 parameter로 사용
- DTO가 parameter로 선언시 해당 DTo를 request 객체에 자동 저장
- forward로 이동된 jsp에선 request.getAttribute()처럼
${requestScope.dtokey.변수명} - ${requestScope.Customer.age} - ${Customer.age}
- ✅@ExceptionHandler
- 메소드 선언구
- 해당 메소드는 예외 처리 전담
- 구조 parameter로 처리하고자 하는 예외타입 기술
- ✅@PathVariable
- URI Template 기술에 사용
- 주소값의 일부를 데이터화 하는 기술
- ✅@SesiionAttributes({"key1", "key2", ..."})
- 컨트롤러 클래스 선언구에 선언
- spring 자체의 세션에서 사용하고자 하는 key들 등록
- 선언되어 있는 key는spring api 관련된 세션객체에선 사용 불가
- ✅@ModelAttribute("SessionAttributes에 등록된key로 해당 데이터를 활용할 수 있음")
- 애노테이션 선언된 변수에 해당key의 value값 자동 대입
2. ➰주요 API
- ✅RedirectAttributes
- 메소드의 parameter로 선언
- redirect 방식으로 이동되는jsp에게 데이터 전송하고자 할 경우 사용
- query string 구성해서 jsp로 전송하는 원리
- ✅ModelAndView
- 서비스 메소드의 반환타입
- 데이터인 모델과 view 설정해서 forward방식으로 이동
- 이동된 jsp에선 requestScope.key로 데이터 뽑아서 사용
- 반환타입 자체가 ModelAndView
- ✅Model
- 서비스 메소드의 parameter로 사용
- request 객체 의미
- model.addAttribute("key", "값입니다."); //request.setAttribute("key", "값입니다.")
- jsp에선 ${param.*}로 사용
- ✅SessionStatus
- @SessionAttributes({"key1", "key2", ---})에 등록도니 세션 데이터값들을 소멸하는 API
- setComplete()로 소멸
3. ➰페이지 이동방식 이해
✅반환 타입이 String
- ✔redirect 이동방식
- 반환 타입이 String
- return "redirect: *.jsp"
- 특징: 일반 servlet@jsp 개발시의 위치와 동일, WEB-INF 내부에 구현시 실행 불가
- ✔forward 이동방식
- return "file명만";
prefix & suffix를
spring의 InternalResourceViewResolver에서 적용(아래 사진참고) - return "forward:/file명.jsp";
spring의 InternalResourceViewResolver를 거치지 않고
코드 자체적으로jsp 실행하는 방식
- return "file명만";
- ✔redirect 이동방식
explorer부분
dispatcher부분
💢보안을 위해 WEB-INF/Views에 들어가 있는 jsp를 사용하기 위해서는 아래 그림과 같이 dispatcher-servlet에 viewResolver를 통해 prefix 와 suffix를 설정해 주어야 한다. 이외에도 mvc사용할때 필요한 것과 controller를 빈으로 지정하는 설정도 넣어 주어야 한다.
💢추가적으로 web.xml에 **dispatcher** 관련 설정 webXml.png
4.➰코드를 활용한 이해
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import model.domain.Customer; @Controller public class Step01Controller { @RequestMapping("method1") public String m1() { System.out.println("m1()------" ); return "redirect:step01redirectView.jsp"; } //method2 -> step01method2.jsp 이동시에는 forward 방식으로 이동 @RequestMapping("method2") public ModelAndView m2() { System.out.println("m2()-----------"); ModelAndView mv = new ModelAndView (); mv.setViewName("step01method2"); mv.addObject("cellphone", "핸드폰"); mv.addObject("hungry", "배고파"); mv.addObject("miracle", "지명이 돈 돌려줘 "); return mv; } // 예외 발생해서 예외 처리 개발 방식 학습을 위한 메소드 @RequestMapping("method3") public String m3() throws Exception{ System.out.println("me() -----"); if(true) { throw new Exception("에외발생"); } return null; } @ExceptionHandler public String handler(Exception e) { System.out.println("에외 처리 완료" + e.getMessage()); return "redirect:failView.jsp"; } // redirect임에도 이동되는 jsp에게 데이터를 전송하는 기술 학습 @RequestMapping("method4") public String m4(RedirectAttributes attr) { System.out.println("m4()------" ); // query string 구성 attr.addAttribute("key", "value"); // step04redirectView.jsp?"key"="value" // jsp에선 query string으로 전송된 데이터는 ${param.key}- request.getParameter("key")와 동일 return "redirect:step01-04redirectView.jsp"; } //반환타입이 ModelAndView로 설정, 이동 jsp에서 request로 받아 사용 가능 @RequestMapping("method5") public ModelAndView m5() { System.out.println("m5()--------"); ModelAndView mv = new ModelAndView (); mv.setViewName("step01method5"); mv.addObject("newData", "서버에서 새로 저장한 데이터값"); //ModelAndView는 addObject, Model은 addattribute return mv; } /*client가 전송시킨 데이터로 Customer 객체 생성해야 하는 상황이라면 어떻게 개발할 것인가? * 1. forward? - prefix/suffix 고려, redirect -prefix/suffix 미고려 * 2. jsp에서 Customer 객체 사용가능? * * 정리 * 1. client가 전송한 데이터인query string의 dto클래스의 모든 멤버변수명이 일치될 경우 * 메소드의 parameter선언만으로 dto객체가 생성(html에서 전송한 id와 age 가 메소드의 parameter 로 Customer의 선언된 변수와 정확히 일치하므로 dto객체 생성) * 2. String 반환시 return 문장에 redirect표현이 없을 경우엔 기본으로 forward * 3. 이동된 jsp에선 요청객체/응답객체가 공유 따라서 getParameter() 가능 */ // <a href="method6?id=tester&age=100"> @RequestMapping( "method6") public String m6( Customer cust) { System.out.println("m6() " + cust.getId()); return "step01method6"; //forward : WEB-INF/view/step01method06.jsp } // <a href="method7?id=tester&age=100"> /*Model API * - spring api로서 jsp에서 데이터를 활용 가능하게 해주는 API * - 새로운 데이터를 setAttribute()로 저장하는 원리 * *ModelAndView API와의 차이점 * -메소드 자체의 반환 타입이 ModelAndView * -view 이름을 지정 (forward방식으로 이동) 및 데이터를 요청 객체이 저장하는 원리 * *쿼리 스틀링은 request로 받지 못하고 ${param.*}로 받음 * */ @RequestMapping("method7") public String m7(Model model) {//request와 동급 System.out.println("m7() " + model); model.addAttribute("key", "값입니다"); //request.setAttribute("key","값입니다."); return "step01method7"; //forward : WEB-INF/view/step01method07.jsp } // Customer 객체 자동 생성후에 jsp에서도 사용 가능하게 설정 // method6은 생성만 했고, jsp에선 생성된 객체 사용 불가 단지 forward였기 때문에 request.getParameter()형식으로 데이터 활용 @RequestMapping("method8") public String m7(@ModelAttribute ("cust") Customer cust) { //request.setAttribute("cust", new Customer()) System.out.println("m8 () ----" + cust.getId()); return "step01method8"; //WEB_INF/views/step01method8.jsp } }
'Java' 카테고리의 다른 글
[Spring]🍪Cookie &🍕 Session (0) 2021.10.09 [Spring] ➰URI Template (0) 2021.10.09 [Spring]💨 AOP(Aspect Oriented Programming)와 애노테이션(Annotation) (0) 2021.10.07 👫[Spring] DI(Dependency Injection)의존성 주입 및 Annotation 사용 (0) 2021.10.07 - ✅@Controller