我想使用@SessionAttributes注释在Spring MVC中的两个控制器之间共享会话属性。
这是我用来测试属性共享的简单代码: AController.java
@Controller
@SessionAttributes("myParam")
public class AController {
@RequestMapping(value="/a")
public String handle(Model model){
if(!model.containsAttribute("myParam"))
model.addAttribute("myParam", randomInt());
return "a";
}
private int randomInt(){
return new Random().nextInt(100);
}
}
a.jsp
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<h1>Page A</h1>
<p>Param = ${myParam}</p>
</html>
BController.java
@Controller
@SessionAttributes("myParam")
public class BController {
@RequestMapping(value="/b")
public String handle(Model model){
if(!model.containsAttribute("myParam"))
model.addAttribute("myParam", randomInt());
return "b";
}
private int randomInt(){
return new Random().nextInt(100);
}
}
b.jsp
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<h1>Page B</h1>
<p>Param = ${myParam}</p>
我期望的行为是转到/ a URL,myParam将被设置为0到99之间的随机值,然后这个值将在两个控制器之间共享。
但是,会发生以下情况: 我转到/ a URL,myParam设置为一个值(比方说10)。 然后我转到/ b URL,myParam设置为另一个值(假设为20)。 当我回到/ a URL时,myParam值是BController设置的值(myParam = 20)。
一旦执行了两个控制器方法,就会共享该值,但在此之前,每个控制器都会重新定义一个新值。
似乎Controller从未为SessionAttribute设置值,如果它是由另一个Controller设置的,它就不会检测到该属性。
我真的希望能够在不使用HttpSession对象且坚持使用Spring MVC 3对象的情况下共享控制器之间的会话属性。
我想知道我是否遗漏了某些内容,或者是否有其他做法可以在控制器之间的会话中共享数据。
注意:webapp部署在Tomcat7服务器上。
答案 0 :(得分:7)
在Spring MVC中,@ InvionAttributes并不是要在控制器之间共享。
我所做的是创建一个具有Session范围的对象(通过POJO),该范围包含我需要为Session存储的所有值。
然后我使用JDK动态代理将对象自动装配到控制器。