itsource

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

mycopycode 2023. 7. 26. 22:05
반응형

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

Spring MVC에 새로 왔습니다. 서류 정리 좀 도와주세요.

문서화

Spring MVC Documentation은 다음과 같이 기술합니다(광산 강조).

  • @ModelAttribute메서드 인수에 대해 모델에서 인수를 검색해야 함을 나타냅니다.모델에 없는 경우 인수를 먼저 인스턴스화한 다음 모델에 추가해야 합니다.모델에 있는 인수의 필드는 일치하는 이름을 가진 모든 요청 매개 변수에서 채워져야 합니다.WebDataBinder 클래스는 쿼리 문자열 매개 변수 및 양식 필드를 포함한 요청 매개 변수 이름을 이름별로 모델 속성 필드와 일치시킵니다.

  • @RequestParam 요청 매개 변수를 컨트롤러의 메서드 매개 변수에 바인딩합니다.

고지 사항/명확한 설명자

나는 그것을 알고 있습니다.@ModelAttribute그리고.@RequestParam동일한 것이 아니며, 상호 배타적이지 않으며, 동일한 역할을 수행하지 않으며, 이 질문에서와 같이 동시에 사용될 수 있습니다.@RequestParam 채는 수있다니습사할의 데 할 수 .@ModelAttribute제 질문은 그들의 내부 작업 간의 차이에 더 맞춰져 있습니다.

질문:.

사이의 차이점은 무엇입니까?@ModelAttribute됨) 및 (메소드가 아닌 메소드 인수@RequestParam구체적으로:

  • 출처: Do@RequestParam그리고.@ModelAttribute 요청 매개 소스/모뎀을 . 요청 변수는 되었을 수 . 이 매개 변수는 "URL"입니다.POST에드?
  • 용도: 변수를 사용하여 검색한 것이 맞습니까?@RequestParam로 전달되지 않는 한). (으)로 는 (으)ㄹ 수 있습니다.@ModelAttribute반환할 모델에 자동으로 입력됩니까?

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

1: 예 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: § 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 다 요청 변수에 하지만 이 를 다르게합니다. 즉, 다 요 청 매 변 개 수 같 정 다 보 은 를 사 게 르 용 합 니 다 다 둘 과 음 만 얻 지 를 보 정 여 하 조 회 를 ▁both 합 ▁this 둘 ▁interrog 니 ation ▁different 다용eters▁for ▁inform사ate▁the▁but▁param▁they▁usely다:ation▁inform,▁request게르다

  • @RequestParam변수를 채울 뿐입니다((있립필일드음만수형행론물▁a)의 도 있음).@ModelAttribute.이러한 변수는 모델에 입력되지 않은 경우 컨트롤러가 완료되면 버려집니다.

  • @ModelAttribute 다음 . 그러면 뷰로 다시 전달될 모델의 속성을 채웁니다.

이거 맞는건가요?

@RequestParam변수를 채울 뿐입니다((있립필일드음만수형행론물▁a)의 도 있음).@ModelAttribute.이러한 변수는 모델에 입력되지 않은 경우 컨트롤러가 완료되면 버려집니다.

"모델"이라는 단어와 세션을 혼동하지 마십시오.과 같습니다.HTTP.GET 응답 에 " " ", "HTTP.POST▁you을이 있을 때.@ModelAttribute사용 중인 주석은 항상 주석이 달린 모든 항목의 인스턴스를 구성합니다. 이것이 바로 '모델에 물건을 공급하는' 것이 변수를 고착시킬 수 있다고 생각하게 만드는 이유입니다.이건 옳지 않아요, 일단은.HttpServletRequest세션에 저장되지 않은 변수는 더 이상 브라우저/서버 대화에 포함되지 않아야 합니다.

@ModelAttribute 다음 . 그러면 뷰로 다시 전달될 모델의 속성을 채웁니다.

정확하게 , 네! 정게하말면하확,말,@ModelAttribute웹하여 Spring의 합니다.HttpServletRequest이 데이터를 다시 보기로 전달할지 여부는 프로그래머에게 달려 있습니다.주석이 달린 메소드가 있는 경우@ModelAttribute코드가 서블릿에 도달할 때마다 호출됩니다.당신이 가지고 있는@ModelAttribute메소드의 매개 변수 중 하나로, 우리는 들어오는 HTTP 폼 데이터 바인딩에 대해 이야기하고 있습니다.

하기 르기@RequestParam라고 말하는 지름길입니다.request.getParameter("foo")밀에리의, 자바비.HttpServletRequest키->값 조회를 수행하여 요청 개체에서 값을 가져올 수 있습니다.반환된 값은 Object 유형입니다.웹 응용 프로그램에서 스프링을 사용하지 않는 경우 자주 입력할 수 있는 항목입니다.

그러면 봄은 당신이 사용하기 시작할 때 이 추상화를 한 걸음 더 나아갑니다.@ModelAttribute이 주석은 데이터 바인딩 개념을 사용합니다.가 데터바목표컨있코에는가드러트롤는의를 부를 필요가 request.getParameter("foo1")모든 폼 요소에 대해.5개의 필드가 있는 웹 양식을 가지고 있다고 상상해 보십시오.데이터 바인딩 없이 프로그래머는 수동으로 각 필드를 검색하고 유효성을 검사해야 합니다.프로그래머는 요청에 속성이 포함되어 있는지, 속성 값이 존재하는지, 속성 값이 각 필드에 대해 예상되는 유형인지 확인해야 합니다.용사를 합니다.@ModelAttribute스프링이 당신을 위해 이 일을 하라고 말합니다.

에 "Method"에 "라는 @ModelAttribute("fooBar") FooBar fooBarFooBar항상 Spring에 의해 제작되어 당신의 방법으로 공급될 입니다.데이터 바인딩이 실행되는 경우는 이 주석이 메서드의 매개 변수에 사용되는 경우입니다. Spring은 다음의 인스턴스를 봅니다.HttpServletRequest를 요의데 이스의 올청속일의 시킬 수 합니다.FooBar는 " Properties"와 같은 Properties 을 기반으로 합니다.foo그리고 공공 게터와 세터라고 불리는.getFoo그리고.setFoo이것은 마법처럼 보일 수 있지만 관례를 깨는 경우 Spring 데이터 바인딩이 작동하지 않을 것입니다. 왜냐하면 데이터를 바인딩할 위치를 알 수 없기 때문입니다.HttpServletRequest당신은 여전히 의 예를 얻을 것입니다.FooBar그러나 속성이 요청의 값으로 설정되지 않습니다.

@ModelAttribute자바 (Multiple: Employee) . 는 매개변수를 지원합니다.

@RequestParam단일 요청 매개 변수를 바인딩합니다(예: firstName).

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

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

그리고.

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

@ModelAttribute이 달린 된 주이달매린는등매록다의처니리됩해에 의해 됩니다.ServletModelAttributeMethodProcessor(또는)ModelAttributeMethodProcessor및 ) 및@RequestParam이 달린 된 주이달매린는등매록다의처니리됩해에 의해 됩니다.RequestParamMethodArgumentResolver또는RequestParamMapMethodArgumentResolver매개 변수 유형에 따라 다릅니다.

이 Spring을 HandlerMethodArgumentResolvers처리기 메서드에 대한 인수를 해결하려면 다음과 같이 하십시오.

모두, 두경우모두,,@ModelAttribute그리고.@RequestParam매개 변수에서 바인딩할 값을 검색합니다.

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

위해서@ModelAttribute스프링은 매개 변수 유형의 인스턴스를 만듭니다.하고 인턴에필검다명구음사드명성고으/일리어스시로 으로 매개 합니다.@ModelAttribute이름 및 필드 이름을 입력합니다.일반적으로 다음과 같은 그룹을 사용합니다.Converter에서 String (으)로 표시됩니다.Stringvalues) 유형에 ① 대드 상관 Integer,Date의 기타를 . 당신은 또한 당신의 것을 등록할 수 있습니다.Converter사용자 지정 변환 유형.POJO 유형을 중첩할 수도 있습니다.

위해서@RequestParam한 스도동게사다니됩을 입니다.Converter매개 변수 값에서 주석이 달린 매개 변수 유형으로 직접 변환할 인스턴스.

매개 변수 값은 "버려지는" 것이 아닙니다.이러한 데이터는 다음에 저장됩니다.HttpServletRequest컨테이너의 요청 처리 주기 동안.언제든지 적절한 방법으로 액세스할 수 있습니다.

@ModelAttribute (모수) 모형 특성 로드 위치@SessionAttributes 는또에에서.@ModelAttribute (계속).

요청에서 합니다.@SessionAttributes.

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

  • 방법 수준에서

방법 수준에서 주석을 사용하면 해당 방법의 목적이 하나 이상의 모델 속성을 추가하는 것임을 나타냅니다.은 이한메서다같음인유지다원니합과 같은 합니다.@RequestMapping요청에 직접 매핑할 수 없는 메서드입니다.

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

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

Spring-MVC는 요청 처리기 메서드를 호출하기 전에 항상 해당 메서드에 먼저 호출합니다.즉, @RequestMapping으로 주석이 달린 컨트롤러 메서드가 호출되기 전에 @ModelAttribute 메서드가 호출됩니다.시퀀스의 논리는 모델 개체가 컨트롤러 메서드 내에서 처리를 시작하기 전에 생성되어야 한다는 것입니다.

또한 각 클래스에 @ControllerAdvise로 주석을 다는 것도 중요합니다.따라서 전역으로 식별될 모형에 값을 추가할 수 있습니다.이는 실제로 모든 요청에 대해 응답 부분의 모든 메서드에 대해 기본값이 존재함을 의미합니다.

  • 메서드 인수로

메서드 인수로 사용되는 경우 인수가 모델에서 검색되어야 함을 나타냅니다. 없으면 먼저 인스턴스화된 다음 모델에 추가되어야 하며 모델에 있는 경우 일치하는 이름을 가진 모든 요청 매개 변수에서 인수 필드를 채워야 합니다.

다음 코드 조각에서 사용자 모델 특성은 addUser 끝점에 제출된 양식의 데이터로 채워집니다.Spring MVC는 제출 방법을 호출하기 전에 백그라운드에서 이 작업을 수행합니다.

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

그래서, 그것은 형태 데이터를 콩과 결합합니다.@RequestMapping으로 주석이 달린 컨트롤러에는 @ModelAttribute로 주석이 달린 사용자 지정 클래스 인수가 있을 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/29370581/spring-mvc-please-explain-difference-between-requestparam-and-modelattribute

반응형