在请求之间保持弹簧状态

时间:2009-12-06 20:05:09

标签: java spring session state

如果这是一个初学者问题,我是新手,很抱歉,但手册不清楚(至少不适合我)

我的问题是:我如何在春天的请求之间共享状态? 我可以使用ModelMap将数据从控制器发送到视图,但是ModelMap中的数据不会被视图发送回下一个控制器。 我怎么能用春天做到这一点?

以下是我的源代码的一部分。在第二个控制器中,modelMap不包含我在第一个控制器中存储在modelMap中的数据。 我怎么能在春天保持控制器之间的状态?

非常感谢你的帮助。

@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
}

5 个答案:

答案 0 :(得分:6)

您可以将modelMap放在HttpSession中,或者(对于较大的应用程序更好),使用Spring web flow,您可以进行所谓的对话。

答案 1 :(得分:4)

在Spring中最简单的方法是使用会话范围的spring bean。 bean的实例将是会话专用的,并且在每个会话开始时由Spring实例化和管理。这个bean可以保持你的对话状态。

在幕后,此机制使用标准HttpSession属性,但这意味着您的代码不必直接处理HttpSession,因此整体更清晰。

请参阅relevant part of the Spring docs(和here)了解如何配置和使用它。

答案 2 :(得分:1)

非常感谢您的建议,我通过将ModelMap的键标记为session-attibutes解决了这个问题:

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

答案 3 :(得分:0)

通常(没有Spring),这些数据将进入servlet会话。

答案 4 :(得分:-1)

自己动手。

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