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 ModelAndView
View
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.
¿Se debe proporcionar explícitamente un bean RequestToViewNameTranslator, o Spring lo proporciona de fábrica? – acvcu