Как понять Spring MVC Workflow? - PullRequest
3 голосов
/ 11 января 2011

В настоящее время я хотел бы расширить свои знания о Spring MVC, поэтому я изучаю примеры веб-приложений, которые есть в дистрибутиве Spring. Я в основном проверяю заявление Petclinic.

В методе GET объект Pet был добавлен в атрибуты модели, чтобы JSP мог получить доступ к свойствам javabean. Я думаю, что понимаю это.

@Controller
@RequestMapping("/addPet.do")
@SessionAttributes("pet")
public class AddPetForm {
    @RequestMapping(method = RequestMethod.GET)
    public String setupForm(@RequestParam("ownerId") int ownerId, Model model) {
        Owner owner = this.clinic.loadOwner(ownerId);
        Pet pet = new Pet();
        owner.addPet(pet);
        model.addAttribute("pet", pet);
        return "petForm";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
        new PetValidator().validate(pet, result);
        if (result.hasErrors()) {
            return "petForm";
        }
        else {
            this.clinic.storePet(pet);
            status.setComplete();
            return "redirect:owner.do?ownerId=" + pet.getOwner().getId();
        }
    }
}

Но что я не могу понять, так это во время операции POST. Я смотрю на своего firebug и замечаю, что мои почтовые данные - это только те данные, которые были введены пользователем, что мне хорошо.

alt text

Но когда я проверяю данные на моем контроллере. Информация о владельце еще не завершена. Я смотрю на сгенерированный HTML из JSP, но не вижу скрытой информации об объекте Owner. Я не совсем уверен, где Spring собирает информацию об объекте владельца.

Означает ли это, что Spring кэширует объекты модели для каждого запроса потока?

alt text

Это для Spring MVC 2.5.

1 Ответ

5 голосов
/ 11 января 2011

Ключом к этому поведению является @SessionAttributes("pet"), что означает, что атрибут pet модели будет сохранен в сеансе.В setupForm вы выполняете следующие операции:

    Pet pet = new Pet();
    owner.addPet(pet);
    model.addAttribute("pet", pet);

Что означает: создать объект Pet, добавить его к владельцу, указанному в запросе (@RequestParam("ownerId") int ownerId), это, вероятно, где домашнее животноеАтрибут владельца устанавливается.

В методе processSubmit вы объявляете @ModelAttribute("pet") Pet pet в сигнатуре метода, что означает, что вам нужен объект Pet, который вы ранее сохранили в сеансе.Spring извлекает этот объект и затем объединяет его с тем, что было установлено в JSP.Следовательно, заполненный идентификатор владельца.

Более подробная информация в документации Spring

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...