首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring :带@ModelAttribute和不带@ModelAttribute的绑定对象

Spring :带@ModelAttribute和不带@ModelAttribute的绑定对象
EN

Stack Overflow用户
提问于 2017-02-25 22:41:36
回答 7查看 15.9K关注 0票数 16

我是春季的新手,注册了一个用户,我确实喜欢这个。

代码语言:javascript
复制
@RequestMapping("/register")
    public String register(@ModelAttribute User user,BindingResult result){
       if(!result.hasErrors()){
         userSerive.register(user);
       }
     return "welcome";
}

这很好,但是这里的问题是,我不需要在我的welcome.jsp页面中使用这个welcome.jsp对象,所以为什么我尝试了不使用@ModelAttribute的模型对象heavier.So,这也适用于我,如下所示。

代码语言:javascript
复制
@RequestMapping("/register")
    public String register(User user,BindingResult result){
       if(!result.hasErrors()){
         userSerive.register(user);
       }
     return "welcome";
}

因此,我只想知道两者的优缺点是什么--如果我真的不需要在user jsp**.**中使用对象,那么@ModelAttribute除了向模型添加对象之外,还有什么其他的事情要做,那一种是隐式绑定而不是does.Is @ModelAttribute更安全的绑定方式?

我想将我的查询分类在以下4种类型的request.what中,如果我不需要在视图中发送数据,并且我的请求是-

  1. 查询字符串( GET中的表单数据)
  2. 请求有效载荷或正文( POST中的表格数据)
  3. json数据在近似化获取中的应用
  4. json数据在POST requst中--我想这两者都不会绑定。@RequestBody是必需的。
EN

回答 7

Stack Overflow用户

发布于 2017-03-06 07:59:34

可能有(见下文.)在您的情况下,这两个方法签名的行为没有区别。

这两种方法都会将请求参数绑定到user,并将结果对象作为属性user添加到模型中--该属性名是从方法参数User的去标化类型名称派生的。

@ModelAttribute可以用于自定义属性的名称,例如@ModelAttribute("theUser"),或者向代码的读者提示视图中使用了这个参数。但是正如您所说的,这些都不适用于您的用例。

无论您是否使用@ModelAttribute注释,Spring中的相同代码都将用于填充参数--所讨论的代码是org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor

因此,在代码中使用public String register(User user, BindingResult result)签名对我来说更有意义。将@ModelAttribute注释添加到模型中不需要的方法参数中,可能会让阅读代码的人感到困惑。

稍长一点的答案是,在您的情况下,可能会有一个指定@ModelAttribute的理由--但这是相当神秘的,也不太可能。

Spring处理程序方法中的方法参数由HandlerMethodArgumentResolver实例填充。这些都是可配置的,并依次对每个参数进行尝试。

默认的处理程序方法参数解析器如下(参见RequestMappingHandlerAdapter):

代码语言:javascript
复制
resolvers.add(new ServletModelAttributeMethodProcessor(false));

...

resolvers.add(new ServletModelAttributeMethodProcessor(true));

如果要在中间添加自己的参数(例如UserHandlerMethodArgumentResolver ),则可以使用@ModelAttribute告诉Spring以默认方式处理特定的参数,而不是使用自定义参数解析器类。

票数 7
EN

Stack Overflow用户

发布于 2017-03-29 02:13:15

这个问题很有用,但我看不出这里的回答是正确的。

我在堆栈溢出中阅读了更多的线程,发现其中一个非常有用:https://stackoverflow.com/a/26916920/1542363

如果我只需要绑定并且不想将参数对象存储在模型中,那么就不要使用@ModelAttribute

票数 5
EN

Stack Overflow用户

发布于 2017-03-09 17:43:04

除了将对象添加到模型之外,Spring还使用它向Controller方法提供绑定对象,在这里您可以使用它来“注册”。

是的,@ModelAtttribute是Spring中绑定传入的post数据到对象的最安全和最好的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42462450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档