数据回显:模型数据导向视图(模型数据——→控制器——→视图)
说明:SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器(隐含模型)
@RequestMapping(方法=RequestMethod.POST) 公共ModelAndView createUser(用户用户) { userService.createUser(用户); ModelAndView飞行器=new ModelAndView (); mav.setViewName(“用户/createSuccess”); 飞行器。addObject(“用户”,用户); 返回飞行器; }
1,如果是用在方法的入参上
@RequestMapping (value=" https://www.yisu.com/handle1 ") 公共字符串handle1 (@ModelAttribute(“用户”)用户用户) { user.setUserId (“1000”); 返回“/user/createSuccess”; }
处理机制如下:
。将HTTP请求参数绑定到用户对象中
B。以用户为键,将用户对象放到数据模型中——→相当于地图。(“用户”,用户),
2,如果是定义在方法之上
@ModelAttribute(“用户”) 公共用户getUser () { 用户用户=新用户(); user.setUserId (“1001”); 返回用户; } @RequestMapping (value=" https://www.yisu.com/handle2 ") 公共字符串handle2 (@ModelAttribute(“用户”)用户用户) { user.setUserName(“汤姆”); 返回“/user/showUser”; } >之前处理机制如下:
<李>调用目标方法前,扫描控制器中所有方法上包含@ModelAttribute的方法,并将方法的返回值放到模型数据中(类似于上述的第二步)李> <李>执行指定的方法,如果入参有@ModelAttribute,则将(1)中放置于模型数据中的对象赋值给入参的绑定对象李> <李>根据HTTP请求继续对绑定对象进行填充和覆盖,得到一个整合版的对象,覆盖模型数据中的原对象李>
SpringMVC一旦发现处理方法有图或模型类型的入参,就会将隐含模型中对象的引用传给这些入参
@RequestMapping (value=" https://www.yisu.com/handle3 ") 公共字符串handle3 (ModelMap ModelMap) { modelMap.addAttribute (“testAttr”、“value1”); 用户用户=(用户)modelMap.get(“用户”); user.setUserName(“汤姆”); 返回“/user/showUser”; }
@ controller @RequestMapping(“/用户”) @SessionAttributes(“用户”)//①将②处的模型属性自动保存到HttpSession中 公开课用户控件 { @RequestMapping (value=" https://www.yisu.com/handle4 ") 公共字符串handle4 (@ModelAttribute(“用户”)用户用户)//② { user.setUserName(“约翰”); 返回“用户重定向://handle5.html”; } @RequestMapping (value=" https://www.yisu.com/handle5 ") 公共字符串handle5 (ModelMapmodelMap SessionStatussessionStatus) { 用户用户=(用户)modelMap.get(“用户”);//③读取模型中的数据 如果(用户!=null) { user.setUserName(“码头”); sessionStatus.setComplete ();//④让Spring MVC清除本处理器对应的会话属性 } 返回“/user/showUser”; } } >之前上面在向handle4发送请求时,抛异常,因为@ModelAttribute和@SessionAttributes的处理遵循一个流程:
1, SpringMVC在调用处理方法前,在请求线程中自动创建一个隐含的模型对象
2,调用所有方法上标注了@ModelAttribute的方法,并将返回值添加到隐含模型对象中
3,查看会话中是否存在@SessionAttributes (“XXX”)所指定的XXX属性,如果有,将其添加到隐含对象中,此时若隐含对象已经存在了XXX属性,则会覆盖掉
4,对于入参标注了@ModelAttribute (XXX)的方法,处理流程如下:
(1)如果隐含模型中拥有了XXX属性,将其赋值给入参,再将请求消息填充该对象,然后返回;如果隐含模型中不存在XXX,则执行(2)
(2)如果XXX是会话属性,则尝试从从会话中取出该属性,将其复制给入参再将请求消息填充该对象。如果会话对象中找不到XXX属性,则抛出HttpSessionRequiredException异常,如果隐含模型和会话中均不在XXX,则执行(3)
详解SpringMVC如何进行数据回显