@SessionAttributesアノテーションを使用して、SpringMVCで2つのコントローラーをツイートするセッション属性を共有したいと思います。
これは、属性共有をテストするために使用する簡単なコードです: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>
私が期待する動作は/aURLに移動することであり、myParamは0〜99のランダムな値に設定され、この値は2つのコントローラー間で共有されます。
ただし、次のようになります。/ a URLに移動すると、myParamが値(たとえば10)に設定されます。次に、/ b URLに移動すると、myParamは別の値(たとえば20)に設定されます。/ a URLに戻ると、myParam値はBControllerによって設定された値です(myParam = 20)。
2つのコントローラーメソッドが実行されると、値は共有されますが、その前に、各コントローラーは新しい値を再定義します。
コントローラがSessionAttributeに値を設定したことがない場合、別のコントローラによって設定されている場合、その属性は検出されないようです。
HttpSessionオブジェクトを使用せず、Spring MVC 3オブジェクトに固執することなく、コントローラー間でセッション属性を共有できるようにしたいと考えています。
何かを逃したかどうか、またはコントローラー間のセッションでデータを共有する他の方法があるかどうかを知りたいです。
注意:WebアプリケーションはTomcat7サーバーにデプロイされました。