springmvc处理模型数据
很多情况下页面上需要很多数据,单单返回页面是不行的,那么springmvc如何将数据返回到该页面呢
springmvc提供了四种方式来输出模型数据
- ModelAndView: 处理返回值为ModelAndView时,可以将该对象中添加数据模型
- Map及Model:入参为Model、ModelMap或Map时,处理方法返回时,Map中的数据会自动添加到模型中
- @SessionAttributes: 将模型中的某个属性暂存到HttpSession中,以便多个请求之间共享数据
- @ModelAttribute: 方法入参标注该注解后,入参的对象就会放到数据模型中
使用BindingResult和Errors来处理绑定错误
ModelAndView
主要有两个重要的变量
1 2 3 4
| private Object view;
private ModelMap model;
|
视图相关的方法
1 2 3 4 5 6 7 8
| public void setViewName(String viewName) { this.view = viewName; }
public String getViewName() { return this.view instanceof String ? (String)this.view : null; }
|
数据模型相关方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| protected Map<String, Object> getModelInternal() { return this.model; }
public ModelMap getModelMap() { if (this.model == null) { this.model = new ModelMap(); }
return this.model; }
public Map<String, Object> getModel() { return this.getModelMap(); }
public ModelAndView addObject(String attributeName, Object attributeValue) { this.getModelMap().addAttribute(attributeName, attributeValue); return this; }
|
springmvc底层使用request.setAttribute(name,value)来将数据放入到请求中
示例:
1 2 3 4 5 6 7 8
| @RequestMapping("/modelAndViewTest") public ModelAndView modelAndViewTest(){ ModelAndView modelAndView = new ModelAndView("modelAndViewTest"); modelAndView.addObject("dateTime",new Date()); return modelAndView; }
|
Map及Model
1 2 3 4 5 6
| @RequestMapping("/mapTest") public String mapTest(Map<String,String> map){ System.out.println(map.getClass()); map.put("name","张三"); return "hello"; }
|
@SessionAttributes
在类上添加@SessionAttributes可以使该类所代表的路径下的session共享
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Controller @RequestMapping("helloWorld")
@SessionAttributes(value={"name"}) public class HelloWorldController {
@RequestMapping("/mapTest") public String mapTest(Map<String,String> map){ System.out.println(map.getClass()); map.put("name","张三"); return "hello"; }
@RequestMapping("/sessionAttributes") public String sessionAttributes(HttpSession session){ System.out.println(session.getAttribute("name")); return "hello"; } }
|
@ModelAttribute
可以放到方法上或者参数上,它将方法参数或方法返回值绑定到命名中的Model属性中,然后将其公开给Web视图。如果我们在方法级别使用它,则表明该方法的目的是添加一个或多个模型属性。另一方面,当用作方法参数时,它表示应从模型中检索参数。如果不存在,我们应该首先实例化它,然后将其添加到Model中。一旦出现在模型中,我们应该填充所有具有匹配名称的请求参数的参数字段
BindingResult和Errors
用来处理绑定过程中的错误,使用@Vaild注解标注在方法参数上,会对参数对象进行校验,校验结果放在BindingResult对象中