1. ホーム
  2. spring-mvc

[解決済み] Spring-mvcでSession属性を使用する方法

2022-09-19 23:21:53

質問

このコードのspring mvc形式のアナログを書くのを手伝ってくれませんか?

 session.setAttribute("name","value");

でアノテーションされた要素をどのように追加するか。 @ModelAttribute アノテーションで指定された要素をセッションに追加し、それにアクセスする方法は?

どのように解決するのですか?

レスポンスごとにオブジェクトを削除したい場合は、セッションは必要ありません。

ユーザーセッションの間、オブジェクトを保持したい場合。 いくつかの方法があります。

  1. セッションに直接属性を追加する。

    @RequestMapping(method = RequestMethod.GET)
    public String testMestod(HttpServletRequest request){
       ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
       return "testJsp";
    }
    
    

    で、コントローラからこのように取得できます。

    ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
    
    
  2. コントローラのセッションをスコープ付きにする

    @Controller
    @Scope("session")
    
    
  3. オブジェクトのスコープを設定します。例えば、userオブジェクトがあり、そのオブジェクトは常にセッションに存在しなければなりません。

    @Component
    @Scope("session")
    public class User
     {
        String user;
        /*  setter getter*/
      }
    
    

    で、各コントローラに必要なクラスを注入します。

       @Autowired
       private User user
    
    

    は、クラスをセッションに保持するためのものです。

  4. AOPのプロキシ注入. in spring -xml:

    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    
      <bean id="user"    class="com.User" scope="session">     
          <aop:scoped-proxy/>
      </bean>
    </beans>
    
    

    で、各コントローラに必要なクラスを注入します。

    @Autowired
    private User user
    
    

5.HttpSessionをメソッドに渡します。

 String index(HttpSession session) {
            session.setAttribute("mySessionAttribute", "someValue");
            return "index";
        }

6.セッションでModelAttributeを作る @SessionAttributes("ShoppingCart")で、ModelAttributeを作ります。

  public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status  by sessionStatus.setComplete();
}

のように、コントローラクラス全体にモデルを追加することもできます。

@Controller
    @SessionAttributes("ShoppingCart")
    @RequestMapping("/req")
    public class MYController {

        @ModelAttribute("ShoppingCart")
        public Visitor getShopCart (....) {
            return new ShoppingCart(....); //get From DB Or Session
        }  
      }

それぞれメリット・デメリットがあります。

セッションを全ノードにコピーするため、クラウドシステムではより多くのメモリを消費する可能性があります。また、直接法(1、5)はアプローチが雑で、ユニットテストには向いていません。

セッションにアクセスするためのjsp

<%=session.getAttribute("ShoppingCart.prop")%>

Jstlで。

<c:out value="${sessionScope.ShoppingCart.prop}"/>

をThymeleafで表示します。

<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>