ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring]MVC-with annotation🏨
    Java 2021. 10. 9. 01:21
    728x90

    🏨Spring MVC

    1. ➰주요 annotation


    1. ✅@Controller
      • spring 기반의 사용자 정의 http처리 클래스
      • class 선언구
    2. ✅@Request Mapping
      • client가 url상에 요청하는 이름, 방식과 매핑하는 설정
      • 개별 메소드별 선언구
    3. ✅@ModelAttribute
      • 메소드의 parameter로 사용
      • DTO가 parameter로 선언시 해당 DTo를 request 객체에 자동 저장
      • forward로 이동된 jsp에선 request.getAttribute()처럼
        ${requestScope.dtokey.변수명} - ${requestScope.Customer.age} - ${Customer.age}
    4. ✅@ExceptionHandler
      • 메소드 선언구
      • 해당 메소드는 예외 처리 전담
      • 구조 parameter로 처리하고자 하는 예외타입 기술
    5. ✅@PathVariable
      • URI Template 기술에 사용
      • 주소값의 일부를 데이터화 하는 기술
    6. ✅@SesiionAttributes({"key1", "key2", ..."})
      • 컨트롤러 클래스 선언구에 선언
      • spring 자체의 세션에서 사용하고자 하는 key들 등록
      • 선언되어 있는 key는spring api 관련된 세션객체에선 사용 불가
    7. ✅@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 실행하는 방식

    explorer부분

    dispatcher부분

    💢보안을 위해 WEB-INF/Views에 들어가 있는 jsp를 사용하기 위해서는 아래 그림과 같이 dispatcher-servletviewResolver를 통해 prefixsuffix를 설정해 주어야 한다. 이외에도 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
        }
    
    }

    댓글

Designed by Tistory.