views:

184

answers:

5

Hi, I am new to spring so sorry if this is a beginners question, but the manual is not clear (at least not for me)

My question is: how do I share state between requests in spring? I can send data from the controller to the view by using a ModelMap, but the data in the ModelMap is not sent back to the next controller by the view. How can I do this with spring?

Below is a part of my source code. In the second controller the modelMap doesn't contain the data I stored in the modelMap in the first controller. How am I supposed to maintain state between controllers in spring?

thanks a lot for help.

@RequestMapping(value = "find/something", method = RequestMethod.GET)
public String foo(@RequestParam("parent") Parent parent, ModelMap modelMap) {    
...
    modelMap.addAttribute("question_index", 42);
    modelMap.addAttribute("something", new Something());
    modelMap.addAttribute("data", new Data());
    return "some/view";
}

<form:form action="bla" method="POST"  modelAttribute="data">
...// using Something() and 42
</form:form>

@RequestMapping(value = "bla", method = RequestMethod.POST)    
public String bla(@ModelAttribute("data") Data data, BindingResult result, ModelMap modelMap) {
System.out.println(modelMap); // doesn't contain question_index, or something
}
A: 

Typically (and without Spring), such data would go into the servlet session.

Carl Smotricz
Or in a stateful EJB.
duffymo
How do stateful EJB's work with web applications?
Bozho
+3  A: 

You can either put the modelMap in the HttpSession, or (preferable for larger applications), use Spring web flow where you can have the so called conversations.

Bozho
how do I access the HttpSession in my controllers? (I am familiar with Servlets but not with spring)
Karl
Look at http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html 13.11.4
Bozho
+3  A: 

The cleanest way to do this in Spring is with a session-scoped spring bean. Instances of the bean will be private to the session, and will be instantiated and managed by Spring when each session starts. This bean can hold your conversation state.

Under the covers, this mechanism uses standard HttpSession attributes, but it means your code doesn't have to deal with HttpSession directly, so it's cleaner overall.

See the relevant part of the Spring docs (and here) for how to configure and use it.

skaffman
A: 

do it yourself.

<form:form action="bla" method="POST"  modelAttribute="data">
    <input type="hidden" name="data" value="${data}"/>
</form:form>
irreputable
A: 

thanks a lot for your suggestions, I solved it by tagging the keys for the ModelMap as session-attibutes:

@SessionAttributes( { "question_index", "something" })
@Controller
public class MyController{

...

}

Karl