2011-07-29 6 views
16

Pobrałem kod dla Spring MVC 3 Showcase. Jedna rzecz mnie zastanawia (cóż, więcej niż jeden), dlaczego ta (edytowana na końcu) próbka zwraca null?Co to znaczy, gdy Spring MVC @Controller zwraca nazwę widoku null?

@Controller 
@RequestMapping("/form") 
public class FormController { 
    @RequestMapping(method=RequestMethod.POST) 
    public String processSubmit(@Valid FormBean form, 
       BindingResult result, 
       WebRequest webRequest, 
       HttpSession session, Model model) { 

     if (result.hasErrors()) { 
      return null; 
     } else { 
      session.setAttribute("form", form); 
      return "redirect:/form";    
     } 
    } 
} 

Odpowiedz

24

Jeśli kontroler zwraca null nazwę widoku, lub deklaruje typ void powrotny, wiosna będzie próbował wyprowadzić nazwę widoku z żądania URL.

W twoim przypadku przyjmie on nazwę widoku form i kontynuuje to założenie.

Robi to za pomocą implementacji RequestToViewNameTranslator, której domyślna implementacja to DefaultRequestToViewNameTranslator, wyjaśniając dokładne zasady, które ma zastosowanie.

+0

Czy fasola RequestToViewNameTranslator musi być jawnie dostarczona, czy też Spring dostarcza ją po wyjęciu z pudełka? – acvcu

2

AnnotationMethodHandlerAdapter.invokeHandlerMethod() zajmuje się wywoływanie metod obsługi. W tym przypadku ModelAndView zostanie pobrany przez ServletHandlerMethodInvoker.getModelAndView().

W twoim przypadku getModelAndView() dostanie wartość zwracaną przez metodę modułu obsługi w postaci null. Metoda getModelAndView() sprawdza typ wartości zwracanej, ale as in Java null is never an instanceof any class, logika tej metody utworzy nowy ModelAndView. Nowa właściwość widoku ModelAndView ma ustawioną wartość null.

Później z powrotem w górę stosu wywołań w DispatcherServlet.doDispatch(), nie jest test, jeśli obiekt ModelAndView ma View z nim związane (mv.hasView()). Ponieważ logika view == null, doDispatch() wywołuje mv.setViewName(getDefaultViewName(request)). Przekazuje on zarejestrowanemu użytkownikowi RequestToViewNameTranslator, którego domyślną implementacją jest DefaultRequestToViewNameTranslator. Ta podklasa tłumaczy identyfikator URI żądania na nazwę widoku, w twoim przypadku form.

Później doDispatch() poprzez render() ->resolveViewName(), ta próbka jest ViewResolver s są dostarczane z nazwą widoku form. W tej próbce jest używany tylko jeden obiekt ViewResolver, . Ponadto ten InternalResourceViewResolver został skonfigurowany w src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml, aby dodać prefiks /WEB-INF/views/ i przyrostek .jsp do nazwy widoku. W sumie utworzy on View przy użyciu pliku JSP /WEB-INF/views/form.jsp. Na szczęście plik JSP istnieje dokładnie w tej lokalizacji.