我是Spring-MVC的新手,对设置对象属性的机制和在请求之间传递对象的机制感到困惑。所以这是一个例子。
我有一个名为Person
的类,用于存储带有两个字段name和age的信息。而且我下面有一个名为PersonController
的控制器类。
@Controller
public class PersonController {
@RequestMapping("/home")
public ModelAndView enterInfo() {
return new ModelAndView("home", "command",new Person());
}
@RequestMapping("/next")
public String getInfo(Person per, Model md) {
md.addAttribute("name", per.getName());
md.addAttribute("age", per.getAge());
return "next";
}
}
第一个方法enterInfo()
返回引用名为“ home”的视图的ModelAndView
对象,并创建一个新的空Person
对象。这是我的home.jsp
文件:
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<form action = "next">
Name: <input type = "text" name = "name"/><br><br>
Age: <input type = "text" name = "age"/><br><br>
<input type = "submit" value = "submit"/>
</form>
</body>
</html>
因此,当我单击“提交”按钮时,Spring将映射到带有注释方法@RequestMapping("/next")
的{{1}}。此方法返回视图“ next”,该视图显示有关人员对象的信息。
项目运行得很好,但是我不知道Spring如何运行它而不会出错。在控制器类的两种方法中,我没有任何设置方法。而且在方法getInfo()
中,Spring如何获得我刚创建的确切Person对象?我认为如果没有像getInfo()
或@ModelAttribure
这样的注释,方法@SessionAttribute
就无法获得对象getInfo()
,因此它将为null。但是在此示例中,它仍然可以获取信息。所以任何人都可以向我解释一下这种机制吗?
答案 0 :(得分:0)
以及在getInfo()方法中,Spring如何获得我刚创建的确切Person对象。
不是。它创建一个新实例。
https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-methods
其他任何论点
如果方法参数与以下任何早期值都不匹配 此表[例如@ModelAttribute],它是一个简单的类型(由 BeanUtils#isSimpleProperty,它被解析为@RequestParam。 否则,将其解析为@ModelAttribute 。
因此它实际上是@ModelAttribute
,并且正如文档中所指出的那样:
您可以在方法参数上使用@ModelAttribute批注来 从模型访问属性,或者如果没有,请实例化该属性 礼物。
因此,如果您要确保在加载和编辑时都引用了同一个人,则需要在模型中以某种方式进行引用,例如在会议上。通常,您可能会从数据库中加载数据,因此可以编写带有@ModelAttribute
注释的方法,并且您的控制器看起来像:
@Controller
public class PersonController {
@RequestMapping("/loadPersonForEdit")
public String loadPersonForEdit() {
return "edit";
}
@RequestMapping("/updatePerson")
public String updatePerson(Person per) {
//database update person
return "personDetails";
}
//called by the framework on loadPersonForEdit() to set the model attribute
//on saving the edit, the returned instance will be used passed to updatePerson()
@ModelAttribute("person")
public Person getPerson(@RequestParam(value = "personId", required = false)
Long personId){
return personId == null ? new Person() : datebase.getPerson(personId);
}
}