JiuyeXD's Blog
九叶
九叶博主

越努力 越幸运

登录
夜间

SpringMVC 数据回显(域)

基本介绍

数据回显:模型数据导向视图(模型数据 —> Controller —> 视图) 说明:SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器(隐含模型)

一、ModelAndView

@RequestMapping(value = "mv")
    public ModelAndView mv(){
        Map <String,Date> model = new HashMap<String,Date>();
        model.put("Date",new Date());
        ModelAndView mv = new ModelAndView("Today",model);
        return mv;
    }

二、@ModelAttribute

  1. 如果是用在方法的入参上
@RequestMapping(value = "product", method = RequestMethod.POST)
    public String product(@ModelAttribute("product") Product product){
        System.out.println(product);
        return "index";
    }

处理机制如下:

A.将HTTP请求参数绑定到Product对象中 B.以product为键,将Product对象放到数据模型中 —>相当于map.put(“product”, product);

  1. 如果是定义在方法之上
    @ModelAttribute("product")
    public Product getProduct() {
        Product product = new Product();
        product.setPid(1);
        return product;
    }

    @RequestMapping(value = "product", method = RequestMethod.POST)
    public String product(@ModelAttribute("product") Product product){
        System.out.println(product);
        return "index";
    }

处理机制如下:

  • 调用目标方法前,扫描控制器中所有方法上包含@ModelAttribute的方法,并将方法的返回值放到模型数据中 (类似于上述的第二步)
  • 执行指定的方法,如果入参有@ModelAttribute,则将(1)中放置于模型数据中的对象赋值给入参的绑定对象
  • 根据HTTP请求继续对绑定对象进行填充和覆盖,得到一个整合版的对象,覆盖模型数据中的原对象

三、Map Model(org.springframework.ui.Model和java.util.Map)

SpringMVC一旦发现处理方法有Map或Model类型的入参,就会将隐含模型中对象的引用传给这些入参

    @RequestMapping(value = "modelMap")
    public String modelMapDemo(Product product, ModelMap modelMap){
        modelMap.addAttribute("productModelMap",product);
        return "index";
    }

四、SessionAttributes(SpringMVC会将模型中对应的属性暂存到HttpSession中,他是写在类上面的,并且属性名和model中的一致

@Controller //标注这个Class是一个控制器
@SessionAttributes("productModel")
public class ProductController{

    @RequestMapping(value = "session")
    public String modelDemo (Product product, Model model){
        model.addAttribute("productModel",product);
        return "index";
    }
}

SpringMVC 的数据流图总结

1.HTTP请求报文到达服务器,服务器将其封装成HTTPServletRequest对象

2.SpringMVC框架截获这个HTTPServletRequest对象

3.SpringMVC 创建一个隐含模型对象,作为处理本次请求的上下文数据存放处

4.SpringMVC 将一个HTTPServletRequest对象数据绑定到处理方法的入参对象中(表单/命令对象)

5.将绑定错误信息、校验错误信息都保存到隐含模型中

6.本次请求的对象模型数据放到HTTPServletRequest的属性列表中,暴露给视图对象

7.视图对象对已经放在HTTPServletRequest属性列表的模型数据进行渲染

8.把渲染后的HTTP响应报文发送给客户端

THE END