好,很多问题。让我们看看,所有引用都是针对当前Spring MVC版本的文档。
1)在你看到的行为
user属性的部分解释说,“
在一个方法参数使用@ModelAttribute ”
方法参数上的@ModelAttribute指示应从模型中检索参数。如果模型中不存在该参数,则应首先实例化该参数,然后将其添加到模型中。一旦出现在模型中,则应从具有匹配名称的所有请求参数中填充参数的字段。这在Spring
MVC中称为数据绑定,这是一种非常有用的机制,使您不必分别解析每个表单字段。
Spring如何做到这一点?好吧,源代码是最终的答案,但要猜测起来并不难:Spring知道参数是的实例,
User并且通过反射它可以读取类的方法,特别是其
setter
。在这种情况下,它找到
setUsername()和
setEmail(),这些方法的参数是a,
String因此它与请求中的参数兼容。
(顺便说一句:
@RequestParam("email") String password可能是一个错误。至少是令人困惑的)2)该方法
createUser()之前带有注释
@ModelAttribute("user")。这将在“在方法上使用@ModelAttribute ”部分介绍
方法上的@ModelAttribute指示该方法的目的是添加一个或多个模型属性。
因此,此方法将与名称相关联的对象
"user"放在模型上,然后可供其他方法用作参数,例如
step()。注意,注释控制着模型中对象使用的标识符。如果将代码更改为
@ModelAttribute("strangeWeirdIdentifier")private User createUser() { return user; }该应用程序将中断。但是,如果将
step()签名更改为
public String step(@ModelAttribute("strangeWeirdIdentifier") User user, @RequestParam("username") String username, @RequestParam("email") String password, @PathVariable() Integer page) {3)1)和2)中描述的过程在请求期间将对象存储在模型中。使用类注释,
@SessionAttributes("user")您可以延长对象的寿命,将其添加到当前对象Session或等效对象中。例如,您可以在其他
Controllers中使用与
step()方法相同的对象。
最后只是要清楚
- 在问题2中看到的注释发生在问题1中出现的用法之前。
- 您可能不需要问题3的注释
- Spring不会将bean映射到Java代码中的名称,而是映射到注释中使用的名称。为了清楚起见,重复与示例中相同的名称并不罕见。
希望这比官方文档更清楚,通常太简短了,我给你。



