zoukankan      html  css  js  c++  java
  • Model ModelMap ModelAndView

    前言

    1. Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
    2. 如果方法的入参为ModelMap,Model,Map类型,Spring MVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所以数据,也可以向模型中添加新的属性数据。

    三种方式处理模型数据

    1. Map.put(string,object);
    2. Model.AddAttribute(string,object);
    3. ModelMap.AddAttribute(string,object);

    注·:以上三种方式向前端传值,不能加@responsebody注解

    Model(org.springframework.ui.Model)

    Model是一个接口,包含addAttribute方法。

    一个控制器可以拥有多个@ModelAttribute方法。同个控制器内的所有这些方法,都会在@RequestMapping方法之前被调用。
    @ModelAttribute标记的方法会先执行,然后把它们返回的对象存放到模型中。
    
        //@ModelAttribute修饰的方法:当/login请求时,会先于/login调用,该方法用于接收前台jsp页面传入的参数
        @ModelAttribute("user1")
        public void userModel(String name,String password,Model model){
            // 创建User对象存储jsp页面传入的参数
            User user = new User();
            user.setName(name);
            user.setPassword(password);
    
            // 将User对象添加到Model当中
            model.addAttribute("user2", user);
    
            return new User("ld",12) ;
        }
    
        @RequestMapping(value="/login")
         public String login(Model model){
            // 从Model当中取出之前存入的名为user的对象
            User user2 = (User) model.asMap().get("user2");
            return "result";
        }
    
         也可以:
         @RequestMapping(value = "/login") 
         public String login(@ModelAttribute("user1") User user1) { 
                user1.setUserName("jizhou"); 
                return "result"; 
         } 
    

    ModelMap(org.springframework.ui.ModelMap)

    Mode还是ModelMap底层都是使用BindingAwareModelMap,所以两者基本没什么区别
    
    Spring框架自动创建modelmap的实例,并作为controller方法的参数传入,用户无需自己创建对象。
    
    ModelMap对象主要用于把controller方法处理的数据传递到jsp界面,在controller方法中把jsp界面需要的数据放到ModelMap对象中即可。
    

    ModelAndView(org.springframework.web.servlet.ModelAndView)

    ModelAndView对象有两个作用:

    1. 设置url地址(这也是ModelAndView和ModelMap的主要区别)。

    2. 把controller方法中处理的数据传到jsp页面,在controller方法中把jsp界面需要的数据放到ModelAndView对象中即可。

      Model是每次请求可以自动创建的,而ModelAndView是需要自行new
      在界面上可以通过el表达式${key}来获取Model中的数据。

    controller方法的返回值如果是ModelAndView,则其即包含模型数据信息,又包含视图信息,这样SpringMVC将使用包含的视图对模型数据进行渲染,可以简单地将模型数据看成一个Map<String, Object>对象。

        @RequestMapping("/list")
        public ModelAndView list() {
             //创建一个模型视图对象
            ModelAndView mav = new ModelAndView();
            List<Category> cs = categoryService.list();
            mav.addObject("cs", cs);
            mav.setViewName("admin/listCategory");
            return mav;
        }
    

    @SessionAttributes

    @SessionAttributes用于在会话中存储Model的属性,一般作用在类的级别。
    @SessionAttributes(value={"user"})将model中属性名为user的数据copy一份进了session域中。
    
    
    model的属性user1会被存储到session中
    
    @Controller
    @SessionAttributes(value={"user1","attr2"})
    public class ModelController {
    
        @ModelAttribute("user1")
        public User initUser(){
            User user1 = new User();
            user1.setName("default");
            return use1r;
        }
    }
    
    
    @SessionAttribute是用于获取已经存储的session数据,并且作用在方法的层面上。
    
    @RequestMapping("/user")
    public String session(@SessionAttribute("user1") User user1){
    	// do something
    	return "success";
    }
    
    
    @SessionAttributes(types=User.class)
    	会将model中所有类型为 User 的属性添加到会话中。
    
    @SessionAttributes(value={"user1", "user2"})
    	会将model中属性名为user1和user2的属性添加到会话中。
    
    @SessionAttributes(types={User.class, Dept.class})
    	会将model中所有类型为 User 和 Dept 的属性添加到会话中。
    
    @SessionAttributes(value={"user1", "user2"},types={Dept.class})
    	会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。
    
  • 相关阅读:
    CF 118E Bertown roads 桥
    hdu 3917 Road constructions 最大权闭合子图
    hdu 4714 Tree2cycle 树形经典问题
    POJ 2516 Minimum Cost 最小费用流
    POJ 3921 Destroying the bus stations 沿着最短路迭代加深搜索
    POJ 3422 Kaka's Matrix Travels K取方格数
    BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增
    hdu 4010 Query on The Trees LCT
    poj 2455 Secret Milking Machine 二分+最大流 sap
    定制标记---简单标记处理器
  • 原文地址:https://www.cnblogs.com/loveer/p/11358815.html
Copyright © 2011-2022 走看看