views:

52

answers:

1

Hi. I have a Spring Annonted Controller that is used to capture the information from a form and get a list of search results from the database.

Here is the definition of the method

@RequestMapping(method = RequestMethod.POST, params = {SUBMIT_BTN }) 
public ModelAndView processForm(@ModelAttribute(COMMAND_NAME){


   // 1. Load search results using search parameters from form (Contained in a collection of some sort)


   // 2. Create the ModelAndView 

   // 3. Redirect with RequestView or redirect: to generate a GET. 
}

I think I need to redirect with redirect: since i have a list of items in a collection store in the session. Cannot add that as a url request param.

Basically I'm trying to prevent problems whith the back button where it says that the page is expired. I want to implement the PRG pattern in strings.

I'm having a hard time wrapping my head around converting the POST into a GET. Can I just redirect or do I need two methods? Thanks for any help you can provide.

+1  A: 

The standard pattern is to have a controller method to handle the GET,and which shows the form (or whatever) to the user, and one to handle the POST, which is the form submission. The POST method sends a redirect after it has finished processing the submission, which comes back in to the GET method.

@RequestMapping(value="/myapp", method=GET) 
public String showForm(@ModelAttribute(COMMAND_NAME){
   return "form.jsp";
}

@RequestMapping(value="/myapp", method=POST) 
public String processForm(@ModelAttribute(COMMAND_NAME){
   // do stuff to process for submission
   return "redirect:/myapp";
}

Returning a view name with the "redirect:" prefix forces Spring to send an HTTP direct rather than an internal request forward.

This is the same pattern that Spring 2.0 implemented with SimpleFormController, but the new way is far more transparent.

skaffman