注解@ModelAttribute的详细总结

11 篇文章 0 订阅
9 篇文章 0 订阅

引导

在项目中,controller中经常看到@ModelAttribute或者@ModelAttribute(“someName”)这种用法,这到底是个什么意思呢?本文带你一探究竟。

作用

@ModelAttribute,即org.springframework.web.bind.annotation.ModelAttribute,是spring的一个注解,可以用在方法或者属性上。被该注解标注的方法会在该controller的请求方法执行之前执行,比如你定义一个TestController,其中一个方法test()标注@RequestMapping("/api/test"),然后发起一个请求/api/test,那么在test执行前,该类中所有@ModelAttribute标注的方法会先执行,执行之后的结果会放在Model中,后续test方法可以通过Model获得一些全局属性。那么问题来了,Model是什么,这个暂时可以理解为该类的一个全局属性,是一个map形式。
简单理解就是

  • 该注解标注的方法会在handler具体方法执行之前,作为全局属性存放在Model,供后续handler具体方法执行的时候调用

在知道了ModelAttribute的执行时间和作用,我们来看看这个注解怎么用。

使用方法

该注解标注的方法可以带有和请求方法一样的参数,比如请求方法带有一个String userId,那么该方法也可以带有,两个方法对应的值是一样的,但要注意的是:

  • 能自动获取的值是可以用@RequestParam拿到的值,即get请求的?后接的参数或者post请求的body里的参数,且如果是body里的参数,则此post请求对应的Content-Type为application/x-www-form-urlencoded,如果为application/json则无法用@RequestParam获取到,@ModelAttribute方法的参数也就获取不到,参数为null。
private static final String USER_ID = "userId";
@ModelAttribute(USER_ID)
    public String getUserId(String userId) {
        System.out.println(userId);
        return "my" + userId;
    }

如上面的代码,就是自动获取的方式,我的测试请求可以用如下格式:

Get /api/test/model?userId=123
Post /api/test
Content-Type: application/x-www-form-urlencoded

userId=234


另一种方式是在方法的参数前标明获取方式:

private static final String USER_ID = "userId";
@ModelAttribute(USER_ID)
    public String getUserId(@PathVariable("userId") String userId) {
        System.out.println(userId);
        return "my" + userId;
    }

如上,这种情况下对应的请求需要在路径中包含userId,且需要注意的是:

如果用了这种方式,那么这个类中所有的请求方法对应的uri都路径中都需要包含userId的占位符
比如我请求了如下接口

Get /api/test/model/tt
//会报错"Missing URI template variable 'userId' for method parameter of type String"

同理,还可以用@RequestParam @RequestBody等获取参数

使用的话我们可以直接用如下的方式

public Object getSomeThing1(@ModelAttribute(USER_ID) String userID) {
        
        return userID;
}

不加参数怎么用呢?
举个例子:

@ModelAttribute
    public UserData getuserData() {
        UserData userData = new UserData();
        userData.setUserId("id");
        Map<String, String> map = new HashMap<>();
        map.put("testKey", "testValue");
        userData.setData(map);
        System.out.println(userData);
        return userData;
    }

我们定义了一个getuserData方法,返回了一个userData实例,由于我们没有像上面定义getUserId方法一样直接指定@ModelAttribute的value值,返回后对应的key默认为返回类型且首字母小写,即userData。通过定义这个方法,我们可以在model中获得一个key为userData的value,值为该方法的返回值。

如下为方法执行后model中的值。

{
    "userData": {
        "userId": "id",
        "data": {
            "testKey": "testValue"
        }
    }
}

那么定义好了,怎么在方法中用呢?

@RequestMapping(value = "/api/test/model/post", method = RequestMethod.POST)
    public Object postUserData(@ModelAttribute UserData data) {
        return data;
    }

这样我们就可以获得一个UserData实例了,及时我的请求中没有任何参数。
注意:上面的例子我们获取了一个userData实例,如果对不同的请求我想得到不同的实例怎么办呢?

  • 首先可以通过类似于上面getUserId(String UserId)这种方法实现,也就是你的请求参数中添加一个userId,在@ModelAttribute修饰的方法中构造自己的UserData实例,这样就可以

  • 其次我们可以用下面的getuserData()的方式,只传递一个userId参数,然后代码不变,由于ModelAttribute会自动获取@RequestParam可以获取到的值,会用请求中的值替换model中预设的值。

例子:

Post /api/test/model/post?userId=popo

最后返回的值有原来的

{
  "userId": "id",
  "data": {
    "testKey": "testValue"
  }
}

变成了

{
  "userId": "popo",
  "data": {
    "testKey": "testValue"
  }
}

这个变化只是因为我的请求加了参数,代码未变。


总结几点

  • @ModelAttribute适合给一个controller增加一些全局的变量

  • 如果返回一个String值,可以用上面例子中的@ModelAttribute(USER_ID) String userID 这种方式,也可以在请求方法中直接引入model或者modelMap进行get,但不可以直接@ModelAttribute String userID。

  • 如果返回的是一个对象,一个实例,那么可以直接@ModelAttribute UserData data使用,也可以@ModelAttribute(“userData”) UserData data使用,还可以用Model或者ModelMap进行get.

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@ModelAttribute注解的作用是将方法的返回值或者方法参数绑定到Model对象上,在处理请求的过程中,方便传递数据。具体作用如下: 1. 在方法的返回类型上使用@ModelAttribute注解,可以将方法的返回值添加到Model对象中,作为视图的数据源。这样在视图中就可以直接使用这个模型属性了。 2. 在方法的参数上使用@ModelAttribute注解,可以将请求参数绑定到指定的方法参数上。这样在处理请求时,就可以直接获取请求参数,并将其赋值给方法参数对象。 3. 当@ModelAttribute注解用于方法时,它会在每个@Controller方法执行前执行被注解的方法。这可以用于在每个请求之前准备数据,例如从数据库中加载一些信息或者设置一些默认值。 需要注意的是,@ModelAttribute注解的具体行为取决于它的位置和与其他注解的组合使用。例如,在方法的返回类型上使用@ModelAttribute注解时,可以使用value属性来指定模型属性的名称。而在方法参数上使用@ModelAttribute注解时,可以用来绑定请求参数。 综上所述,@ModelAttribute注解主要用于将方法的返回值或者方法参数与Model对象进行绑定,方便在处理请求时传递数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [@ModelAttribute注解的使用总结](https://blog.csdn.net/qq_25933249/article/details/90903027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值