Spring中Model、ModelMap、ModelAndView ModelAttribute理解和具体使用总结
SpringMVC在调用方法前会创建一个隐含的数据模型,作为模型数据的存储容器, 成为”隐含模型”。
也就是说在每一次的前后台请求的时候会随带这一个背包,不管你用没有,这个背包确实是存在的,用来盛放我们请求交互传递的值
Model
是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。
public class ExtendedModelMap extends ModelMap implements Model
ModelMap
public class ModelMap extends LinkedHashMap<String, Object>
ModelMap对象主要用于传递控制方法处理数据到结果页面
jsp表单提交
<form action="../test/look.action" name="queryForm" method="get">
<button class="saveRhQueryCondition bi-btn bi-btn-primary" type="submit" >查询</button>
</form>
假设表单提交到controller,有如下代码:
@RequestMapping(value="/test/look.action")
public String lookReportset(String name, String keys, String status, Integer pageNo, ModelMap modelMap){
modelMap.put("name",name);
return "test/test-look-list";
}
test-look-list.jsp中取值如下:
<input type="text" class="bi-ipt" name="name" value="${name}" placeholder="输入名称进行模糊查询"/>
ModelAndView
ModelAndView对象有两个作用:
(1). 设置转向地址,这也是ModelAndView和ModelMap的主要区别.设置方式如下所示:
public void setViewName(String viewName){...}
(2). 将控制器方法中处理的结果数据传递到结果页面,也就是把在结果页面上需要的数据放到ModelAndView对象中即可,其作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。
ModelAttribute
1. 用在方法上 一个控制器可以拥有多个@ModelAttribute方法。同个控制器内的所有这些方法,都会在@RequestMapping方法之前被调用。 1) 方法通过返回值的方式默认地将添加一个属性;
2) 方法接收一个Model对象,然后可以向其中添加任意数量的属性。
2. 用在方法参数上 标注在方法参数上的@ModelAttribute说明了该方法参数的值将由model中取得。如果model中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中所有名称匹配的参数都会填充到该参数中。 1) 它可能因为@SessionAttributes标注的使用已经存在于model中。
2) 它可能因为在同个控制器中使用了@ModelAttribute方法已经存在于model中。
3) 它可能是由URI模板变量和类型转换中取得的。
4) 它可能是调用了自身的默认构造器被实例化出来的。
参考链接:https://www.jianshu.com/p/56c70a69f349
public class BaseController {
@Autowired
protected AuthenticationService authenticationService;
@ModelAttribute
public void initialAuthUser(HttpServletRequest request, ServletResponse servletResponse) {
// DO THINGS
}
}
@RestController
@RequestMapping("/dashboard")
public class TestController extends BaseController {
@RequestMapping(value = "/test")
public ServiceStatus test(@RequestParam(name = "datasource", required = false) String datasource, @RequestParam(name = "query", required = false) String query) {
JSONObject queryO = JSONObject.parseObject(query);
JSONObject datasourceO = JSONObject.parseObject(datasource);
return dataProviderService.test(datasourceO, Maps.transformValues(queryO, Functions.toStringFunction()));
}
@RequestMapping(value = "/getProviderList")
public Set<String> getProviderList() {
return DataProviderManager.getProviderList();
}
}
上面代码 TestController中所有带有RequestMapping的方法被调用时,都会首先调用BaseController的initialAuthUser方法。
本文主要总结了Spring中Model、ModelMap、ModelAndView和ModelAttribute的理解与具体使用。SpringMVC有隐含模型,Model是接口,ModelMap用于传递数据到结果页面,ModelAndView可设置转向地址和传递结果数据,ModelAttribute可用在方法和方法参数上。

1399

被折叠的 条评论
为什么被折叠?



