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

结论:

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,详细请参考https://www.cnblogs.com/pu20065226/p/10032048.html中的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 String MapTest1(HttpServletRequest request, @ModelAttribute("aa") String aa,
            Map<String, Object> map, Model model) {
        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");
        // return "../loginSuccess.jsp";
        return "Map2.do";
    }

输出:

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”)注入

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));
        }
    }
}

原文地址:https://www.cnblogs.com/pu20065226/p/10076758.html

时间: 2024-10-10 10:39:40

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

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

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

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

spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明:ModelAndView Java代码 @RequestMapping("/show1") publicModelAndView show1(HttpServletRequest request, HttpServletResponse response) throwsException { ModelA

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

输出模型数据: ModelAndView:处理方法返回值类型为 ModelAndView 时 , 其中包含视图和模型信息.方法体即可通过该对象添加模型数据 , 即 SpringMVC 会把 ModelAndView 中的 model 模型放入到 request 域对象中. Map, Model, ModelMap:目标方法的入参中包含 Map, Model, ModelMap 类型的数据, 返回值是 String 类型,Spring MVC 会自动把 Map, Model, ModelMap转化

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

1.处理模型数据 Spring MVC 提供了以下几种途径输出模型数据: – ModelAndView:处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据 – Map 及 Model.ModelMap: 入参为 org.springframework.ui.Model.org.springframework.ui. ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中. 无论返回值是String类型,还是Mod

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

除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面传值 使用后面3种方式,都是在方法参数中,指定一个该类型的参数.例如: Java代码 @RequestMapping("/test") public String test(Map<String,Object> map,Model model,ModelMap modelMap){ map.put("names", Arrays.asList("c

在SpringMVC中使用@SessionAttributes和@ModelAttribute将数据存储在session域中

今天在我的springMVC项目--图书管理系统中,希望在登录时将登录的Users存在session中,开始是准备在controller中使用Servlet API中的对象,可是一直无法引用,不知道为什么,难道是要导入什么特定的包吗(如果有知道的朋友,可以的话麻烦留言告诉我下,谢谢了),然后看见网上说可以用@SessionAttributes和@ModelAttribute注释来实现,具体实现如下: UserController类: @Controller@SessionAttributes("

springmvc 中model中放入枚举类型

我们直接看例子: Map<String, String> mallMap = new HashMap<String, String>(); mallMap.put(MallStatus.SELFMALL.toString(), MallStatus.SELFMALL.getValue()); mallMap.put(MallStatus.DELEGATIONMALL.toString(), MallStatus.DELEGATIONMALL.getValue()); mallMap

springmvc中model可以封装的数据类型

查看源码可以知道,model中可以存放的数据类型 Model addAttribute(String var1, @Nullable Object var2); Model addAttribute(Object var1); Model addAllAttributes(Collection<?> var1); Model addAllAttributes(Map<String, ?> var1); 引用一下 model是一种概念,而不是一种具体的参数或是其他的具体的体现,MVC

控制器向视图传参ModelAndView、Model和Map

ModelAndView类 ModelAndView在spring-webmvc-4.3.18.RELEASE.jar包下,当然其他版本也有,所在包如下 创建controller,访问地址并传参http://localhost:8080/index?username=yanguobin 通过EL表达式在jsp中获取 Model接口 Model在spring-context-4.3.18.RELEASE.jar包下,当然其他版本也有,是一个接口,所在包如下 可以使用Model对象来完成模型数据的传