7. Spring MVC 고급 기술

지식 점
  • 처리 파일 업로드
  • 플래시 속성 사용
  • 컨트롤 러 에서 이상 처리
  • 키워드
  • 컨트롤 러 알림 (컨트롤 러 조언)
  • 7.1 처리 이상
    Spring 은 이상 을 응답 으로 변환 하 는 다양한 방식 을 제공 합 니 다.
  • 특정한 Spring 이상 은 지정 한 HTTP 상태 코드
  • 로 자동 매 핑 됩 니 다.
  • 이상 에 @ RequestStatus 주 해 를 추가 하여 특정한 HTTP 상태 코드
  • 로 표시 할 수 있 습 니 다.
  • 방법 에 @ ExceptionHandler 주 해 를 추가 하여 이상 을 처리 할 수 있 습 니 다
  • 가장 쉬 운 방법 은 두 번 째, 매 핑 이다.
    7.1.1 이상 을 HTTP 상태 코드 로 표시
    기본적으로 Spring 은 자신의 이상 을 자동 으로 적당 한 상태 코드 로 바 꿉 니 다.
    봄 이상
    HTTP 상태 코드
    BindException
    400-Bad Request
    ConversionNotSupportedException
    500-Internal Server Error
    HttpMessageNotReadableException
    400-Bad Request
    HttpMessageNotWriteableException
    500-Internal Server Error
    HttpRequestMethodNotSupportedException
    405-Method Not Allowed
    MethodArgumentNotValidException
    400-Bad Request
    MissingServletRequestParameterException
    400-Bad Request
    MissingServletRequestPartException
    400-Bad Request
    NoSuchRequestHandlingMethodException
    404-Not Found
    TypeMismatchException
    400-Bad Request
    @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found")
    public class .....
    
    

    7.2 컨트롤 러 에 알림 추가
    컨트롤 러 알림 은 @ Controller Advice 주석 이 있 는 클래스 입 니 다. 이 종 류 는 다음 과 같은 방법 을 포함 합 니 다.
  • @ ExceptionHandler 주석 에 표 시 된 fangfa
  • @ InitBinder 주석 표시 방법
  • @ ModelAttribute 주석 표시 방법 이상 은 전체 응용 프로그램의 모든 컨트롤 러 에 @ RequestMapping 주석 이 있 는 방법 에 자동 으로 사 용 됩 니 다.
  • //            
    package test
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    //       
    @ControllerAdvice
    public class AppWideExceptionHandler {
    	//          
    	@ExceptionHandler(DuplicateSpittleException.class)
    	public String duplicateSpittleHandler() {
    		return "error/duplicate";
    	}
    }
    

    만약 어느 곳 에서 든 Duplicate Spittle Exception 을 던진다 면, Duplicate Spittle Handler 방법 으로 이상 을 처리 할 것 입 니 다.
    7.5 크로스 리 셋 요청 전달 데이터
    5.4 에 서 는 방향 을 바 꾸 는 기초 기능 을 말 했 고, Spring 은 또 다른 보조 기능 을 제공 했다.
    Q: 방향 을 바 꾸 는 기능 을 시작 하 는 방법 은 어떻게 데 이 터 를 방향 을 바 꾸 는 목표 방법 에 보 내야 합 니까?
    프로세서 방법 이 완료 되면 이 방법 이 지정 한 모델 데 이 터 는 요청 에 복사 되 고 요청 한 속성 으로 보기 로 전송 하여 렌 더 링 합 니 다.컨트롤 러 방법 과 보기 가 같은 요청 을 처리 하기 때문에 퍼 가기 에서 요청 속성 을 저장 할 수 있 습 니 다.
    이상 은 요청 한 처리 내용 이지 만 방향 이 다 릅 니 다.컨트롤 러 가 되 돌아 오 는 결과 가 방향 을 바 꾸 면 원본 요청 이 끝나 고 새로운 GET 요청 이 시 작 됩 니 다.원본 요청 에 있 는 인자 도 함께 사라 집 니 다. 새로운 요청 속성 에 서 는 모델 에서 온 데이터 가 없습니다. 방법 을 통 해 가 져 온 후 방향 을 바 꾸 는 결과 에 값 을 부여 하여 새로운 요청 데이터 로 해 야 합 니 다.
    데 이 터 를 전달 하 는 두 가지 방법:
  • URL 템 플 릿 을 사용 하여 경로 변수 와 / 또는 조회 매개 변수 로 데 이 터 를 전달 합 니 다.
  • 플래시 속성 을 통 해 데 이 터 를 보 냅 니 다.

  • 첫 번 째 방법
    	@RequestMapping(value="/register",method=POST)
    	public String executeRegister(Spittr spittr,Model model) {\
    		spitterRepository.save(spittr);
    		model.addAttribute("username",spitter.getUsername());
    		//      POJO  spittr,       Username,     getUsername()   
    		// 5.4    
    		// return "redirect:/home/" + spittr.getUsername()
    		return "redirect:/home/{username}";
    
    	}
    

    username 을 URL 템 플 릿 에 직접 연결 하 는 대신 자리 표시 자 로 채 워 서 자리 표시 자 에서 의 인 코딩 을 다시 바 꾸 어 안전성 을 향상 시 켰 습 니 다.
    예 2:
    	@RequestMapping(value="/register",method=POST)
    	public String executeRegister(Spittr spittr,Model model) {\
    		spitterRepository.save(spittr);
    		model.addAttribute("username",spitter.getUsername());
    		model.addAttribute("userId",spitter.getId());
    		//      POJO  spittr,       Username,     getUsername()   
    		// 5.4    
    		// return "redirect:/home/" + spittr.getUsername()
    		return "redirect:/home/{username}";
    	}
    

    userId 가 추가 되 었 습 니 다. 그러나 재 설정 경로 에 userId 의 자리 표시 자가 없습니다. 재 설정 하면 끝 에 불 러 옵 니 다. ID = 47 을 가정 하여 / home / lihua? userId = 47 을 생 성 합 니 다.이 url 에 대해 잘 알 고 있 습 니까?뒤의 내용 은 이렇게 덧 붙 인 것 이다.
    이 방법의 한계점: 문자열 이나 숫자 등 간단 한 값 만 보 낼 수 있 고 더 복잡 한 값 을 처리 할 수 없다 는 점 이다.복잡 한 값 을 처리 하 는 것 은 플래시 방법 이 존재 하 는 의미 이다.
    제2 장 방법 -- 플래시
    실제 대상 등 을 보 내 려 면 Spring 은 골반 을 살아 있 는 데 이 터 를 세 션 에 재 설정 하여 플래시 속성 으로 보 내 는 기능 을 제공 합 니 다. 정의 에 따라 플래시 속성 은 다음 요청 까지 이 데 이 터 를 계속 가지 고 다 닙 니 다.RedirectAttributes 에서 플래시 속성 을 설정 하 는 방법 을 제공 합 니 다.이 모듈 은 Model 의 모든 기능 을 포함 할 뿐만 아니 라 플래시 속성 을 설정 하 는 몇 가지 방법 도 제공 합 니 다.
    	@RequestMapping(value="/register",method=POST)
    	public String executeRegister(Spittr spittr,RedirectAttributes model) {\
    		spitterRepository.save(spittr);
    		model.addAttribute("username",spitter.getUsername());
    		//      POJO  spittr,       Username,     getUsername()   
    		// 5.4    
    		// return "redirect:/home/" + spittr.getUsername();
    		model.addFlashAttribute("spitter",spitter);
    		return "redirect:/home/{username}";
    
    	}
    

    "spitter" 는 key 이 고, 뒤에 spitter 는 값 이 며, flash 는 설정 하지 않 고 자동 으로 추정 합 니 다.

    좋은 웹페이지 즐겨찾기