2012-05-01 56 views
4

我想在Spring MVC中使用@SessionAttributes註釋來分享兩個控制器之間的Session Attributes。如何在Spring MVC中的控制器之間共享SessionAttributes?

下面是一個簡單的代碼我用來測試的屬性共享: 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> 

我期望的行爲是去/ 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服務器上。

回答

5

在Spring MVC中,@SessionAttributes並不意味着要跨控制器共享。

我做的反而是用Session範圍創建一個對象(通過POJO),該對象包含我需要爲會話存儲的所有值。

然後,我使用JDK動態代理將對象自動裝入控制器。

+2

如果您可以分享,您將如何使用動態代理自動裝配共享POJO。 –

+1

@susithasenarath像這樣.... @ Component(value =「registerBean」) @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value =「request」) – beinghuman

相關問題