我有一个像这样的控制器方法:
@RequestMapping("/hello")
public String hello(UserForm user) {
return "hello";
}
它在UserForm
命令对象中接收一些请求参数。但我有不编写任何代码来将对象添加到模型中。不过,在视图hello.jsp
中,我能够访问数据,如下所示:
Hello, ${userForm.name}!
这是否意味着Spring MVC会自动将命令对象添加到模型中?
答案 0 :(得分:0)
您只需使用@ModelAttribute
作为参数即可Bean
。
您需要使用@ModelAttribute
或model.addAttribute()
将默认数据加载到模型中 - 例如从数据库中加载。
答案 1 :(得分:0)
现实世界中的大多数Spring控制器都接受许多不同类型的参数-路径变量,URL参数,请求标头,请求主体,有时甚至是整个HTTP Request对象。这提供了创建API的灵活机制。只要将ObjectMapper(如Jackson)配置为负责反序列化,Spring就会非常擅长将这些参数解析为Java类型。
RequestMappingHandlerAdapter确保从HttpServletRequest解析方法的参数。
在处理程序方法之前(或期间)创建的Spring模型数据 执行将在下一个视图之前复制到HttpServletRequest 呈现。
到目前为止,Spring已经处理了HTTP请求,并根据该方法的返回值创建了ModelAndView对象。另外,请注意,您无需从控制器方法返回ModelAndView实例。您可以返回视图名称,或者可以将ResponseEntity或POJO转换为JSON响应等。
ServletInvocableHandlerMethod invocableMethod
= createInvocableHandlerMethod(handlerMethod);
if (this.argumentResolvers != null) {
invocableMethod.setHandlerMethodArgumentResolvers(
this.argumentResolvers);
}
if (this.returnValueHandlers != null) {
invocableMethod.setHandlerMethodReturnValueHandlers(
this.returnValueHandlers);
}
returnValueHandlers对象是HandlerMethodReturnValueHandler对象的组合。还有许多不同的值处理程序,可以处理方法的结果以创建适配器期望的ModelAndViewobject。
然后,它必须呈现用户将在浏览器中看到的HTML页面。它基于模型和封装在ModelAndView对象中的选定视图来执行此操作。
现在,在此阶段,视图可以从userForm
访问request scope
(如上例所示)。