结论:

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

@Controller
@RequestMapping("/page/login/ModelTest")
public class ModelTestController {
@RequestMapping(value = "/Map.do")
public String MapTest(HttpServletRequest request, Map<String, Object> map) {
System.out.println("hello");
System.out.println(map);
map.put("step1", "step1");
PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName());//打印
map.put("step2", "step2");
request.setAttribute("step3", "step3");
final HttpSession session = request.getSession();
session.setAttribute("step4", "step4");
// return "../loginSuccess.jsp";
return "Map1.do"; }
}

输出:
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)中

@RequestMapping(value = "/Map1.do")
public ModelAndView MapTest1(HttpServletRequest request, @ModelAttribute("aa") String aa,
Map<String, Object> map, Model model) {
     ModelAndView mav = new ModelAndView();
System.out.println("welcome to MapTest1");
model.addAttribute("mdbefore", "before");
System.out.println(map);
System.out.println("................");
System.out.println(model.asMap()); model.addAttribute("mdafter", "after"); System.out.println("hello");
System.out.println(map);
System.out.println("................");
System.out.println(model.asMap()); PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName() + "1"); 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)时

@RequestMapping(value = "/Map2.do")
public String MapTest2(HttpServletRequest request, Map<String, Object> map, Model model,
ModelMap mm) {
System.out.println("welcome to MapTest2");
model.addAttribute("mdbefore2", "before2");
System.out.println(map);
System.out.println("................");
System.out.println(model.asMap());
System.out.println("................");
System.out.println(mm);
model.addAttribute("mdafter2", "after2"); System.out.println("hello");
System.out.println(map);
System.out.println("................");
System.out.println(model.asMap()); PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName() + "2");
return "../loginSuccess.jsp";
}

输出结果:

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后重新生成新空对象

打印方法代码

public class PrintRequestInfo {
public static void printSessionAndRequest(HttpServletRequest request, String remark) {
System.out.println("================" + remark + "====================");
System.out.println("print request parameter:");
final Enumeration reqEnum = request.getParameterNames();
while (reqEnum.hasMoreElements()) {
final String s = (String) reqEnum.nextElement();
System.out.println(s + "==" + request.getParameter(s));
} System.out.println("print request attribute:");
final Enumeration reqAttrs = request.getAttributeNames();
while (reqAttrs.hasMoreElements()) {
final String s = (String) reqAttrs.nextElement();
System.out.println(s + "==" + request.getAttribute(s));
} System.out.println("print session parameter:");
final HttpSession session = request.getSession();
final Enumeration se = session.getAttributeNames();
while (se.hasMoreElements()) {
final String key = (String) se.nextElement();
System.out.println(key + "==" + session.getAttribute(key));
}
}
}

4.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'login.jsp' starting page</title> </head> <body>
This is webSuc JSP page. <br>
${name}<br>
${aa}<br>
<c:out value="Hello World"></c:out>
${param.name}<br>
<%=request.getAttribute("name") %><br>
${aa} </body>
</html>

jsp页面结果:

This is webSuc JSP page.
mike
111
Hello World mike
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. mybatis传入List实现批量更新

    如果要在一个update里面执行多条更新语句,只需要在jdbc:url后面跟上allowMultiQueries=true的参数,比如: jdbc:mysql://127.0.0.1:3306/tes ...

  2. webstorm 破解码

    https://blog.csdn.net/voke_/article/details/76418116 摘自此博客

  3. 修改String中的内容

    例子:有一个字符串"abcdef",现在想让字符串中的字符各自加1,求修改后的字符 String 在Java中是不可修改的. 方法1:将String 变为字符数组,通过修改字符数组 ...

  4. windows server 2008 R2 安装

    微软服务器操作系统大致有: server 2000(简称2K),还有server 2003(2K3),server 2008(2K8),server 2000和2003是基于NT内核的,而2008是基 ...

  5. [UE4]UMG编辑器:中心点对齐

  6. 凭什么说AMQP比JMS优秀啊?JMS才是真正实现了一个客户端调用多种产品的消息中间件啊

    一.AMQP 历史​ 消息队列(Message Queue)起源于一位来自 MIT 的硬件设计教育工作者 Vivek Ranadivé 设想了一种通用软件总线,就像主板上的总线那样,供其他应用程序接入 ...

  7. angular4+中的数据绑定

    1,基本的属性绑定,下面的两种形式是一样的 2.dom属性和html属性 3.两者关系的进一步总结 4.dom属性绑定 5.html属性绑定

  8. zabbix_agentd.conf配置文件详解

    Alias key的别名,例如 Alias=ttlsa.userid:vfs.file.regexp[/etc/passwd,^ttlsa:.:([0-9]+),,,,\1], 或者ttlsa的用户I ...

  9. MySql 索引优化实例

    查询语句 SELECT customer_id,title,content FROM `product_comment` WHERE audit_status=1 AND product_id=199 ...

  10. ORACLE 通过连接查询更新 update select

    注意:  关键的地方是where 语句的加入. 在11G中, 如果不加11G , 或造成除匹配的行数更新为相应的值之后, 其余的会变成负数. 所以,执行前需要测试, 普通办法就是:  先查看需要更新的 ...