Spring中Model、ModelMap及ModelAndView之间的区别
Spring中Model、ModelMap及ModelAndView之间的区别
1. Model(org.springframework.ui.Model)
Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap。
ExtendedModelMap继承了ModelMap类,ModelMap类实现了Map接口。
public class ExtendedModelMap extends ModelMap implements Model
Model通过以下方法向页面传递参数:
例:User1Controller.java

@Controller public class User1Controller{ private static final Log logger = LogFactory.getLog(User1Controller.class); // @ModelAttribute修饰的方法会先于login调用,该方法用于接收前台jsp页面传入的参数 @ModelAttribute public void userModel(String loginname,String password, Model model){ logger.info("userModel"); // 创建User对象存储jsp页面传入的参数 User2 user = new User2(); user.setLoginname(loginname); user.setPassword(password); // 将User对象添加到Model当中 model.addAttribute("user", user); } @RequestMapping(value="/login1") public String login(Model model){ logger.info("login"); // 从Model当中取出之前存入的名为user的对象 User2 user = (User2) model.asMap().get("user"); System.out.println(user); // 设置user对象的username属性 user.setUsername("测试"); return "result1"; }

前台:
(1) loginForm1.jsp

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试Model</title> </head> <body> <h3>测试Model</h3> <form action="login1new" method="post"> <table> <tr> <td><label>登录名: </label></td> <td><input type="text" id="loginname" name="loginname" ></td> </tr> <tr> <td><label>密码: </label></td> <td><input type="password" id="password" name="password" ></td> </tr> <tr> <td><input id="submit" type="submit" value="登录"></td> </tr> </table> </form> </body> </html>

(2) result1.jsp

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试@ModelAttribute(value="")注释返回具体类的方法</title> </head> <body> 访问request作用范围域中的model对象:${requestScope.user.loginname }<br> 访问request作用范围域中的model对象:${requestScope.user.password }<br> 访问request作用范围域中的model对象:${requestScope.user.username }<br> <br> </body> </html>

运行结果:
@ModelAttribute修饰的方法会先于login调用,它把请求参数值赋给对应变量。可以向方法中的Model添加对象,前提是要在方法中加入一个Model类型的参数。
User1Controller.java可以简化为:

@RequestMapping(value="/login1new") public String login(Model model, @ModelAttribute User2 user){ user.setUsername("测试2"); System.out.println(user.toString()); model.addAttribute("user", user); return "result1"; }

2. ModelMap(org.springframework.ui.ModelMap)
Spring框架自动创建modelmap的实例,并作为controller方法的参数传入,用户无需自己创建对象。
ModelMap对象主要用于把controller方法处理的数据传递到jsp界面,在controller方法中把jsp界面需要的数据放到ModelMap对象中即可。它的作用类似request对象的setAttribute方法。通过以下方法向页面传递参数:
在视图层通过request找到ModelMap中的数据。
Modelmap本身不能设置页面跳转的url,可以通过controller方法的返回值来设置跳转的url
例:User2Controller.java

@Controller public class User2Controller{ private static final Log logger = LogFactory.getLog(User2Controller.class); @ModelAttribute public void userMode2(String loginname,String password, ModelMap modelMap){ logger.info("userMode2"); // 创建User对象存储jsp页面传入的参数 User2 user = new User2(); user.setLoginname(loginname); user.setPassword(password); // 将User对象添加到ModelMap当中 modelMap.addAttribute("user", user); } @RequestMapping(value="/login2") public String login2(ModelMap modelMap){ logger.info("login2"); // 从ModelMap当中取出之前存入的名为user的对象 User2 user = (User2) modelMap.get("user"); System.out.println(user); // 设置user对象的username属性 user.setUsername("测试"); return "result2"; }

前台:result2.jsp
<body> 访问request作用范围域中的modelMap对象:${requestScope.user.loginname }<br> 访问request作用范围域中的modelMap对象:${requestScope.user.password }<br> 访问request作用范围域中的modelMap对象:${requestScope.user.username }<br> <br> </body>
运行结果:
3. ModelAndView(org.springframework.web.servlet.ModelAndView)
ModelAndView对象有两个作用:
(1) 设置url地址(这也是ModelAndView和ModelMap的主要区别)。
(2) 把controller方法中处理的数据传到jsp页面,在controller方法中把jsp界面需要的数据放到ModelAndView对象中即可。然后return mv。它的作用类似request对象的setAttribute方法。通过以下方法向页面传递参数:
在界面上可以通过el变量方式${key}来获取ModelAndView中的数据。
可通过以下方法设置视图:
controller方法的返回值如果是ModelAndView,则其即包含模型数据信息,又包含视图信息,这样SpringMVC将使用包含的视图对模型数据进行渲染,可以简单地将模型数据看成一个Map<String, Object>对象。
例:User3Controller.java

@Controller public class User3Controller{ private static final Log logger = LogFactory.getLog(User3Controller.class); @ModelAttribute public void userMode3(String loginname,String password, ModelAndView mv){ logger.info("userMode3"); User2 user = new User2(); user.setLoginname(loginname); user.setPassword(password); // 将User对象添加到ModelAndView的Model当中 mv.addObject("user", user); } @RequestMapping(value="/login3") public ModelAndView login3(ModelAndView mv){ logger.info("login3"); // 从ModelAndView的Model当中取出之前存入的名为user的对象 User2 user = (User2) mv.getModel().get("user"); System.out.println(user); // 设置user对象的username属性 user.setUsername("测试"); // 地址跳转,设置返回的视图名称 mv.setViewName("result3"); return mv; }

前台:result3.jsp
<body> 访问ModelAndView中的数据:${user.loginname}<br> 访问ModelAndView中的数据:${user.password}<br> 访问ModelAndView中的数据:${user.username}<br> </body>
运行结果:
Spring中Model、ModelMap及ModelAndView之间的区别的更多相关文章
- Spring中Model,ModelMap以及ModelAndView之间的区别
原文链接:http://blog.csdn.net/zhangxing52077/article/details/75193948 Spring中Model,ModelMap以及ModelAndVie ...
- Spring中Model、ModelMap及ModelAndView之间的区别+传递参数
org.springframework.ui.Model(接口)传递数据,Spring框架自动创建它的一个实现类,如BindingAwareModelMap org.springframework.u ...
- springMVC Model ModelMap 和 ModelAndView的区别(转)
原文地址:springMVC Model ModelMap 和 ModelAndView的区别 近来在看代码,发现controller里有不同的处理返回数据的方式,而自己一直在用ModelAndVie ...
- Model/ModelMap 和 ModelAndView 的区别使用
Model/ModelMap 和 ModelAndView 的区别使用 Model/ModelMap controller: package springmvc.controller; import ...
- springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 http://www.360doc.com/content/14/03 ...
- Spring中@Autowired注解、@Resource注解的区别 (zz)
Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...
- SpringMVC中Map、Model、ModelMap、ModelAndView之间的关系及区别
首先,在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型(Model),作为模型数据的存储容器, 成为”隐含模型”. 如果controller方法的参数为Moedl ...
- spring学习之springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: ModelAn ...
- SpringMVC Map Model ModelMap 和 ModelAndView
代码: package com.gaussic.controller; import com.gaussic.model.AccountModel; import org.springframewor ...
随机推荐
- find 命令局部小结之 xtime
大家在使用find命令的时候往往会使用它的 -name 或者 -xtime,在这里就说下他的xtime. find / -mtime +7 .find / -mtime -7.find / -mti ...
- 3种自增ID说明
自增ID 1.@@identity 所有会话所有表最后一个自增ID 2.IDENT_CURRENT('表名') 所有会话当前表的自增ID 3.SCOPE_IDENTITY() 当前会话所有表最后一个自 ...
- go实现选择排序
package main import "fmt" func SelectSort(data []int) { length := len(data) for i := 0; i ...
- Asp.Net Core配置Swagger
本文主要参考:Using Swagger with ASP.net Core 1.创建WebApi项目 本文使用ASP.Net Core Web API项目模板演示Swagger到使用,首先创建Web ...
- HTTP协议详解(四)
接着第三篇继续学习.... 9 Cookie和Session的比较 Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. S ...
- vue修改项目名
1.修改config/index.js文件 2.修改Router内容 vue跨域设置
- Git使用教程,最详细,最傻瓜,最浅显,真正手把手教
(预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)一:Git是什么?Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程:Workspace:工作区Index / Stag ...
- Angular Taskmgr 登录
一.登录module 1.先创建domain文件夹,在里面建一个user.model.ts的user领域对象. export interface User{ id?:string; email:str ...
- win下开机不登陆系统自动运行程序的解决方案
文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. Jet的电脑可以定时开机了,但是他希望XP系统启动后在不登陆用户的情况下运行锐捷和 ...
- [python][matlab]使用python调用matlab程序
问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ...