質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Q&A

解決済

1回答

6528閲覧

【Struts2】sessionに"#"を付けて値を取り出す時と付けずに取り出す時の違いは?

RogerFederer

総合スコア19

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

1グッド

1クリップ

投稿2018/10/30 17:30

編集2018/10/30 18:08

SessionAwareをimplementsしてsessionへ「xxx」という値を格納するとします。

Java

1DoSomethingAction.java 2 3public class DoSomethingAction extends ActionSupport implements SessionAware { 4 private Map<String, Object> session; 5 6 public String execute() { 7 session.put("xxx", xxx); 8 return SUCCESS; 9 } 10 11 public void setSession(Map<String, Object> session) { 12 this.session = session; 13 } 14} 15

そしてJSPでsessionからxxxを引き出すときは以下のように"#"記号を付けるのが通常だと思っています。

JSP

1<s:property value="#session.xxx"/>

しかし、ActionクラスにMapのgetterを書くことで、以下のように**"#"記号なし**でもsessionから値を引っ張ってこれています。

JSP

1<s:property value="session.xxx"/>

StackOverflow上での似た質問を読んでみると、

・"#"が付く場合はActionContext内でValueStack以外のオブジェクトへアクセスする
・"#"なしの場合はActionContext内でValueStack内のオブジェクトへアクセスする

という風に書いてあったのを読んだのですが**「だから何?具体的にどう違うの?」という疑問を抱えております。**

  1. ValueStackの中にActionクラスのプロパティとしてのsessionマップオブジェクト
  2. ActionContextの中にもともとStruts2側で定義済みのsessionマップオブジェクト

この2種類(?)のsessionマップオブジェクトが同時に存在している状態らしい、ということかなと思っているのですが、一見、どちらの場合でも「正しく表示ができている」という結果に違いはないのでなおさら何が違うかが分からず。。

上記1、2の私のイメージ図です↓
イメージ説明

"#"あり、"#"なしでそれぞれ値を取り出す場合の具体的な違いをご説明いただけると非常にありがたいですm(_ _)m

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

それは ActionクラスのSessionAwareを実装してセッション属性のキー+値をMapに格納したフィールド名が session なだけであり、Actionクラスに getSession() を記述することで、Struts2のJSPからは、Actionクラスから渡ってきた変数として session の名前で参照できている、ということです。

一方、#session を使うことで、Struts2は、JSPのセッション属性から参照します。

なので結果的に同じものが取得できますが、Actionクラスのセッション属性Mapへのアクセサ(getメソッド)は追加しないのが良く、その理由として、ActionクラスからJSPへのフォワードの間に挟まるインターセプタやフィルタの内容によって変更もでき、その処理内容によっては、必ず同じ状態になっているとは限らないからです。

投稿2018/10/31 05:57

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RogerFederer

2018/11/01 00:01

確実な参照をするためにActionクラスにgetterなしでJSPで”#”を付けた方が良い、と理解しました。 いつもご対応頂きありがとうございますm(_ _)m
A-pZ

2018/11/01 03:00

d(・ω・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問