结论:

a.注解方法中形参为model,modelmap,map一个或几个时,他们指向的引用对象相同即他们的值相同。

b.当使用@ModelAttribute注解请求参数时,springmvc自动将该参数放入model,modelmap,map中。

c.model,modelmap,map中put,request.setattribute(),b中@ModelAttribute以及modelandveiw.addObj()效果相同,return时都是将参数放request的attribute中。

d.model,modelmap,map,modelandview的生命同期仅存在于当前方法内,forward/return后重新生成新空对象。

e.当使用redirectAttribute.addFlashAttribute重定向时,FlashAttribute会自动注入下一个action内部model,modelmap,map,详细请参考FlashAtrribute详细中的3.2model跟踪。

1.发送请求:http://localhost:8080/project/page/login/ModelTest/Map.do?aa=111&bb=333

  1. @Controller
  2. @RequestMapping("/page/login/ModelTest")
  3. public class ModelTestController {
  4. @RequestMapping(value = "/Map.do")
  5. public String MapTest(HttpServletRequest request, Map<String, Object> map) {
  6. System.out.println("hello");
  7. System.out.println(map);
  8. map.put("step1", "step1");
  9. PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName());//打印
  10. map.put("step2", "step2");
  11. request.setAttribute("step3", "step3");
  12. final HttpSession session = request.getSession();
  13. session.setAttribute("step4", "step4");
  14. // return "../loginSuccess.jsp";
  15. return "Map1.do";
  16.  
  17. }
  18. }

输出:
hello
{}
================com..controller.ModelTestController====================
print  request parameter:
aa==111
bb==333
print  request attribute:

print  session parameter:
step4==step4

结论:map的初始值为空

2.当请求forward到第二个action(Map1.do)中

  1. @RequestMapping(value = "/Map1.do")
  2. public ModelAndView MapTest1(HttpServletRequest request, @ModelAttribute("aa") String aa,
  3. Map<String, Object> map, Model model) {
         ModelAndView mav = new ModelAndView();
  4. System.out.println("welcome to MapTest1");
  5. model.addAttribute("mdbefore", "before");
  6. System.out.println(map);
  7. System.out.println("................");
  8. System.out.println(model.asMap());
  9.  
  10. model.addAttribute("mdafter", "after");
  11.  
  12. System.out.println("hello");
  13. System.out.println(map);
  14. System.out.println("................");
  15. System.out.println(model.asMap());
  16.  
  17. PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName() + "1");
  18.  
  19. mav.addObject("name", "mike");
          mav.setViewName("Map2.do");
          // return "Map2.do";
          return mav;
         //return new ModelAndView("Map2.do","name","mike");//红色部分代码可用这一句代替
    }

输出:

welcome to MapTest1
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before}

................//aa由形参@ModelAttribute(“aa”)注入
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before}
hello
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before, mdafter=after}
................
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before, mdafter=after}
================com.controller.ModelTestController1====================
print  request parameter:
aa==111
bb==333
print  request attribute:

step3==step3 //上一个action中map.put加入
step2==step2
step1==step1 //上一个action中request.setattribute加入

print  session parameter:
step4==step4

结论:

a.注解方法中形参为model,modelmap,map一个或几个时,他们指向的引用对象相同即他们的值相同。

b.当使用@ModelAttribute注解请求参数时,springmvc自动将该参数放入model,modelmap,map中。

3.当请求进入第三个action(Map2.do)时

  1. @RequestMapping(value = "/Map2.do")
  2. public String MapTest2(HttpServletRequest request, Map<String, Object> map, Model model,
  3. ModelMap mm) {
  4. System.out.println("welcome to MapTest2");
  5. model.addAttribute("mdbefore2", "before2");
  6. System.out.println(map);
  7. System.out.println("................");
  8. System.out.println(model.asMap());
  9. System.out.println("................");
  10. System.out.println(mm);
  11. model.addAttribute("mdafter2", "after2");
  12.  
  13. System.out.println("hello");
  14. System.out.println(map);
  15. System.out.println("................");
  16. System.out.println(model.asMap());
  17.  
  18. PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName() + "2");
  19. return "../loginSuccess.jsp";
  20. }

输出结果:

welcome to MapTest2
{mdbefore2=before2}
................
{mdbefore2=before2}
................
{mdbefore2=before2}
hello
{mdbefore2=before2, mdafter2=after2}
................
{mdbefore2=before2, mdafter2=after2}
================com.controller.ModelTestController2====================
print  request parameter:
aa==111
bb==333
print  request attribute:

mdbefore==before//由上一个action中model.addAtrribute加入
step3==step3
step2==step2
step1==step1
mdafter==after//由上一个action中model.addAtrribute加入
aa==111 //aa由上一个action形参@ModelAttribute(“aa”)注入

name=mike// name由上一个action中modelAndView.addObject()加入

print  session parameter:
step4==step4

结论:

c.model,modelmap,map中put,request.setattribute(),b中@ModelAttribute以及modelandveiw.addObj()效果相同(可以自己测试),return时都是将参数放request的attribute中。

d.model,modelmap,map,modelandview的生命同期仅存在于当前方法内,forward/return后重新生成新空对象

打印方法代码

  1. public class PrintRequestInfo {
  2. public static void printSessionAndRequest(HttpServletRequest request, String remark) {
  3. System.out.println("================" + remark + "====================");
  4. System.out.println("print request parameter:");
  5. final Enumeration reqEnum = request.getParameterNames();
  6. while (reqEnum.hasMoreElements()) {
  7. final String s = (String) reqEnum.nextElement();
  8. System.out.println(s + "==" + request.getParameter(s));
  9. }
  10.  
  11. System.out.println("print request attribute:");
  12. final Enumeration reqAttrs = request.getAttributeNames();
  13. while (reqAttrs.hasMoreElements()) {
  14. final String s = (String) reqAttrs.nextElement();
  15. System.out.println(s + "==" + request.getAttribute(s));
  16. }
  17.  
  18. System.out.println("print session parameter:");
  19. final HttpSession session = request.getSession();
  20. final Enumeration se = session.getAttributeNames();
  21. while (se.hasMoreElements()) {
  22. final String key = (String) se.nextElement();
  23. System.out.println(key + "==" + session.getAttribute(key));
  24. }
  25. }
  26. }

4.jsp页面

  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  7. <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  9. <html>
  10. <head>
  11. <base href="<%=basePath%>">
  12.  
  13. <title>My JSP 'login.jsp' starting page</title>
  14.  
  15. </head>
  16.  
  17. <body>
  18. This is webSuc JSP page. <br>
  19. ${name}<br>
  20. ${aa}<br>
  21. <c:out value="Hello World"></c:out>
  22. ${param.name}<br>
  23. <%=request.getAttribute("name") %><br>
  24. ${aa}
  25.  
  26. </body>
  27. </html>

jsp页面结果:

  1. This is webSuc JSP page.
  2. mike
  3. 111
  4. Hello World
  5.  
  6. mike
  7. 111

springMVC数据模型model,modelmap,map,@ModelAttribute的相互关系的更多相关文章

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

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

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

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

  3. SpringMVC学习 -- ModelAndView , Model , ModelMap , Map 及 @SessionAttributes 的使用

    输出模型数据: ModelAndView:处理方法返回值类型为 ModelAndView 时 , 其中包含视图和模型信息.方法体即可通过该对象添加模型数据 , 即 SpringMVC 会把 Model ...

  4. SpringMVC的Model ModeMap ModelAndView @ModelAttribute @SessionAttribute区分

    Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute.@SessionAttributes以及Model的使用介绍 ...

  5. SpringMVC(二)--处理数据模型、ModelAndView、Model、Map、重定向、@ModelAttribute、

    1.处理模型数据 Spring MVC 提供了以下几种途径输出模型数据:      – ModelAndView:处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据 ...

  6. SpringMVC Map Model ModelMap 和 ModelAndView

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

  7. SpringMVC 向页面传值-Map、Model和ModelMap

    除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面传值 使用后面3种方式,都是在方法参数中,指定一个该类型的参数.例如: Java代码 @Request ...

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

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

  9. ModelAndView存取数Model、Map、ModelMap

    1.从名字上看ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用.(对应mvc配置,寻找模型,返回视图.) 2.业务处理器调用模型层处理完用户请求后,把 ...

随机推荐

  1. 关于Zookeeper选举机制

    zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服 ...

  2. Reg2Bat_By Slore(生成同名bat文件,支持XP WIN7 WIN7X64).vbs

    原文http://slore.blogbus.com/logs/52627038.htmlSlore编写的这个reg文件转换为bat文件,是逐句转换的,不是通过批处理生成临时reg文件然后导入的方法, ...

  3. Java HashMap的死循环 以及 LRUCache的正确实现

    今天RP爆发,16核服务器load飙到30多,cpu使用情况全部99%以上. 从jstack中分析发现全部线程都堵在map.transfer处,如下: "pool-10-thread-23& ...

  4. 高CPU排查方法分享

    1 软件性能较差,占用CPU较多,往往是由于某段代码逻辑算法不佳导致,那如何在数以千计的函数中找到问题函数呢?2 在使用!runaway命令比较不同时间各线程占用CPU时间,找到CPU时间增涨较多的线 ...

  5. Java 基础面试题

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名一致 2.Java有没有 ...

  6. Zipkin和Brave实现http服务调用的跟踪

    使用Zipkin和Brave实现http服务调用的跟踪,Brave 是用来装备Java程序的类库,提供了面向标准Servlet.Spring MVC.Http Client.JAX RS.Jersey ...

  7. SCCM 2012 R2实战系列之二:前提工作准备

    在上一篇中,我们完成了SQL Server 2012的安装和配置.现在跟大家分享SCCM安装前的准备工作. 2.1 SCCM 2012 R2 准备工作 2.1.1 创建并分配System Manage ...

  8. IDEA非sbt下spark开发

    创建非sbt的scala项目 引入spark的jar包 File->Project Structure->Libararies引用spark-assembly-1.5.2-hadoop2. ...

  9. 不曾忘记的Vue.js

    马上2017年就结束了,虽然我因为目前的项目用不上你vue,但是我不曾忘记你,在时间缝隙的某一刹那,我再次将你拾起. vue.js全家桶:vue+ vuex+axios+vue-router+webp ...

  10. Hadoop 2.x常用端口及查看方法

    Hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以及HTTP访问.而随着Hadoop周边组件的增多,完全记不住哪个端口对应哪个应用,特收集记录如 ...