如果这是一个初学者问题,我是新手,很抱歉,但手册不清楚(至少不适合我)
我的问题是:我如何在春天的请求之间共享状态? 我可以使用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
}
答案 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>