AnnotationMethodHandlerAdapter.invokeHandlerMethod()
заботится о вызове методов-обработчиков.Здесь ModelAndView
будет получено через ServletHandlerMethodInvoker.getModelAndView()
.
В вашем случае getModelAndView()
будет получено при условии возврата null
метода обработчика.Метод getModelAndView()
проверяет тип возвращаемого значения, но , как в Java, null никогда не является экземпляром какого-либо класса , логика этого метода создаст новый ModelAndView
.Новый ModelAndView
изначально имеет свойство view, установленное на null
.
Затем позже выполните резервное копирование стека вызовов, в DispatcherServlet.doDispatch()
, есть тест, если объект ModelAndView
имеет View
, связанный с ним (mv.hasView()
).Потому что логика view == null
, doDispatch()
вызывает mv.setViewName(getDefaultViewName(request))
.Он делегирует зарегистрированному RequestToViewNameTranslator
, чья реализация по умолчанию DefaultRequestToViewNameTranslator
.Этот подкласс переводит URI запроса в имя представления, в вашем случае form
.
Позже в doDispatch()
, через render()
-> resolveViewName()
, ViewResolver
этого образца предоставляются спосмотреть имя form
.В этом примере используется только один ViewResolver
, InternalResourceViewResolver
.Кроме того, этот InternalResourceViewResolver
был настроен в src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
для добавления префикса /WEB-INF/views/
и суффикса .jsp
к имени представления.Таким образом, в итоге он создаст View
, используя файл JSP /WEB-INF/views/form.jsp
.К счастью, файл JSP существует именно в этом месте.