Spring中Model、ModelMap、ModelAndView ModelAttribute的使用

本文主要总结了Spring中Model、ModelMap、ModelAndView和ModelAttribute的理解与具体使用。SpringMVC有隐含模型,Model是接口,ModelMap用于传递数据到结果页面,ModelAndView可设置转向地址和传递结果数据,ModelAttribute可用在方法和方法参数上。

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方法。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值