Я новичок в Spring MVC и пытаюсь получить работу Post/Redirect/Get. Мы пытаемся выполнить опрос, на котором каждая страница может отображать переменное количество вопросов. Способ, которым я хотел бы реализовать это, - это обработчик GET, который готовит следующую страницу опроса, а затем передает это представление. В том же Контроллере есть обработчик Post, который обрабатывает ответы формы на вопросы опроса, представляет это службе опроса, которая возвращает следующую страницу вопросов, а затем перенаправляет следующую страницу обследования на обработчик getNextPage GET.Как передать объект GET-обработчику с помощью Post-Redirect-Get с Spring MVC?
Большая часть работы работает, за исключением того, что я не знаю, как передать объект «следующий объект опроса» из обработчика POST в обработчик getNextPage GET в перенаправлении. Переадресация работает; он идет от метода POST к методу GET, но параметр ModelAttribute surveyPage - это новый объект в методе GET, а не тот, который был установлен в конце метода POST. Как вы можете видеть, я попытался использовать ModelAttribute, но он не работает. Я также попытался использовать @SessionAttributes над классом, но затем получил исключение HttpSessionRequiredException.
Мы не знали, как обращаться с динамической формой, содержащей переменную # вопросов с Spring MVC Forms, поэтому мы просто сделали прямо JSTL. Это фанки, но это работает. Эта фанкировка привела к использованию @RequestBody и SurveyPageBean, возвращающихся с Post. Честно говоря, я не знаю, как заполняется SurveyPageBean. Это похоже на волшебство Spring MVC, но оно работает, поэтому я оставляю его наедине (другой разработчик сделал это, а затем я его взял, и мы оба новы к Spring MVC). Пожалуйста, не отвлекайтесь на необычную обработку формы, если это не является частью проблемы, когда пустой объект ModelAttribute опроса не перенаправляется.
Вот фрагмент кода контроллера:
@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";
}
Я планировал сделать этот подход, и один из параметров я буду нам, чтобы загрузить некоторые данные из БД, но моя мысль, что если этот параметр изменен пользователем, то данные, которые предполагалось чтобы быть выборкой, есть ли другой способ? – newbie
Если вы не против использовать сеанс, вы можете взглянуть на область Flash. http://www.javabeat.net/flash-attributes-in-spring-mvc-3-1/ – digitaljoel