Spring MVC 数据模型与视图
用ModelAndView来定义视图类型,包括JSON视图,也用它来加载数据模型。ModelAndView有一个类型为ModelMap的属性model,而ModelMap继承了LinkedHashMap<String, Object>,因此它可以存放各种键值对,为了进一步定义数据模型功能,Spring还创建了类ExtendedModelMap,这个类实现了数据模型定义的Model接口,并且还在此基础上派生了关于数据绑定的类——BindAwareModelMap,它们的关系如图15-12所示。

在控制器的方法中,可以把ModelAndView、Model、ModelMap作为参数。在Spring MVC运行的时候,会自动初始化它们,因此可以选择ModelMap或者Model作为数据模型。事实上Spring MVC创建的是一个BindingAwareModelMap实例,根据图15-12的关系,可以通过强制转换把Model变为ModelMap,或者把ModelMap转换为Model。ModelAndView初始化后,Model属性为空,当调用它增加数据模型的方法后,会自动创建一个ModelMap实例,用以保存数据模型,至此数据模型之间的关系介绍清楚了,让我们用于实践。
代码清单15-41:测试数据模型
@RequestMapping(value = "/getRoleByModelMap", method = RequestMethod.GET)
public ModelAndView getRoleByModelMap(@RequestParam("id") Long id, ModelMap modelMap) {
// Role role = roleService.getRole(id);
Role role = new Role(id, "射手", "远程物理输出");
ModelAndView mv = new ModelAndView();
mv.setViewName("roleDetails");
modelMap.addAttribute("role", role);
return mv;
} @RequestMapping(value = "/getRoleByModel", method = RequestMethod.GET)
public ModelAndView getRoleByModel(@RequestParam("id") Long id, Model model) {
// Role role = roleService.getRole(id);
Role role = new Role(id, "射手", "远程物理输出");
ModelAndView mv = new ModelAndView();
mv.setViewName("roleDetails");
model.addAttribute("role", role);
return mv;
} @RequestMapping(value = "/getRoleByMv", method = RequestMethod.GET)
public ModelAndView getRoleByMv(@RequestParam("id") Long id, ModelAndView mv) {
// Role role = roleService.getRole(id);
Role role = new Role(id, "射手", "远程物理输出");
mv.setViewName("roleDetails");
mv.addObject("role", role);
return mv;
}
在笔者的测试中,无论使用Model还是ModelMap,它都是BindingAwareModelMap实例,而BindingAwareModelMap是一个继承了ModelMap,实现了Model接口的类,所以就有了相互转换的功能。而getRoleByModel和getRoleByModelMap都没有把数据模型绑定给视图和模型,这一步是Spring MVC在完成控制器逻辑后,自动绑定的,并不需要我们绑定,也就没有绑定的代码了。
视图
在Spring MVC中实现视图的类很多,比如JSTL视图JstlView,JSON视图MappingJackson2JsonView,PDF视图AbstractPdfView等,通过它们的render方法,Spring MVC就可以将数据模型渲染成为各类视图,以满足各种需求。图15-13就是常用的视图类和它们之间的关系,通过这些Spring MVC就能够支持多种视图渲染了。

视图又分为逻辑视图和非逻辑视图,比如MappingJack-son2JsonView是一个非逻辑视图,它的目的就是将数据模型转换为一个JSON视图,展现给用户,无须对视图名字再进行下一步的解析
InternalResourceView是一个逻辑视图,对于逻辑视图而言它需要一个视图解析器
Spring MVC 数据模型与视图的更多相关文章
- spring mvc: 资源绑定视图解析器(不推荐)
spring mvc: 资源绑定视图解析器(不推荐) 不适合单控制器多方法访问,有知道的兄弟能否告知. 访问地址: http://localhost:8080/guga2/hello/index 项目 ...
- spring mvc:内部资源视图解析器2(注解实现)@Controller/@RequestMapping
spring mvc:内部资源视图解析器2(注解实现) @Controller/@RequestMapping 访问地址: http://localhost:8080/guga2/hello/goo ...
- spring mvc:内部资源视图解析器(注解实现)@Controller/@RequestMapping
spring mvc:内部资源视图解析器(注解实现)@Controller/@RequestMapping 项目访问地址: http://localhost:8080/guga2/hello/prin ...
- Spring MVC资源绑定视图解析器
ResourceBundleViewResolver使用属性文件中定义的视图bean来解析视图名称. 以下示例显示如何使用Spring Web MVC框架中的ResourceBundleViewRes ...
- [Spring MVC] - JSP + Freemarker视图解释器整合
Spring MVC中如果只使用JSP做视图,可以使用下面这段即可解决: <!-- 视图解释类 --> <bean class="org.springframework.w ...
- spring mvc velocity多视图
1.ViewResolverUrlBasedViewResolver 这个东西是根据url 进行路由的.网上搜了 1.order 排序,同名出现各种问题 2.XmlViewResolver,BeanN ...
- [Spring MVC] - JSP + Freemarker视图解释器整合(转)
Spring MVC中如果只使用JSP做视图,可以使用下面这段即可解决: <!-- 视图解释类 --> <bean class="org.springframework.w ...
- Spring MVC内部资源视图解析器
InternalResourceViewResolver用于将提供的URI解析为实际URI.下面的示例演示如何在Spring Web MVC框架中使用SpringResultViewResolver. ...
- Spring MVC的多视图解析器配置及与Freemarker的集成
一.从freemarker谈起 Freemarker使用模板技术进行视图的渲染.自从看了Struts标签.Freemarker.JSTL的性能对比后,我毅然决定放弃Struts标签了!效率太差…… S ...
随机推荐
- Java中装箱和拆箱的代码
建议使用1.5或以上的jdk运行, //装箱 值类型到引用类型 int i = 10; Object object =i; System.out.println(object); / ...
- Oracle Replace()函数与translate()函数 替换函数
简要比较: replace 字符串级别的代替 如:SELECT REPLACE('accd','cd','ef') from dual; --> aefd translate 字符级别的代替 如 ...
- 【转发】c#做端口转发程序支持正向连接和反向链接
可以通过中转server来连接sql server,连接的时候用ip,port,不是冒号,是逗号 但试过local port 21想连接AS400的FTP却不成功...为咩涅... https://w ...
- am335x system upgrade rootfs for dhcpcd cross compile(十三)
dhcpcd移植 [目的] 移植dhcpcd的目是在AM335X开发板上使用dhcp功能,获取WAN口设备的IP,并且可以通过参数指定其matric,matric值越小,其优先级越高.如设备可以以太网 ...
- test命令用法。功能:检查文件和比较值
test命令用法.功能:检查文件和比较值 1)判断表达式 if test (表达式为真) if test !表达式为假 test 表达式1 –a 表达式2 两个表达 ...
- luogu P1058 立体图
做了这个题后明确了自己的定位... 恩...普及- 题目大意估计都知道.. 给个传送门: luogu 做了半上午 + 一整个下午的题... 占了我今天到的绝大多数时间. 其实此题不难, 核心代码我 ...
- centos host-only网卡配置
1.更改网卡配置 更改虚拟机/etc/sysconfig/network-scripts/ifcfg-enp0s3 文件,内容如下: TYPE=Ethernet PROXY_METHOD=none B ...
- mpvue开发小程序
实例生命周期 beforeCreate created beforeMount mounted beforeUpdate updated activated deactivated beforeDes ...
- javascript 中的对象初始化
参考 developer.mozilla.org 网站.这个是一个前端必须经常光顾的网站. 记录一下对象的创建方法,虽然很简单,但是确需要非常注意. Objects can be initialize ...
- bootstrap select 多选的用法,取值和赋值(取消默认选择第一个的对勾)
h5自带的select标签可以实现按住ctrl键多选的功能,但是样式及其难看. bootstrap select是很好用的前端插件 首先引入bootstrap和bootstrap-select的c ...