6

@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サーバーにデプロイされました。

4

1 に答える 1

9

Spring MVCでは、@SessionAttributesはコントローラー間で共有されることを意図していません。

代わりに、Sessionスコープを使用して(POJOを介して)オブジェクトを作成しました。このオブジェクトには、Sessionに格納する必要のあるすべての値が含まれています。

次に、JDK動的プロキシを使用して、オブジェクトをコントローラーに自動配線します。

于 2012-05-06T11:34:36.730 に答える