The*_*ous 13 data-binding spring modelattribute
我是Spring的新手,并注册了一个用户.我确实喜欢这个.
@RequestMapping("/register")
public String register(@ModelAttribute User user,BindingResult result){
if(!result.hasErrors()){
userSerive.register(user);
}
return "welcome";
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但这里的问题是我user在welcome.jsp页面中不需要这个对象,所以为什么要让模型对象更重.所以我试过没有@ModelAttribute,这对我来说也适用于下面.
@RequestMapping("/register")
public String register(User user,BindingResult result){
if(!result.hasErrors()){
userSerive.register(user);
}
return "welcome";
}
Run Code Online (Sandbox Code Playgroud)
所以我只想知道两者的优点和缺点,如果我真的不需要user对象,那么这是最佳实践jsp.是@ModelAttribute做除了增加对象模型的任何其他事情,这春天隐式绑定不does.Is @ModelAttribute结合或者更安全的方法是什么?
我想在以下4种类型的请求中对我的查询进行分类.@ModelAttribute如果我不需要在视图中发送数据并且我的请求是 -
@RequestBody是必须的.在您的情况下,两个方法签名之间的行为可能没有区别(请参阅下文...)。
两者都将请求参数绑定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):
resolvers.add(new ServletModelAttributeMethodProcessor(false));
...
resolvers.add(new ServletModelAttributeMethodProcessor(true));
Run Code Online (Sandbox Code Playgroud)
如果要在中间添加自己的名称(例如)UserHandlerMethodArgumentResolver,则可以@ModelAttribute用来告诉Spring以默认方式处理特定的参数,而不是使用自定义参数解析器类。
这个问题非常有用,但我没有看到这里的回复正确回答了这个问题。
我阅读了 stackoverflow 中的更多线程,发现这个非常有用: /sf/answers/1884184431/
对于我自己如何决定使用哪一个,如果我只需要绑定并且不想将参数对象存储在模型中,那么就不要使用@ModelAttribute.
As described in the Spring MVC documentation - the @ModelAttribute annotation can be used on methods or on method arguments. And of course we can have both use at the same time in one controller.
Method annotation
@ModelAttribute("person")
public Person getPerson(){
return new Person();
}
Run Code Online (Sandbox Code Playgroud)
Purpose of such method is to add attribute in the model. So in our case person key will have person object as value in the Model. @ModelAttribute methods in a controller are invoked before @RequestMapping methods, within the same controller.
Method Argument
public String processForm(@ModelAttribute("person") Person person){
person.getStuff();
}
Run Code Online (Sandbox Code Playgroud)
See spring documentation http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-method-args
| 归档时间: |
|
| 查看次数: |
10097 次 |
| 最近记录: |