О механизме установки свойства объекта - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в 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() возвращает объект ModelAndView, который ссылается на представление с именем "home", а также создает новый пустой объект 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"), который является аннотированным методом getInfo(). Этот метод возвращает представление «next», которое показывает информацию об объекте person.

Проект работает очень хорошо, но я не знаю, как Spring может запустить его без ошибок. В обоих методах класса контроллера у меня нет методов настройки. А также в методе getInfo() как Spring получает именно тот объект Person, который я только что создал? Я думаю, что без аннотации, такой как @ModelAttribure или @SessionAttribute, метод getInfo() не может получить объект Person, и поэтому он будет нулевым. Но в этом примере он все же может получить информацию. Так кто-нибудь может объяснить мне об этом механизме?

1 Ответ

0 голосов
/ 21 июня 2019

А также в методе 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);    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...