2011-07-29 10 views
16

He descargado el código para Spring MVC 3 Showcase. Una cosa me desconcierta (bueno, más de uno), ¿por qué esta muestra (editada para concisión) devuelve null?¿Qué significa cuando Spring MVC @Controller devuelve un nombre de vista nulo?

@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";    
     } 
    } 
} 

Respuesta

24

Si un controlador devuelve un nombre de vista nulo, o declara un tipo de retorno void, Primavera tratará de inferir el nombre de la vista de la petición de URL.

En su caso, supondrá que el nombre de la vista es form, y proceda en esa suposición.

Hace esto usando una implementación de RequestToViewNameTranslator, cuya implementación predeterminada es DefaultRequestToViewNameTranslator, la javadoc for which explica las reglas exactas que aplica.

+0

¿Se debe proporcionar explícitamente un bean RequestToViewNameTranslator, o Spring lo proporciona de fábrica? – acvcu

2

AnnotationMethodHandlerAdapter.invokeHandlerMethod() se ocupa de invocar métodos de controlador. Aquí, se recuperará ModelAndView a través del ServletHandlerMethodInvoker.getModelAndView().

En su caso, getModelAndView() se proporciona el valor de retorno null del método del controlador. El método getModelAndView() comprueba el tipo del valor devuelto, pero as in Java null is never an instanceof any class, la lógica de ese método creará un nuevo ModelAndView. Un nuevo ModelAndView tiene inicialmente su propiedad de vista establecida en null.

Luego, más tarde volver a la pila de llamadas, en DispatcherServlet.doDispatch(), no es una prueba de si el objeto tiene una ModelAndViewView asociado a él (mv.hasView()). Porque view == null, doDispatch() 's lógica llama mv.setViewName(getDefaultViewName(request)). Se delega en el RequestToViewNameTranslator registrado, cuya implementación predeterminada es DefaultRequestToViewNameTranslator. Esta subclase traduce el URI de solicitud en un nombre de vista, en su caso form.

Más adelante en doDispatch(), a través de render() ->resolveViewName(), ViewResolver s de este ejemplo se proporcionan con el nombre de vista form. Solo uno ViewResolver, InternalResourceViewResolver se usa en esta muestra. Además, este InternalResourceViewResolver se configuró en src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml para agregar el prefijo /WEB-INF/views/ y el sufijo .jsp al nombre de la vista. Entonces, en total, creará un View usando el archivo JSP /WEB-INF/views/form.jsp. Afortunadamente, existe un archivo JSP exactamente en esta ubicación.

Cuestiones relacionadas