2016-06-23 3 views
2

저는 Spring MVC를 처음 사용합니다. 일부 앱을 실행하기 위해 관리되었지만 어떤 방향으로 어떤 방식으로 작동하는지에 대해 의문을 가지고 있으며 내가 찾고있는 설명을 찾을 수 없습니다. 특히이 방법 :모델 해상도 작동 방식 이해

@Controller 
@RequestMapping("/hello") 
public class HelloController{ 

    @RequestMapping(method = RequestMethod.GET) 
    public String printHello(ModelMap model) { 
     model.addAttribute("message", "Hello Spring MVC Framework!"); 
     return "hello"; 
    } 

} 

나는 (이름 message 아래) "Hello Spring MVC Framework!" 뷰에 전달되는 것을 알고있다.

  1. 가 왜 modelprintHello 방법 입력 매개 변수로 선언 :하지만 저를 염려 약간 특이한 찾아 두 가지가있다? 지역 변수로 말하지 않습니까?
  2. model으로 명시 적으로 전달되지 않으므로 어떻게 든 뒤에서 일어납니다.
+0

DispatcherServlet이 HandlerMapping을 참조하여 해당 Controller를 호출 할 때, 아마도 자신의 ModelMap 객체를 생성하여 메서드의 인수에 전달할 수 있다고 생각합니다. 그리고 만약 여러분이 로컬 인스턴스화를 통해 명시 적으로 생성하면 객체는 핸들러에 의해 관리되지 않으므로 바인딩이 발생하지 않습니다. 따라서 관례/협약으로 간주 할 수 있습니다. –

답변

2

model 이유는 printHello있어서 입력 변수로 선언? 지역 변수로 말하지 않습니까?

당신은 지역 변수로 선언하고 당신이 원하는 경우를 반환 할 수 있습니다

@RequestMapping("/hello") 
public ModelMap printHello() { 
    return new ModelMap("message", "Hello Spring MVC Framework!"); 
} 

하지만 바인딩 봄의 데이터를 활용하지 않은이 방법은 (바인딩 요청이 GET 요청 (쿼리 매개 변수) 속성 모델링). 또한

이 방법은 (원래 예를 return "hello" 같이) 어떤 뷰 이름을 제공하지 않는, 스프링 MVC는 논리적 뷰 이름으로 Controller 접미사없이 컨트롤러 이름을 사용하여 기본 DefaultRequestToViewNameTranslator를 사용하여 추론 있도록 (귀하의 예제에서이 hello 될 것입니다 귀하의 컨트롤러가 HelloController이기 때문에). 자세한 내용은 documentation을 참조하십시오.

또한 Model 또는 ModelMap 대신 새로운 ModelAndView 인스턴스를 반환 할 수 있습니다. 이 경우 명시 적으로 뷰 이름 및 모델 속성을 설정할 수 있습니다.

그러나 모델을 처리기 메서드 인수로 사용하면 데이터 바인딩이 주 장점입니다. 당신이 모델 일부 모델 속성을 제공 할 때

메소드 인자로 (요청을 바인딩 할), 당신은 이미 추가 (및 요청 PARAMS 사용하여 작성) 모델에 모델 속성을 가진 모델 인스턴스를 얻을 당신은 추가 할 수 있습니다 필요한 경우 다른 특성이 있습니다.

@RequestMapping(path = "/hello", method = RequestMethod.GET) 
public String printHello(Model model, @ModelAttribute("form") SearchForm form, BindingResult result) { 
    model.addAttribute("anotherUsefulValue", myService.getSomeValue()); 
    // 'hello' view will get the model with both 'form' and 'anotherUsefulValue' attributes 
    // and 'form' attribute will have 'text' field filled from request's 
    // query parameter 'text'. 
    return "hello"; 
} 

class SearchForm { 
    private String text; 
    // ... getter and setter 
} 

이 방법을 사용하면 text라는 이름의 텍스트 필드에 일부 HTML form에서 요청을 GET 할 수 있으며,이 양식을 제출하면 모델 값으로 인스턴스화 SearchForm 객체 속성 form 포함됩니다. 이 개체의 text 필드에는 값으로 text 쿼리 매개 변수가 있습니다. spring-form JSP Tag Library를 사용

예 :

<form:form method="GET" action="/hello" modelAttribute="form"> 
    <form:input path="text" /> 
    <input type="submit"> 
</form> 

하거나 URL /hello?text=12345을 입력합니다. 그리고 modelform 특성을 가지며 text 필드는 12345이고,anotherUsefulValue 특성을 갖습니다. Spring의 데이터 바인딩을 사용자 정의 모델 속성과 결합한 것입니다.

물론 수동으로 새 모델을 만들고 form 인수에서 form 속성과 함께 을 설정할 수 있습니다. 그러나 그것은 단지 보편적 인 것입니다.

model데도 명시 적으로, 그래서 이것은 어떻게 든 무대 뒤에서 발생합니까 뷰에 전달되고 있지

?

물론. 봄의 DispatcherServlet 다른 많은 것들과 마찬가지로 이것을하십시오. 이 모든 내용은 documentation에 설명되어 있습니다.

The request processing workflow in Spring Web MVC (high level)

Front Controller 당신의 컨트롤러 메소드가 반환 알고 그것은 새로운 모델이 나 방법이 어떤 모델을 반환하지 다음 Front Controller 그것을 인수로 컨트롤러 메소드로 전달 모델을 사용하는 경우 이해할 수있다.

1

당신이 제공하신 @RequestMapping 주석이 마술 않습니다. 나는 그것을 문자적이고 은유적인 의미로 말하고있다. 그것은 기본적으로 모든 것이 포함될 수있는 엉망진창을 기본적으로 제거합니다.

  1. 모델은 많은 선택 입력 매개 변수 중 하나입니다. 원한다면 더 많거나 적은 또는 아무것도 제공 할 수 없습니다. 이 경우, ModalMap을 사용하기를 원하기 때문에, 인수를 포함시켜 "ModalMap을 사용하고 싶다"라고 말합니다. 헤더와 같이 요청에서 오는 인수가있는 경우 해당 요청을 추가하고 캐스트 할 수 있습니다.

  2. 이것은 스프링에 의해 @Autowire과 유사합니다. 서비스를 자동으로 호출하면 어느 곳에서나 명시 적으로 new FooService()이라고 말할 수는 없지만 Spring에 의해 자동으로 작성되고 관리됩니다. 당신은 기본적으로 대부분의 배선 작업을 Spring에 맡기고 처리해야하는 모든 보일러 플레이트를 처리합니다.

이 경우 가져 오기 요청에서 클라이언트에 값이있는 ModalMap을 전달하고 그 값을 페이지에로드합니다.

추가 읽기 + 출처 :이 지역 변수없는 이유 모든 request.That 위해 스프링 MVC 프레임 워크에 의해 생성 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

+0

내 요점은 : (1) 모델을 입력 매개 변수로 보는 것이 이상했다. (2) 볼 수없는 부분이 명시 적으로보기로 전달되었다. 추신. 이 경우에도 뷰에 표시되는 텍스트는 코드에서 제시 한 텍스트뿐이므로 다른 데이터가 수신되지 않았다고 가정합니다. GET으로. –

+1

# 2와 관련해서는 이와 비슷합니다. 'Foo foo = new Foo(); String s = doSomething (foo);'Spring은 여전히이 경우에'foo'에 대한 참조를 가지고 있습니다. 'foo'가 페이지를로드하는 데 도움이되는 곳까지 되돌려 줄 필요는 없습니다. 매핑 된 유일한 'GET'메서드이기 때문에 args가 없으므로 원하는 메서드를 호출 할 수 있으며 여전히 응답의 대상 메서드가됩니다. – Compass

0

새로운model 개체입니다. 프레임 워크에 의해 생성 된 객체 자체는 이미 참조를 가지고 있으므로 프레임 워크는 뷰에 전달합니다.

1

model 객체가 인수로 전달 된 것으로 생각하십시오. 코드에서 아래에 추가 한 HttpServletRequest 객체와 유사합니다. Spring은 암시적인 모델 라이프 사이클을 통해 사용할 수있는 암시 적 모델 객체를 생성한다. 이것은 암시적인 request 객체와 비슷하다. 따라서 단일 요청주기마다이 암시 적 모델 객체는 컨트롤러와 뷰에서 공유됩니다.

@Controller 
@RequestMapping("/hello") 
public class HelloController{ 

    @RequestMapping(method = RequestMethod.GET) 
    public String printHello(ModelMap model, HttpServletRequest req) { 
     model.addAttribute("message", "Hello Spring MVC Framework!"); 
     return "hello"; 
    } 

} 

이하는 spring docs의 설명입니다.이 될 것입니다 암시 적 모델을 풍부하게하기위한

지도/모델/ModelMap을 @RequestMapping 주석 방법에 전달되는 입력 PARAMS의 중요성이 무엇인지 언급된다 웹보기에 노출.