我想使用 @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);
}
}
一个.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)。
一旦执行了两个控制器方法,该值就会被共享,但在此之前,每个控制器都会重新定义一个新值。
看起来如果控制器从未为 SessionAttribute 设置值,那么如果它是由另一个控制器设置的,它就不会检测到该属性。
我真的希望能够在不使用 HttpSession 对象并坚持使用 Spring MVC 3 对象的情况下在控制器之间共享会话属性。
我想知道我是否遗漏了什么,或者是否有其他做法可以在控制器之间的会话中共享数据。
注意:webapp 部署在 Tomcat7 服务器上。