我想在Spring MVC中使用@SessionAttributes注释,在两个控制器之间共享Session属性。
这是我用来测试属性共享的简单代码:
AController.java
然而,实际发生的情况是这样的: 我访问 /a URL,myParam被设置为一个值(假设为10)。 然后我访问 /b URL,myParam被设置为另一个值(假设为20)。 当我回到 /a URL 时,myParam的值是由BController设置的(myParam = 20)。
在两个控制器方法执行之前,该值是不共享的,每个控制器都会重新定义一个新值。
似乎如果一个控制器从未向SessionAttribute设置过值,则它不会检测到由另一个控制器设置的属性。
我真的希望能够在控制器之间共享会话属性,而不使用HttpSession对象并坚持使用Spring MVC 3对象。
我想知道是否有其他方法来在控制器之间共享会话数据,或者我是否遗漏了什么。
注:Web应用程序部署在Tomcat7服务器上。
这是我用来测试属性共享的简单代码:
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)。
在两个控制器方法执行之前,该值是不共享的,每个控制器都会重新定义一个新值。
似乎如果一个控制器从未向SessionAttribute设置过值,则它不会检测到由另一个控制器设置的属性。
我真的希望能够在控制器之间共享会话属性,而不使用HttpSession对象并坚持使用Spring MVC 3对象。
我想知道是否有其他方法来在控制器之间共享会话数据,或者我是否遗漏了什么。
注:Web应用程序部署在Tomcat7服务器上。