Могу ли я вернуть две модели в ModelAndView в Spring MVC - PullRequest
11 голосов
/ 21 февраля 2011

Предположим, у меня есть следующий код, если у меня есть одна модель

MyBean bean = new MyBean();
bean.setName("Mike");
bean.setMessage("Meow!");

return new ModelAndView("welcomePage","model",bean);

Но если у меня есть две или три модели, такие как

Допустим, на мой взгляд Я хочу модель с деталями пользователя, информацией о корзине и историей

как я могу использовать ModelAnd View для возврата 2-3 моделей

Ответы [ 3 ]

34 голосов
/ 21 февраля 2011

Вы можете сделать это несколькими способами, но, возможно, самый простой способ будет использовать карту

Map<String, Object> model = new HashMap<String, Object>();
model.put("bean", bean);
model.put("userdetails", userdetails);
//and so on
return new ModelAndView("welcomePage", "model", model);

Тогда на вашей странице вам просто нужно добавить дополнительный уровень при доступе к ней

User's name is ${ model.userdetails.username }

в качестве альтернативы, вы также можете изменить свою подпись обработчика на что-то вроде этого

public String handleRequest(Model model){
   //arbitrary handling code
   model.addAttribute("bean", bean);
   model.addAttribute("userdetails", userdetails);
   //etc
   return "welcomePage";
 }

Когда вы делаете это так, вам на самом деле не нужно возвращать модель, потому чтоSpring удерживает ссылку до того, как вы ее получите, а затем может получить к ней доступ.Лично я нахожу этот метод немного лучше, потому что он облегчает модульное тестирование.Все, что вам нужно сделать, это проверить возвращаемое строковое значение и использовать макет Spring (или ваш собственный фиктивный объект, который реализует интерфейс Model).

Редактировать Чтобы обратиться к комментариям:

Этот источник приводит несколько примеров и обсуждает некоторые из поддерживаемых сигнатур поддерживаемых методов.В частности, обратитесь к разделу 15.3.2.3 для обсуждения параметров, которые могут быть переданы в методы-обработчики.

В основном Spring использует аннотации @RequestMapping, чтобы определить, какие методы следует вызывать на основе данного запроса.Затем Spring может проверить сигнатуру метода и сгенерировать соответствующие параметры перед вызовом метода.В случае, когда вы возвращаете объект ModelAndView, Model создается при вызове конструктора на основе предоставленных вами параметров.Если вы не предоставите никаких объектов модели, то будет создана пустая модель.Однако когда вы указываете, что должны получать модель в качестве параметра для вашего метода-обработчика, Spring создает для вас экземпляр объекта Model и передает его в ваш метод.Spring сохраняет ссылку на эту модель и, когда ваш метод возвращается, передает эту модель в веб-представление (например, анализатор JSP).

На самом деле это то же самое, что возвращать объект ModelAndView, за исключением того, что он делает модульное тестирование намного проще и откровеннее, IMO обеспечивает более чистую и элегантную реализацию.

Примечание: имейте в виду, что Model на самом деле является просто специальным Map объектом (следовательно, почему Spring поддерживает взаимозаменяемое использование Model или Map в сигнатурах метода).Есть несколько дополнительных методов, и он также поддерживает неявное именование атрибутов.Например, если вам нужно было просто передать объект без указания имени, объект Model выяснит, как назвать объект в зависимости от типа объекта и т. Д. Однако, если вы всегда предоставляете «ключ» для объектаВы добавляете в модель, она ведет себя точно так же, как Map.

6 голосов
/ 21 февраля 2011

Да, вы можете вернуть произвольное количество атрибутов модели, поместив их в Map:

Map<String, Object> model = new HashMap<String, Object>();
model.put("model", bean);
model.put("userdetails", ...);
model.put("shoppingcart", ...);
return new ModelAndView("welcomePage", model);

Обратите внимание на терминологию: модель - это карта, она состоит из атрибутов модели (отдельных объектов), new ModelAndView("welcomePage","model",bean) - это удобный конструктор для создания модели с одним атрибутом.

0 голосов
/ 21 февраля 2011

Есть хорошие примеры.Просто чтобы добавить к миксу, я действительно становлюсь поклонником методологии, основанной на аннотациях.Мне это нравится, потому что он обеспечивает очень чистый способ реализации.Вот пример ...

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@Scope("prototype")
@RequestMapping("/testing")
public class TestController {

    @Autowired
    TestFactory factory;

    @RequestMapping(value = "/test1", method = RequestMethod.POST)
    public void test1(String something, String something2, Model model) {
        List<Map<String, String>> results = 
             factory.getSomethingCool(something1, something2);

        model.addAttribute("something1", something1);
        model.addAttribute("something2", something2);
        model.addAttribute("results", results);
    }

    @RequestMapping(value = "/test2", method = RequestMethod.POST)
    public void test1(String something1, String something2, Model model) {
        List<String> results = 
            factory.getSomethingElseCool(something1, something2);

        model.addAttribute("something1", something1);
        model.addAttribute("something2", something2);
        model.addAttribute("results", results);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...