2010-01-01 2 views
5

Я создал контроллер, который выполняет некоторую бизнес-логику и создает модель. Если я передаю эту модель непосредственно для просмотра, вернув ModelAndView с именем и моделью просмотра - все отлично работает. Но теперь я хочу показывать результаты на другой странице. Поэтому я использую префикс «redirect:» для перенаправления на другой контроллер, но модель потеряна.Spring MVC - модель прохода между контроллерами

Что мне не хватает?

С уважением, Александр

ответ

0

Поскольку префикс redirect: запускает другой контроллер, вы потеряете все, что вы имели в ModelAndView в предыдущем контроллере. Возможно, контроллер бизнес-логики не должен быть контроллером вообще - возможно, вам стоит просто сделать его обычным классом, и контроллер результатов вызовет его. Затем контроллер результатов может сохранить данные в модели.

+1

Да, я могу отделить свою бизнес-логику от другого класса. Но чтобы эта логика произошла, мне нужны входные параметры. Я получаю их от пользователя в моем первом контроллере, и мне нужен способ передать их другому контроллеру (результату), который впоследствии вызовет класс бизнес-логики. Вы видите, моя трудность заключается в передаче некоторых данных (в этом случае входных параметров) между контроллерами (контроллером входных данных и контроллером результата). – Oleksandr

4

Вариант 1: Вы можете поставить модель в сеанс и вернуть ее в контроллер и свести ее на нет в сеансе.

Вариант 2: Вы сказали, что у Вас есть два контроллера, первый один будет получать ввод пользователя и сделать некоторые бизнес-логики и перенаправлять на другой. Мое предложение состоит в том, чтобы переместить бизнес-логику, которая помещается в оба контроллера в класс, и иметь только один контроллер, который вернет модель и просмотрит пользователя.

+1

Но как я могу сохранить модель в сеансе, используя Spring-MVC с аннотациями. Можете ли вы привести мне пример? – Oleksandr

+4

ModelAndView mv = new ModelAndView(); mv.addObject («ключ1», «значение1»); mv.addObject («ключ2», «значение2»); mv.addObject («ключ3», «значение3»); request.getSession(). SetAttribute ("model", mv.getModelMap()); – novice

+0

Большое спасибо за ответ! Мы почти на месте. Единственное, что я еще не понимаю, это сохранить параметры в HttpSession с помощью аннотаций. Например, @SessionAttributes хранит данные между запросами внутри контроллера.Есть ли какая-либо аннотация, которая хранит данные, является сеансом на постоянной основе. Или как мы можем получить доступ к HttpSession с помощью @RequestParam? Руда есть другой путь? – Oleksandr

0

Я бы не использовал @SessionAttributes, поскольку это может измениться в будущих выпусках весны. Я бы придерживаться старинке, что Александр показал вам выше

как-то старый пост, но, возможно, кто-то найдет это ПОЛЕЗНЫЕ

11

вы можете использовать вперед: префикс, который в конечном счете делает RequestDispatcher.forward() insted of the redirect: префикс.

+0

Это решение сработало для меня. Спасибо @Niraj – will824

2

Во время перенаправления: запрос отправляется с использованием метода GET с параметрами, прилагаемыми к URL-адресу. Вы можете выбрать новый метод в контроллере для получения параметров запроса с помощью аннотации @RequestParameter. Хотя перенаправляет запрос просто добавить все параметры в виде строки

e.g ModelAndView mv = new ModelAndView(); 
mv.setViewName(redirect:/your/url); 
mv.addObject("param1", string_param); 
. 
. 
. 

Таким образом, вы можете перенаправить успешно.