Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

struts環境におけるスコープ利用の仕方について

【前提条件】
1.
Strutsを利用

2.
オリジナルクラスとして
CartForm
Item
ShoppingCart
クラスが存在しています。

3.
sessionスコープ内にShoppinCartクラスのcartオブジェクトが格納されています。

【質問内容】
strutsを学習中です。strutsのデータ渡しなど基本的な箇所の質問かもしれませんが、
分かる方がいらっしゃれば助言お願いいたします。

下記本の例題「★」の箇所なんですが、セッションスコープから取り出したcartオブジェクトには、
add()を使いItemクラスのオブジェクトを格納することができます。
下記例題では、cartオブジェクトにitemオブジェクトを格納して、
セッションスコープなどに格納処理をせずActionServletに処理を返しているんですが、
forward先でcartオブジェクトを取り出すと、ここでaddされたitemオブジェクトの内容を確認することができます。

なぜ、下記ソース内でcartオブジェクトを「スコープに格納する処理が無い」にも関わらず、
forward先で追加されたitemオブジェクトの内容を確認することができるのでしょうか?

//////////////////////////////////////////////////////

〜import省略〜

public class AddItemAction extends Action {

    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        CartForm cartForm = (CartForm) form;

        Item item = SearchItemLogic.findById(cartForm.getId());

        HttpSession session = request.getSession();
        ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
        cart.add(item); //★

        return mapping.findForward("success");
    }
}

6

回答

6103

閲覧

6件の回答

評価

0

Strutsの設定ファイルがどうなっているか判らないのですが、スコープがsessionではなくrequestの場合、forwardされてようがrequestの範囲内ならスコープ内になりますよね?
Strutsの設定ファイルで、フォームオブジェクトのスコープを決めていると思いますよ。

それをソースで具体的にどうやっているかを知りたいという話でしたら、StrutsよりサーブレットやJSPを勉強した方がいいと思います。

評価

0

ひろちゃん 様

ご回答ありがとうございます。
おっしゃっている意味は分かるつもりです。

★部の処理結果をフォワード先で利用できるようにするには、
cartオブジェクトをrequestかsessionスコープに格納する処理(setAttribute())をしていなければ、いけないと思いますが違いますでしょうか?

ちなみにstrutsの設定ファイルでは、オリジナルクラス(CartForm)のformビーンオブジェクトがrequestに格納されるようになっています。

評価

0

setAttributeをするとは、どこに対して行うのでしょうか?
Actionクラスは、単なるJavaのクラスであって、サーブレットクラスを継承したものとは異なります。
ちなみに、ActionクラスとJSPを繋ぐ処理はActionForwardが担当しています。ここはフレームワークの担当部分で、ユーザーが意識しなくても良いようになっています。
フレームワークはあくまでも全体でサーブレットになっているのであって、ユーザーが書き換える部分はその一部にすぎません。
WebアプリケーションはつまるところクライアントのFormとのやり取りなので、FormクラスのBeanだけ、特別扱いされている作りになっていますよね。

評価

0

> setAttributeをするとは、どこに対して行うのでしょうか?
この文章はややこしいですね。(汗)

どこへsetAttributeしなければいけないかは、Strutsは設定ファイルで既に知っていることですよね。

ということです。

評価

0

というか、単純に既にセッションにバインドされているインスタンスを操作しているからでは。

変数名cartにgetAttributeしているShoppingCartインスタンスは、HttpSessionからremoveされていませんよね?

だから、リクエストAとリクエストBがあったとして、それぞれHttpSessionからgetAttribute()しても、得られるのは同一インスタンスではないでしょうか?

だから、Strutsというよりは基本的なJavaの仕様ですね。

評価

0

ひろちゃん 様

再度のお返事ありがとうございます。
説明下手で申し訳ありませんでした。どこへsetAttributeしたいかを記載しておけばよかったです。
教材では上記のソースが記述されているのですが、

〜上記より一部抜粋+「私の推測」〜
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
cart.add(item); //★
session.setAttribute("cart",cart); //◎

私は「◎部」の1行がなければforward先で、ShoppinCartオブジェクトcartを参照した時に、「追加されたitem」を参照することができないのでは?と考えているのですが、いかがでしょうか?
実際、◎部処理がないソースのままで利用してもforward先では追加されたitmeオブジェクトを参照することができるので、これがなぜなのだろうか?
と悩んでいるわけです。。。


これ 様
ご回答ありがとうございます。
これ様がおっしゃるようにShoppingCartインスタンスはremoveされておりませんので、同じブラウザからのリクエストAとBであれば、同一の内容を確認することができると思いますが、当方の疑問とは違う内容のような…!?

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。