web-dev-qa-db-ja.com

Spring-mvcでセッション属性を使用する方法

あなたは私がこのコードの春のmvcスタイルのアナログを書くのを手伝ってくれる?

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

@ModelAttributeアノテーションの付いた要素をsessionに追加してアクセスするにはどうすればいいですか?

93
gstackoverflow

あなたがそれぞれの応答の後にオブジェクトを削除したい場合は、セッションは必要ありません、

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

  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を@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>
170
Ali.Mojtehedy

@SessionAttributesを使う

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

Spring MVCモデルとセッション属性の理解 」もSpring MVCセッションの非常に良い概要を示し、@ModelAttributeがセッションに転送される方法と時期を説明します(コントローラは@SessionAttributesアノテーション付きです。

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

40
Heinrich Filter

SessionAttributeアノテーションはリクエストオブジェクトからセッションを取得し属性を設定する代わりに最も単純で直接的なアノテーションです。 任意のオブジェクトをcontrollerでモデルに追加することができ、その名前が@SessionAttributes annotation.の引数と一致する場合はセッションに保存されます。例えば、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;
    }

}
25
Rama

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

@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についてはこちら を参照してください。

19
aksappy

これを試して...

@Controller
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit")
@SessionAttributes("pet")
public class EditPetForm {

    @ModelAttribute("types")

    public Collection<PetType> populatePetTypes() {
        return this.clinic.getPetTypes();
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("pet") Pet pet, 
            BindingResult result, SessionStatus status) {
        new PetValidator().validate(pet, result);
        if (result.hasErrors()) {
            return "petForm";
        }else {
            this.clinic.storePet(pet);
            status.setComplete();
            return "redirect:owner.do?ownerId="
                + pet.getOwner().getId();
        }
    }
}

それは最も簡単ではなく、最短です。私はそれを知っていて、ただそれをテストしました - ここで完璧に働いています:

@GetMapping
public String hello(HttpSession session) {
    session.setAttribute("name","value");
    return "hello";
}

pS 私はここで "Spring-mvcでセッション属性を使う方法"の答えを探しに来ましたが、そう多くのことなく読みました私が自分のコードで書いた最も明白なものを見ている。私はそれを見なかった、それで私はそれが間違っていると思った、しかしそれはそうではなかった。それでは、その知識を主な質問に対する最も簡単な解決策と共有しましょう。

1
strash

ログインしようとすると(これはブートストラップモーダルです)、@ 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-正しく/

0
Menuka Ishan

このメソッドはとてもシンプルで使いやすい

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

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

jSPで一度使用してから削除

<c:remove var="errorMsg" scope="session"/>      
0
Bachas

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