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之间的区别的更多相关文章

  1. Spring中Model,ModelMap以及ModelAndView之间的区别

    原文链接:http://blog.csdn.net/zhangxing52077/article/details/75193948 Spring中Model,ModelMap以及ModelAndVie ...

  2. Spring中Model、ModelMap及ModelAndView之间的区别+传递参数

    org.springframework.ui.Model(接口)传递数据,Spring框架自动创建它的一个实现类,如BindingAwareModelMap org.springframework.u ...

  3. springMVC Model ModelMap 和 ModelAndView的区别(转)

    原文地址:springMVC Model ModelMap 和 ModelAndView的区别 近来在看代码,发现controller里有不同的处理返回数据的方式,而自己一直在用ModelAndVie ...

  4. Model/ModelMap 和 ModelAndView 的区别使用

    Model/ModelMap 和 ModelAndView 的区别使用 Model/ModelMap controller: package springmvc.controller; import ...

  5. springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

    springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 http://www.360doc.com/content/14/03 ...

  6. Spring中@Autowired注解、@Resource注解的区别 (zz)

    Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...

  7. SpringMVC中Map、Model、ModelMap、ModelAndView之间的关系及区别

    首先,在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型(Model),作为模型数据的存储容器, 成为”隐含模型”. 如果controller方法的参数为Moedl ...

  8. spring学习之springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

    spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: ModelAn ...

  9. SpringMVC Map Model ModelMap 和 ModelAndView

    代码: package com.gaussic.controller; import com.gaussic.model.AccountModel; import org.springframewor ...

随机推荐

  1. flask蓝图的简单使用

    1.flask的简单使用 from flask import Flask # from flask import make_response app = Flask(__name__) app.con ...

  2. Apollo与ROS

    Apollo项目基于ROS,但是对其进行了改造,主要包括下面三个方面: 通信性能优化 去中心化网络拓扑 数据兼容性扩展 通信性能优化 自动驾驶车辆中包含了大量的传感器,这些传感器可能以非常高频的速度产 ...

  3. Rest API

    一.前言 在软件行业快速发展的今天,传统的软件授权已经不能足以满足一个IT类的公司的发展.虽然在大部分公司里,它还是现金池的直接源头.但是在可遇见的未来,受摩尔根理论的失效.物联网的发展等影响,应用的 ...

  4. C++入门篇六

    struct和class的访问权限:结构体,类 struct和class 是相同的,唯一的而不同,就是默认权限,struct是public,class默认是private class Animal { ...

  5. nginx配置文件,做多个项目代理

    web01: server { listen 9988; server_name www.oldboy.com; access_log logs/www.oldboy.com_access.log m ...

  6. adi i2s 提供的axi_lite接口说明

    总共定义了4个寄存器,位宽32位,也就是 偏移地址*4以下是PS写数据when 0 => I2S_RESET_REG <= wr_data; when 1 => I2S_CONTRO ...

  7. Linux下创建共享文件夹

    1,查看ip 地址 ifconifg: 2,查看是否安装samba服务器,rpm -qa | grep samba: 3,如果有该服务器,启动 service smb start,否则进行安装 yum ...

  8. Linux基础-命令(续)

    touch  命令: 如果文件不存在,创建文件,  如果文件存在,则修改文件最后修改时间. mkdir  命令: -p  递归创建目录,如,mkdir  -p  a/b/c/d Linux 中同一目录 ...

  9. Java使用线程池

    多线程主函数 package UnitTest; import java.util.ArrayList; import java.util.List; import java.util.concurr ...

  10. C#处理JavaScript引擎

    概述 通常JavaScript在Web浏览器执行展现特定效果,C#也可以后台执行JavaScript里面方法:C#通常调用第三方DLL方式:MsieJavaScriptEngine或者JavaScri ...