@ModelAttribute详解

1.SpringMVC处理模型数据  : 主要解决如何把模型数据放到域对象中  
但是对于开发者需要掌握:如何把数据放入到模型对象(ImplictModel)中进而供视图页面展示使用
​把握一个基本点一次请求会产生一个隐式模型容器(ImplictModel),隐含模型中的所有数据最终将通过HttpServletRequest的属性列表暴露给JSP
视图对象
当前端请求过来后,需要从两个方面入手:
①、前端请求参数的解析,以及如何传入处理器方法的入参
②、处理器内部产生的模型数据如何传递到前端页面

2.Spring提供了4种途径处理输出模型数据
①ModelAndView : 当处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据(key-value类型 ------>这个就是模型数据),在前端页面可用el表达式通过key 取出数据,也可以从request中取数据,源码会将数据放到请求域中。
②Map及Model、ModelMap:源码还是会放到请求域中  --------->Spring MVC在调用方法前会创建一个ImplictModel(隐式模型)作为模型数据的存储容器,方法入参为Map之类,会将隐式模型的引用
传递给这些入参。
③@SessionAttributes:将模型中的某个属性暂存到HttpSession中
④@ModelAttribute:需要详解
3.@ModelAttribute开始详解:
@ModelAttribute最主要的作用是将数据添加到模型对象中,用于视图页面展示时使用。
@ModelAttribute等价于 model.addAttribute("attributeName", abc); 但是根据@ModelAttribute注释的位置不同,和其他注解组合使用,致使含义有所不同。
1.@ModelAttribute 注释方法  ------>调用 @ModelAttribute 注解修饰的方法. 实际上把 @ModelAttribute 方法中 Map 中的数据放在了 implicitModel .
@ModelAttribute注释void返回值的方法
被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
 @Controller 
 public class HelloWorldController { 
      @ModelAttribute 
      public void populateModel(@RequestParam String abc, Model model) { 
           model.addAttribute("attributeName", abc); 
        } 
  
      @RequestMapping(value = "/helloWorld") 
      public String helloWorld() { 
        return "helloWorld"; 
         } 
  }
这个例子,在获得请求/helloWorld 后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)加入到一个名为attributeName的model属性中,在它执行后 helloWorld被调用。在注释方法内部完成  model.addAttribute("attributeName", abc);
@ModelAttribute注释返回具体类的方法
@ModelAttribute 
public Account addAccount(@RequestParam String number) { 
     return accountManager.findAccount(number); 
}
这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回Account类型,那么这个model属性的名称是account。这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。它无须要特定的参数。 隐式完成 model.addAttribute("account",accountManager.findAccount(number))
③@ModelAttribute(value="")注释返回具体值的方法
@Controller 
public class HelloWorldController { 
      @ModelAttribute("attributeName") 
      public String addAccount(@RequestParam String abc) { 
     return abc; 
} 
这个例子中使用@ModelAttribute注释的value属性,来指定model属性的名称。model属性对象就是方法的返回值。它无须要特定的参数。
隐式完成 model.addAttribute("attributeName",abc(变量的值))
@ModelAttribute和@RequestMapping同时注释一个方法
@Controller 
public class HelloWorldController { 
     @RequestMapping(value = "/helloWorld.do") 
     @ModelAttribute("attributeName") 
     public String helloWorld() { 
          return "hi"; 
       } 
}
这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/helloWorld.do"转换为逻辑视图helloWorld。
隐式完成 model.addAttribute("attributeName","hi")
2.@ModelAttribute 注释方法入参
从这里就需要考虑之前一个问题:前端请求参数的解析,如何传入处理器方法的入参,
SpringMVC 确定目标方法 POJO 类型入参(这个就囊括了常规的需求)






posted @ 2020-12-09 19:24  大洋游侠1  阅读(2224)  评论(0编辑  收藏  举报