关于设置对象属性的机制

时间:2019-06-21 02:46:46

标签: java spring spring-mvc jsp

我是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。但是在此示例中,它仍然可以获取信息。所以任何人都可以向我解释一下这种机制吗?

1 个答案:

答案 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,并且正如文档中所指出的那样:

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-modelattrib-method-args

  

您可以在方法参数上使用@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);    
    }
}