• 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
  • 相关阅读:
    图片完全填充CardView区域
    调用系统相机拍照并展示
    Android开发之加载GIF图片
    使用SatelliteMenu创建动画菜单
    swift中简单KVC和KVO的使用
    swift GCD的简单使用
    swift协议的使用方法和注意事项
    swift找window,导航栏的简单使用,Controller通过闭包传值简单示例
    swift中闭包的使用
    swift中UIButton的使用
  • 原文地址:https://www.cnblogs.com/pu20065226/p/10076758.html
Copyright © 2020-2023  润新知