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 ...
随机推荐
- “Excel-建议不可用于您所选择的数据”错误提示
Excel作为一项的数据图表绘制软件,在工作中经常用到.“建议不可用于您所选择的数据这一错误提示,我也遇到了几次了,但是每次遇到总是忘了上次是什么原因.这次,写下博客记录.一般都是在复制网页或者其他数 ...
- Python爬虫基础之正则表达式
一.Python正则表达式的基本使用 Python 3 使用re模块可以实现大部分的正则表达式情况. 1.re.compile(pattern, flags=0) re.compile构建匹配规则并返 ...
- 跨域资源共享(CORS)
同源策略 同源策略是浏览器的一个安全策略,只允许当前页面或当前域下发送请求,如果向其他域发送请求,会被浏览器拦截 同源的意思:协议.IP地址.端口三者一致,浏览器才会认为是同一个域,三者中有一个不一致 ...
- 如果没有<form>标签,也没有enctype="multipart/form-data"属性,怎么使用formData对象提交表单呢?如下方式
form标签的enctype属性 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 默认地,表单数据会编码为 "application/x-www-form-urlen ...
- C++简单交换堆排序的代码
下面的内容内容是关于C++简单交换堆排序的内容,应该对各位朋友有较大用途. { int start, end; { }} { int root, child; { if((child + 1 < ...
- 关于父窗口获取跨域iframe子窗口中的元素
这几天在项目中遇到,一个难点, 就是需要异步加载一个pdf插件, 同时又需要获取这个插件中的点击事件来生成用户的下载记录. 刚开始也是想了很多方法,网上搜的 格式1:$("#iframe的I ...
- memcpy一种实现方法
#include<stdio.h> #include<stdlib.h> void* memncpy(void* dest, const void* src, int coun ...
- 使用Postman测试https接口时的小问题记录
测试本地的WebApi接口时,接口是https,自己写的用httpclient测试是可以的, 用postman一直连接不了.原因正是由于https,不过postman在界面上已经给出了可能的原因和解决 ...
- Node.js 操作 OSX 系统麦克风、扬声器音量
最近几年 Electron 很火,公司也正好有个项目想做跨平台客户端,大家研究了一下就选择了 Electron,第一次做 js 的项目遇到了不少坑,不过也都一点点解决了. 因为项目中需要对用户录音,H ...
- sql server按月份,按项目号展开表格
原始数据: 01 RD21 6495.411402 RD21 87.43604 RD21 101.718405 RD21 1.538401 RD25 7803.303709 RD25 106.8375 ...