2012-01-20 1 views
1

Я новичок в 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";  
    } 

ответ

0

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

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

+0

Я планировал сделать этот подход, и один из параметров я буду нам, чтобы загрузить некоторые данные из БД, но моя мысль, что если этот параметр изменен пользователем, то данные, которые предполагалось чтобы быть выборкой, есть ли другой способ? – newbie

+0

Если вы не против использовать сеанс, вы можете взглянуть на область Flash. http://www.javabeat.net/flash-attributes-in-spring-mvc-3-1/ – digitaljoel

2

Использовать атрибуты Flash, как показано на рисунке Warlock's Thoughts.

@RequestMapping(method = RequestMethod.POST) 
public String handleFormSubmission(..., final RedirectAttributes redirectAttrs) { 
    ... 
    redirectAttrs.addFlashAttribute("AttributeName", value); 
    return "redirect:to_some_url_handled_by_BController"; 
}