Как передать объект в обработчик GET с Post-Redirect-Get с Spring MVC? - PullRequest
1 голос
/ 21 января 2012

Я новичок в Spring MVC и пытаюсь заставить работать шаблон Post / Redirect / Get.Мы пытаемся провести опрос, где на каждой странице может отображаться различное количество вопросов.Я хотел бы реализовать это с помощью обработчика GET, который подготавливает следующую страницу опроса и затем передает ее представлению.В том же контроллере есть обработчик Post, который обрабатывает ответы формы на вопросы опроса, передает их службе опроса, которая возвращает следующую страницу вопросов, а затем перенаправляет следующую страницу surveyPage в обработчик getNextPage GET.

Большая часть этого работает, за исключением проблемы, заключающейся в том, что я не знаю, как передать этот объект «страница следующего опроса» из обработчика POST в обработчик getNextPage GET в перенаправлении.Редирект работает;он переходит от метода POST к методу GET, но surveyPage ModelAttribute - это новый объект в методе GET, а не тот, который был установлен в конце метода POST.Как видите, я пытался использовать ModelAttribute, но он не работает.Я также попытался использовать @SessionAttributes над классом, но затем получил HttpSessionRequiredException.

Мы не знали, как обрабатывать динамическую форму, содержащую переменную # вопросов, с Spring MVC Forms, поэтому мы просто выполнили прямую JSTL,Это прикольно, но это работает.Именно эта забавность привела к использованию @RequestBody и SurveyPageBean, возвращающихся с Post.Честно говоря, я не знаю, как заполнен SurveyPageBean.Это похоже на магию Spring MVC, но оно работает, поэтому я пока оставляю его в покое (другой разработчик сделал это, а потом я поднял его, и мы оба новички в Spring MVC).Пожалуйста, не отвлекайтесь на необычную обработку форм, если только это не является частью проблемы с пустым перенаправлением ModelAttribute surveyPage.

Вот фрагмент кода контроллера:

@Controller
@RequestMapping("/surveyPage")
public class SurveyPageController{

    @RequestMapping(method=RequestMethod.GET)
    public String getNextPage(@ModelAttribute("surveyPage") SurveyPage surveyPage, Model model) {
        if(surveyPage.getPageId() == null) {
            // call to surveyService (defined elsewhere) to start Survey and get first page
            surveyPage = surveyService.startSurvey("New Survey");
        }
        model.addAttribute("surveyPage", surveyPage);
        return "surveyPage";
    }


    @RequestMapping(method=RequestMethod.POST)
    public String processSubmit(@RequestBody String body, SurveyPageBean submitQuestionBean, Model model, @ModelAttribute("surveyPage") SurveyPage surveyPage) {
        // process form results, package them up and send to service, which
        // returns the next page, if any
        surveyPage = surveyService.submitPage(SurveyPageWithAnswers);
        if (results.getPageId() == null) {
            // The survey is done
            surveyPage  = surveyService.quitSurvey(surveyId);
            return "redirect:done";
        }
        model.addAttribute("surveyPage ", surveyPage );

        return "redirect:surveyPage";       
    }

Ответы [ 2 ]

2 голосов
/ 29 января 2013

Используйте атрибуты Flash, как показано в Мысли чернокнижника .

@RequestMapping(method = RequestMethod.POST)
public String handleFormSubmission(..., final RedirectAttributes redirectAttrs) {
    ...
    redirectAttrs.addFlashAttribute("AttributeName", value);
    return "redirect:to_some_url_handled_by_BController";
}
0 голосов
/ 21 января 2012

Ваш GET принимает surveyPage в качестве атрибута модели, что означает, что он считывает его из URL. В POST вместо добавления surveyPage к модели (которая теряется, потому что вы говорите клиенту о перенаправлении, который создает новый запрос и, следовательно, новую модель), вы должны добавить surveyPage в качестве параметра запроса в "redirect:surveyPage". Вам нужно будет посмотреть, как устроен surveyPage из параметров запроса, чтобы узнать, что поместить в строку запроса.

Если, например, surveyPage состоит из пользователя, номера страницы и количества вопросов или чего-то подобного, я думаю, что вы могли бы сделать что-то вроде "redirect:surveyPage?userId=1234&pageNumber=5678&questionCount=12, чтобы передать этот атрибут модели.

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