zoukankan      html  css  js  c++  java
  • 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,详细请参考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
  • 相关阅读:
    Spring基础知识
    Hibernate基础知识
    Struts2基础知识
    在eclipse里头用checkstyle检查项目出现 File contains tab characters (this is the first instance)原因
    java后台获取cookie里面值得方法
    ckplayer 中的style.swf 中的 style.xml 中的修改方法
    java hql case when 的用法
    Windows下Mongodb安装及配置
    Mongodb中经常出现的错误(汇总)child process failed, exited with error number
    Mac 安装mongodb
  • 原文地址:https://www.cnblogs.com/pu20065226/p/10076758.html
Copyright © 2011-2022 走看看