Spring Boot教程(9) – Model的用法

你必定知道Model类,在控制器中,数据会存放到Model对象中,当须要生成HTML的时候,模板引擎会根据名字来定位数据,向下图这样。html

从广义上来讲,Model指的是MVC中的M,即Model(模型)。从狭义上讲,Model就是个key-value集合。实际上,上图home方法获得的model对象就是一个 java.util.Map ,你能够将Model类型替换为Map<String, Object> ,或者ModelMap——一个实现了Model接口的java.util.HashMapjava

往Model里放数据还有另一种方式,使用ModelAndView。正如它的名字同样,ModelAndView将Model和视图名绑定在一块儿,做为请求处理方法的返回值。web

有的人会倾向于这种写法。由于请求处理方法(上图的home方法)的参数,一般是带有“输入(input)”的含义的,好比咱们以前介绍的@RequestParam和@PathVariable,好比咱们没有介绍过的@RequestHeader和@CookieValue,他们都是一个请求的“输入”,一般不会变。若是将Model类做为请求处理方法的参数,而且去改变他,可能有点不太“合适”。spring

写法怎么来肯定,每一个人不一样,只要你的选择在项目里始终如一就行。对于我来讲,我选择将Model做为请求处理方法的参数,不只是由于这种写法更新一点,简便一点,更由于它能够获取更多信息。咱们知道Model是伴随一个请求的整个过程的,在请求处理方法执行以前,Model有可能已经有数据了,把Model做为参数,就能够看到方法执行以前的数据了。接下来,咱们看看,在方法执行以前如何给Model里添加数据。mvc

@ModelAttribute的用法

在全部的请求处理方法执行以前,你有机会往Model里面加数据:新建一个方法,加上@ModelAttribute注解和Model参数,就能够像下图这种样加数据了。app

注意,每一个请求处理方法在执行以前,都会执行一次fillData方法。虽然fillData不是@RequestMapping方法,不能指定请求路径,可是能够添加不少请求处理方法的参数,好比@RequestParam,@RequestHeader等。好比你的HTTP请求里有一个Header是自定义的,那么你能够在fillData方法里,获取到Header的信息,再根据它获取一些数据好比用户信息什么的,放到Model里。框架

若是fillData里的数据不多,只有一个对象,你能够直接把这个对象返回,它会自动被加入到Model里,至关于隐性执行了Model的addAttribute(Object)方法。下图中你能够看到,虽然你没有指明在Model中User对象的名字,可是Model自动给它了一个名字“user”,由于你不提供名字(即key)的话,框架会根据类名生成一个,规则是类名首字母小写(User->user)。这个key若是你想改,就给fillData方法的@ModelAttribute注解添加一个参数。spring-boot

@ModelAttribute还有一种用途是做为请求处理方法的参数,若是你须要Model中某个对象,能够给参数添加@ModelAttribute注解:ui

若是Model中没有User对象,那么框架会建立一个,并放到Model中,也就是说user变量确定不为空。而后呢,GET请求或者POST请求的参数,会跟user对象的成员(fields)名称进行对应,对的上的话就赋值给成员。这个过程也叫作数据绑定(Data Binding),一个典型的应用就是处理表单。由于这种用法太常见了,因此@ModelAttribute也是能够省略的,请求处理方法的参数,若是不是框架能识别的类型,都会假定它用了@ModelAttribute。3d

文本不打算对数据绑定这一起进行说明,由于东西还挺多的,以后介绍表单处理的时候咱们再详细解读。

原文连接:fookwood.com/spring-boot…

相关文章
相关标签/搜索