복붙노트

[SPRING] 스프링 MVC : @RequestParam과 @ModelAttribute의 차이점을 설명하십시오.

SPRING

스프링 MVC : @RequestParam과 @ModelAttribute의 차이점을 설명하십시오.

저는 Spring MVC를 처음 사용합니다. 문서의 압축을 풀어주십시오.

선적 서류 비치

봄 MVC 문서 상태 (중점 광산) :

면책 / 명확히하기

@ModelAttribute와 @RequestParam은 같은 것이 아니며 상호 배타적이지 않으며 같은 역할을 수행하지 않고이 질문 에서처럼 동시에 사용할 수 있습니다. 실제로 @RequestParam을 사용하여 @ModelAttribute의 필드를 채울 수 있습니다 . 제 질문은 내부 업무의 차이에 맞춰졌습니다.

의문:

@ModelAttribute (메서드가 아니라 메서드 인수에 사용되는)와 @RequestParam의 차이점은 무엇입니까? 구체적으로 :

또는 매우 기본적인 코딩 예제에서이 두 예제의 실제 작동 차이점은 무엇입니까?

예제 1 : @RequestParam :

// foo and bar are thrown away, and are just used (e.g.) to control flow?
@RequestMapping(method = RequestMethod.POST)
public String testFooBar(@RequestParam("foo") String foo,
@RequestParam("bar") String bar, ModelMap model) {
    try {
     doStuff(foo, bar);
    }
    // other code
  }

예제 2 : @ModelAttribute :

// FOOBAR CLASS
// Fields could of course be explicitly populated from parameters by @RequestParam
public class FooBar{
    private String foo;
    private String bar;
   // plus set() and get() methods
}

// CONTROLLER
// Foo and Bar become part of the model to be returned for the next view?
@RequestMapping(method = RequestMethod.POST)
public String setupForm(@ModelAttribute("fooBar") FooBar foobar) {
   String foo = fooBar.getFoo();
   String bar = fooBar.getBar();
   try {
      doStuff(foo, bar);
   }
   // other code
}

나의 현재 이해 :

@ModelAttribute와 @RequestParam은 모두 정보에 대한 요청 매개 변수를 조사하지만이 정보를 다르게 사용합니다.

이 올바른지?

해결법

  1. ==============================

    1."모델"이라는 단어를 세션과 혼동하지 마십시오. http 대화는 일반적으로 HTTP.GET, 서버 응답, HTTP.POST입니다. 사용중인 @ModelAttribute 주석을 사용하면 주석을 첨부 한 인스턴스를 항상 생성하므로 '모델에 항목을 제공하면 변수가 달라질 수 있습니다'라고 생각하게됩니다. 이것은 올바르지 않습니다. HttpServletRequest가 끝나면 세션에서 저장되지 않은 이상 해당 변수가 더 이상 브라우저 / 서버 대화의 일부가되어서는 안됩니다.

    "모델"이라는 단어를 세션과 혼동하지 마십시오. http 대화는 일반적으로 HTTP.GET, 서버 응답, HTTP.POST입니다. 사용중인 @ModelAttribute 주석을 사용하면 주석을 첨부 한 인스턴스를 항상 생성하므로 '모델에 항목을 제공하면 변수가 달라질 수 있습니다'라고 생각하게됩니다. 이것은 올바르지 않습니다. HttpServletRequest가 끝나면 세션에서 저장되지 않은 이상 해당 변수가 더 이상 브라우저 / 서버 대화의 일부가되어서는 안됩니다.

    예! @ModelAttribute가 올바른지 확인하기 위해 Spring에 기본 웹 데이터 바인더를 사용하여 HttpServletRequest의 데이터로 인스턴스의 인스턴스를 채우도록합니다. 이 데이터를 다시 뷰에 전달하도록 선택하는 것은 프로그래머에게 달려 있습니다. @ModelAttribute로 주석 된 메소드가있을 때마다 코드가 해당 서블릿에 도달 할 때마다 호출됩니다. 메서드의 매개 변수 중 하나 인 @ModelAttribute를 사용하는 경우 들어오는 Http 양식 데이터 바인딩에 대해 설명합니다.

    @RequestParam을 호출하는 것은 request.getParameter ( "foo"); 후드 아래에서 Java의 HttpServletRequest를 사용하면 키 -> 값 조회를 수행하여 요청 객체에서 값을 가져올 수 있습니다. 반환되는 값은 Object 유형입니다. 이것은 웹 어플리케이션에서 Spring을 사용하지 않는다면 많이 입력 할 것입니다.

    Spring은 @ModelAttribute를 사용하기 시작할 때이 추상화를 한 걸음 더 나아 간다. 이 주석은 데이터 바인딩이라는 개념을 사용합니다. 데이터 바인딩의 목표는 컨트롤러의 코드가 모든 양식 요소에 대해 request.getParameter ( "foo1")를 호출 할 필요가 없다는 것입니다. 5 개의 필드가있는 웹 양식이 있다고 가정 해보십시오. 데이터 바인딩이 없으면 프로그래머는 각 필드를 수동으로 검색하고 유효성을 검사해야합니다. 프로그래머는 요청에 속성이 포함되어 있는지, 속성 값이 있는지, 속성 값이 각 필드에 필요한 유형인지 확인해야합니다. @ModelAttribute를 사용하면 Spring에게이 작업을 수행하도록 지시합니다.

    컨트롤러의 메소드에 @ModelAttribute ( "fooBar") 주석을 달았을 경우 FooBar fooBar FooBar의 인스턴스는 항상 Spring에 의해 생성되어 메소드에 제공됩니다. 데이터 바인딩이 작동하는 곳은이 주석이 메서드의 매개 변수에 사용되는 경우입니다. Spring은 HttpServletRequest의 인스턴스를보고 FooBar의 인스턴스에서 올바른 속성에 대한 요청의 데이터와 일치 할 수 있는지를 확인한다. 이것은 foo와 getFoo 및 setFoo라고하는 공용 getter 및 setter와 같은 필드가있는 Java 속성 규칙을 기반으로합니다. 이것은 마술처럼 보일지 모르지만 Convention을 중단한다면 Spring 데이터 바인딩은 HttpServletRequest에서 데이터를 바인딩 할 위치를 알 수 없으므로 작동을 멈추게됩니다. FooBar의 인스턴스는 여전히 얻을 수 있지만 속성은 그렇지 않습니다. 요청의 값으로 설정하십시오.

  2. ==============================

    2.@ModelAttribute : Employee와 같은 전체 자바 객체를 바인딩합니다. 여러 요청 매개 변수를 지원합니다.

    @ModelAttribute : Employee와 같은 전체 자바 객체를 바인딩합니다. 여러 요청 매개 변수를 지원합니다.

    @RequestParam : firstName과 같은 단일 요청 매개 변수를 바인딩합니다.

    일반적으로, @RequestParam은 소수의 매개 변수를 읽는 데 가장 좋습니다.

    @ModelAttribute는 많은 수의 필드가있는 양식이있을 때 사용됩니다.

    @ModelAttribute는 데이터 바인딩, 유효성 검사 및 양식 미리 채우기와 같은 추가 기능을 제공합니다.

  3. ==============================

    3.@ModelAttribute 주석 파라미터 주석 파라미터는 파라미터 타입에 따라 등록 또는 RequestParamMethodArgumentResolver RequestParamMapMethodArgumentResolver에서 처리 @RequestParam 등록 ServletModelAttributeMethodProcessor (또는 ModelAttributeMethodProcessor)에 의해 처리되고있다.

    @ModelAttribute 주석 파라미터 주석 파라미터는 파라미터 타입에 따라 등록 또는 RequestParamMethodArgumentResolver RequestParamMapMethodArgumentResolver에서 처리 @RequestParam 등록 ServletModelAttributeMethodProcessor (또는 ModelAttributeMethodProcessor)에 의해 처리되고있다.

    Spring이 이러한 HandlerMethodArgumentResolvers를 사용하여 핸들러 메소드에 대한 인수를 해결하는 방법에 대한 설명은 다음과 같습니다.

    @ModelAttribute와 @RequestParam의 두 경우 모두, 바인딩 될 값은 ServletRequest 매개 변수에서 검색됩니다.

    위에서 언급 한 유형의 소스 코드를 볼 수 있지만 여기에는 간단한 세부 정보가 나와 있습니다.

    @ModelAttribute의 경우, Spring은 매개 변수 유형의 인스턴스를 생성합니다. 해당 인스턴스의 필드를 검사하고 @ModelAttribute 이름과 필드 이름으로 구성된 이름 지정 / 별칭 지정 전략에 따라 매개 변수 값을 바인딩하려고합니다. 일반적으로 Converter 인스턴스 그룹을 사용하여 String (매개 변수 값은 항상 String 값)을 대상 필드 유형 Integer, Date 등으로 변환합니다. 사용자 지정 변환을 위해 자체 변환기 유형을 등록 할 수도 있습니다. POJO 유형을 중첩 할 수도 있습니다.

    @RequestParam의 경우 Spring은 동일한 Converter 인스턴스를 사용하여 매개 변수 값을 주석 된 매개 변수 유형으로 직접 변환합니다.

    매개 변수 값은 "버림"되지 않습니다. 컨테이너의 요청 처리주기 동안 HttpServletRequest에 저장됩니다. 항상 적절한 방법을 통해 액세스 할 수 있습니다.

  4. ==============================

    4.@ModelAttribute (매개 변수)는 @SessionAttributes 또는 @ModelAttribute (메서드)에서 모델 특성을로드합니다.

    @ModelAttribute (매개 변수)는 @SessionAttributes 또는 @ModelAttribute (메서드)에서 모델 특성을로드합니다.

    요청에서 값을 바인딩하는 것만으로는 필요하지 않지만 @SessionAttributes에서로드 한 후에 값을 바인딩 할 수 있습니다.

    @RequestParam은 요청 매개 변수를 객체에 바인딩합니다.

  5. ==============================

    5.어노테이션이 메소드 레벨에서 사용되면 해당 메소드의 목적이 하나 이상의 모델 속성을 추가하는 것임을 나타냅니다. 이러한 메소드는 @RequestMapping 메소드와 동일한 인수 유형을 지원하지만 요청에 직접 맵핑 될 수는 없습니다.

    어노테이션이 메소드 레벨에서 사용되면 해당 메소드의 목적이 하나 이상의 모델 속성을 추가하는 것임을 나타냅니다. 이러한 메소드는 @RequestMapping 메소드와 동일한 인수 유형을 지원하지만 요청에 직접 맵핑 될 수는 없습니다.

    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "Welcome to the Netherlands!");
    }
    

    msg라는 속성을 컨트롤러 클래스에 정의 된 모든 모델에 추가하는 메소드입니다.

    Spring MVC는 요청 핸들러 메소드를 호출하기 전에 항상 먼저 메소드를 호출합니다. 즉 @ModelAttribute 메소드는 @RequestMapping으로 주석 된 컨트롤러 메소드가 호출되기 전에 호출됩니다. 시퀀스의 논리는 컨트롤러 메소드 내부에서 처리가 시작되기 전에 모델 객체를 만들어야한다는 것입니다.

    또한 각 클래스에 @ControllerAdvice로 주석을 추가하는 것이 중요합니다. 따라서 Global로 식별 될 Model에 값을 추가 할 수 있습니다. 이것은 실제로 모든 요청에 ​​대해 응답 부분에있는 모든 메소드에 대한 기본값이 있음을 의미합니다.

    메서드 인수로 사용되면 모델에서 인수를 가져와야 함을 나타냅니다. 존재하지 않는다면 먼저 인스턴스화 된 다음 모델에 추가되고 모델에 일단 존재해야합니다. 인수 필드는 일치하는 이름을 갖는 모든 요청 매개 변수로부터 채워 져야합니다.

    사용자 모델 속성 다음에 나오는 코드 스 니펫에는 addUser 끝점에 제출 된 양식의 데이터가 채워집니다. Spring MVC는 submit 메소드를 호출하기 전에 이것을 수행한다.

    **@RequestMapping**(value = "/addUser", method = RequestMethod.POST)
    public String submit(@ModelAttribute("user") User user) {
        return "userView";
    }
    

    따라서 양식 데이터를 bean과 바인드합니다. @RequestMapping으로 주석 된 컨트롤러는 @ModelAttribute로 주석 된 사용자 정의 클래스 인수를 가질 수 있습니다.

    이것은 일반적으로 Spring-MVC에서 데이터 바인딩으로 알려진 것으로, 각 폼 필드를 개별적으로 구문 분석하지 않아도되는 일반적인 메커니즘입니다.

  6. from https://stackoverflow.com/questions/29370581/spring-mvc-please-explain-difference-between-requestparam-and-modelattribute by cc-by-sa and MIT license