6

我想使用 @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 服务器上。

4

1 回答 1

9

在 Spring MVC 中,@SessionAttributes 并不意味着在控制器之间共享。

我所做的是创建一个具有 Session 范围的对象(通过 POJO),它包含我需要为 Session 存储的所有值。

然后我使用 JDK 动态代理将对象自动连接到控制器。

于 2012-05-06T11:34:36.730 回答