113

このコードのSpring MVCスタイルのアナログを書くのを手伝ってくれませんか?

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

そして、注釈によって@ModelAttribute注釈が付けられた要素をセッションに追加して、それにアクセスする方法は?

4

9 に答える 9

200

セッションが不要な各応答の後にオブジェクトを削除する場合は、

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

  1. 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. オブジェクトのスコープを設定します。たとえば、毎回セッションにある必要があるユーザー オブジェクトがあります。

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

    次に、必要な各コントローラーにクラスを挿入します

       @Autowired
       private User user
    

    クラスをセッションに保ちます。

  4. AOP プロキシ インジェクション: 春の -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 を作成する By @SessionAttributes("ShoppingCart"):

  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
        }  
      }

それぞれに長所と短所があります。

@session は、セッションをすべてのノードにコピーするクラウド システムでより多くのメモリを使用する可能性があり、直接的な方法 (1 と 5) は面倒なアプローチであるため、単体テストには適していません。

セッション jsp にアクセスするには

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

Jstl で:

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

タイムリーフで:

<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
于 2013-09-13T21:35:56.290 に答える
44

使用する@SessionAttributes

ドキュメントを参照してください: @SessionAttributes を使用して、リクエスト間の HTTP セッションにモデル属性を保存する

Spring MVC モデルとセッション属性を理解する」も、Spring MVC セッションの非常に優れた概要を提供し、@ModelAttributes がセッションに転送される方法/タイミングを説明します (コントローラーに@SessionAttributes注釈が付けられている場合)。

@SessionAttributesこの記事では、Spring MVC がビューに依存しないようにするために、HttpSession に属性を直接設定するよりも、モデルで使用する方がよいことも説明しています。

于 2013-11-27T08:49:24.793 に答える
29

SessionAttributeアノテーションは、リクエスト オブジェクトからセッションを取得して属性を設定する代わりに、最も単純で簡単です。 コントローラーのモデルに任意のオブジェクトを追加でき、その名前が注釈の引数と一致する場合、セッションに保存されます。@SessionAttributes 以下の例でpersonObjは、セッションで利用できます。

@Controller
@SessionAttributes("personObj")
public class PersonController {

    @RequestMapping(value="/person-form")
    public ModelAndView personPage() {
        return new ModelAndView("person-page", "person-entity", new Person());
    }

    @RequestMapping(value="/process-person")
    public ModelAndView processPerson(@ModelAttribute Person person) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("person-result-page");

        modelAndView.addObject("pers", person);
        modelAndView.addObject("personObj", person);

        return modelAndView;
    }

}
于 2013-12-05T13:35:11.023 に答える
19

以下の注釈付きコードは、「値」を「名前」に設定します

@RequestMapping("/testing")
@Controller
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
    request.getSession().setAttribute("name", "value");
    return "testJsp";
  }
}

JSP で同じものにアクセスするには、 を使用します ${sessionScope.name}

については、@ModelAttributeこのリンクを参照してください

于 2013-09-13T17:18:57.927 に答える
1

Spring 4 Web MVC。コントローラーレベル@SessionAttributeのメソッドで使用できます@SessionAttributes

@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {

    GetMapping("/showOrder")
    public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
     // method body
}
于 2018-01-11T02:43:19.237 に答える
0

ログイン (ブートストラップ モーダル) を試みるときに、@sessionattributes アノテーションを使用しました。しかし問題は、ビューがリダイレクト (「redirect:/home」) の場合で、セッションに入力した値が URL に表示されます。一部のインターネット ソースでは、http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirectingに従うよう提案されていますが、代わりに HttpSession を使用しました。このセッションは、ブラウザーを閉じるまで存在します。ここにサンプルコードがあります

        @RequestMapping(value = "/login")
        @ResponseBody
        public BooleanResponse login(HttpSession session,HttpServletRequest request){
            //HttpServletRequest used to take data to the controller
            String username = request.getParameter("username");
            String password = request.getParameter("password");

           //Here you set your values to the session
           session.setAttribute("username", username);
           session.setAttribute("email", email);

          //your code goes here
}

ビュー側で特定のものを変更することはありません。

<c:out value="${username}"></c:out>
<c:out value="${email}"></c:out>

ログイン後、上記のコードを Web サイトの任意の場所に追加します。セッションが正しく設定されていれば、そこに値が表示されます。jstl タグと El- 式を正しく追加したことを確認します (jstl タグを設定するためのリンクはこちらですhttps://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-正しく/

于 2016-10-26T03:53:20.850 に答える
0

使用方法 この方法は非常にシンプルで使いやすい

HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();

                                                            request.getSession().setAttribute("errorMsg", "your massage");

jspで一度使用してから削除する

<c:remove var="errorMsg" scope="session"/>      
于 2018-01-03T12:55:56.413 に答える