使用Spring在请求之间保持状态

6

我是新手,所以如果这是一个初学者问题,我很抱歉,但是手册对我来说不够清晰。

我的问题是:在Spring中如何在请求之间共享状态? 我可以通过使用ModelMap将数据从控制器发送到视图,但是ModelMap中的数据不会通过视图发送回下一个控制器。 在Spring中我该如何做?

以下是我的源代码的一部分。在第二个控制器中,modelMap不包含我存储在第一个控制器中的数据。 在Spring中我应该如何维护控制器之间的状态?

非常感谢您的帮助。

@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个回答

6
你可以将modelMap放入HttpSession中,或者(对于较大的应用程序更可取),使用Spring Web Flow,在那里你可以进行所谓的会话。

如何在我的控制器中访问HttpSession?(我熟悉Servlets但不熟悉Spring) - Karl
请查看http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html 13.11.4。 - Bozho
在这种情况下应该使用什么?考虑到我的搜索条件是例如bean - Shantaram Tupe

4
在Spring中最干净的方法是使用一个会话范围的Spring bean。该bean的实例将对会话私有,并且在每个会话开始时由Spring实例化和管理。这个bean可以保存您的会话状态。
在底层,这种机制使用标准的HttpSession属性,但这意味着您的代码不必直接处理HttpSession,因此总体上更加简洁。
请参见Spring文档中相关部分(以及这里)以了解如何配置和使用它。

1
非常感谢您的建议,我通过将ModelMap的键标记为session-attibutes来解决了这个问题。
@SessionAttributes( { "question_index", "something" })  
@Controller  
public class MyController{  
...  
}  

在后续的请求中,你是如何访问这些属性的? - Bindumalini KK

0
通常(没有Spring的情况下),这些数据会存储在servlet会话中。

-1

自己动手做。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接