Что это значит, когда Spring MVC @Controller возвращает нулевое имя представления? - PullRequest
18 голосов
/ 29 июля 2011

Я скачал код для Spring MVC 3 Showcase .Одна вещь озадачивает меня (ну, больше чем один), почему этот (отредактированный для краткости) образец возвращает 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";            
        }
    }
}

Ответы [ 2 ]

25 голосов
/ 29 июля 2011

Если контроллер возвращает нулевое имя представления или объявляет тип возврата void, Spring попытается вывести имя представления из URL-адреса запроса.

В вашем случае он примет имя представления form и продолжит работу в этом предположении.

Для этого используется реализация RequestToViewNameTranslator, реализация по умолчанию которой DefaultRequestToViewNameTranslator, javadoc, для которого объясняет точные правила, к которым он применяется.

2 голосов
/ 04 мая 2012

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 существует именно в этом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...