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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

3回答

2787閲覧

セッションスコープの取得とは。Java Servlet JSP

Aspiration

総合スコア6

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2021/06/16 06:57

編集2021/06/16 08:22

Sessionスコープに登録ユーザーを保存する時の話なのですが、
ある参考書での話で、その時の構文に違和感を感じております。
実際のコードは後述しておりますのでそちらを参照ください。

・セッションスコープの取得
・セッションスコープに保存
という言葉があり、後述しているコードはこの順で記載しております。

私はどうもこれが逆なのではないかと思っています。
保存したところから取得するのでは?と。

例えば、リクエストスコープの話で比較すると
リクエストスコープに保存するには
request.setAttribute("〇〇",〇〇);
という構文を使います。
ここに保存されてはじめてリクエストスコープの中に値がある、
認識です。
しかし、今回Sessionスコープの時は
setAttributeをする前に「取得」という表現を使用しています。
つまり、保存されていないのに「取得」なんてできないのでは、という事です。

ただ、思考している中で一つの仮説を立てました。
「セッションスコープの取得」
とは保存しているところから取得するのではなく、
セッションスコープという領域を新たに作る事を指しているのでは?と。

認識が間違っていればご指摘頂ければと思います。

Sessionの構文そのものの話なので、下記のご指摘はご遠慮します。
・全体のプログラムや流れを記載しろ
・この変数は一体なんだ

Java

1//セッションスコープに登録ユーザーを保存 2HttpSession session = request.getSession(); 3session.setAttribute("registerUser", registerUser); 4

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

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

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

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

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

K_3578

2021/06/17 02:25 編集

結局リクエストスコープについての疑問だったのかセッションスコープについての疑問だったのか よくわからない。 何が聞きたかったのだろう?
K_3578

2021/06/17 02:25

リクエストスコープは 保存→取得 セッションスコープは 取得→保存 って書いてあるからなんで逆なの?ってことなのかな? 良かったら答えてくれると助かります。
Aspiration

2021/06/17 02:39

ご指摘ありがとうございます。 表題の通り、セッションスコープの取得についてです。 仰る通り、なぜ逆なのか、という事です。
K_3578

2021/06/17 05:57

解決済のようですが回答してみました。
guest

回答3

0

多分ちょっと理解が誤っているのでは?と思いました。
まず、リクエストスコープでは、

Java

1request.setAttribute("registerUser", registerUser);// インスタンスをスコープに保存 2型 インスタンスに付ける参照変数名 = () request.getAttribute("registerUser");//リクエストスコープからインスタンスを取得する

こうなると思います。

続いてセッションスコープの場合

Java

1HttpSession session = request.getSession(); //現在のセッションを返す/セッションを作成する 2 3session.setAttribute("registerUser", registerUser); //インスタンスをスコープに保存 4 5型 インスタンスに付ける参照変数名 = ()request.getAttribute("registerUser"); //セッションスコープからインスタンスを取得する

こうなると思います。

セッションスコープの場合は、HttpSession session = request.getSession();
で、まず現在のセッションを返す、またはセッションを新しく作るという事をするのですが、
それを取得するという表現で誤解しているのではないでしょうか。

投稿2021/06/17 03:35

K_3578

総合スコア1282

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

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

Aspiration

2021/06/24 01:17

とてもわかりやすい解説ありがとうございます!
K_3578

2021/06/24 01:21

結局、解釈の誤りによって生じた誤解ということで良かったのでしょうか?
Aspiration

2021/06/30 03:36

はい、私の解釈の誤りでございます。 ありがとうございます
K_3578

2021/06/30 03:38

了解しました。フィードバックありがとうございます。
guest

0

Java

1HttpSession session = request.getSession(); // <- sessionを取得して 2session.setAttribute("registerUser", registerUser); // <- sessionに保存

何も問題ないように思いますが…

投稿2021/06/16 07:10

Luice

総合スコア771

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

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

Aspiration

2021/06/16 07:27

私の文章が悪かったのでしょうか。 一つ確認したいのですが、 私の文章を読んで頂いてから質問していますか。
Luice

2021/06/16 08:09 編集

認識が間違っているか、という事でしたら間違っています。 セッションは最初にリクエストした時に自動的に作成されます。 セッションは一度生成したらセッションが有効な間はずっと引き回されるものです。 特別な理由が無い限り再作成はされません。 作成したセッションはメモリー上や、DBなどに保存されており、サーバー側で管理されます。 またセッションを作成した際にセッションIDをクライアントに払い出します。 クライアントから要求がある度にサーバーはこのセッションIDを見てセッションを呼び出します。 追記 セッションスコープはそのセッションが有効な範囲の事を指します。 プログラマーなら変数と変数スコープと似たような概念と言えば理解しやすいかもしれません。 (変数を取得するとは言うが、変数スコープを取得とは言わない)
Aspiration

2021/06/16 08:09

仰っている事は理解できます。 しかし、それが私の疑問にどの様に繋がっているのかわかりかねております。
m.ts10806

2021/06/16 08:24

「何も問題がないところにわざわざ問題があるように持っていっている」という印象です。 言語仕様となるところなので「そういうもの」と飲み込むことは難しいですか?ここに突っ込んでいったところで理解は深まらないと思います。
Aspiration

2021/06/16 08:36 編集

HttpSession session = request.getSession(); これ自体はリクエストスコープに保存されているモノを取得する事もできるが、 リクエストスコープに保存する際は必ず、 HttpSession session = request.getSession(); という工程を踏む必要がある、という事で、 理由は これは単なるルールであり、そこを気にする必要はない、 という解釈であっていますか。 もし、本当にそうであるなら、 一つの構文で二つの利用用途があり、 その意味が明確化されていないのであれば 私の様に混乱をする人がいても普通、おかしくないと思うのですが そちらはどの様に理解してらっしゃるのでしょうか。 コードを記述する際は何かしら根拠をもって書きたいと 私は考えています。
m.ts10806

2021/06/16 09:30

>一つの構文で二つの利用用途があり、 何を主張したいのか今ひとつ不明ですけど そもそもHttpServletRequest.getSession()は下記のようなリファレンスにある通り > https://spring.pleiades.io/specifications/platform/8/apidocs/javax/servlet/http/HttpServletRequest.html#getSession-- > このリクエストに関連付けられている現在のセッションのセッション ID を変更し、新しいセッション ID を返します。 という役割を持っています。それ以上でもそれ以下でもなく、根拠も何も「そういう仕様」です。 「意味」とはどこまでの何を求められているのか分かりかねます。 だから「なにが問題なの?」と疑問符しか浮かんでません。 >私の様に混乱をする人がいても普通、おかしくないと思うのですが 極稀に変なこだわりを持った人が発生することはありますが、「普通」はいません。 構文とは「言語仕様に則り記述すべきもの」だからです。 メソッド名の由来や意味まで求めているなら「作った人に聞いて」となります。 どの言語にもありますよ。ネーミングと役割がなんかずれてるような機能って。でもそれが言語仕様なので、ドキュメントを確認して機能を理解し、利用します。
Aspiration

2021/06/17 01:41 編集

私の文章の書き方も悪いかもしれませんが、 前回の私の質問にお答えした時も 「作った人にきいて」 と仰っていました。 その一言で全ての事がそれで片付いてしまいますし、 このテラテイルで質問している意義に反していると考えます。 それでは何の意味もないので、 せっかくお答え頂いて大変心苦しいのですが 次回から私の質問にお答えする時、 その様な事を発言するならご遠慮願いたいと思います。
m.ts10806

2021/06/17 01:49

書き方が悪いと自認されてるなら改めれば良い話では。思ってないから自身のスタンスを変えないのでしょうけど、変えられないのでしたらおおよそ誰でも同じような対応になります。 「作った人しかわからない」は真実で本質です。 プログラムは書いたとおりにしか動かないので、想像だけで答えたい人は少ないと思います。 想像で伝えて本来の意図とは間違った解釈をすると困るのはその人だからです。 それをなんの意味もないと切り捨てるのであればあなたの疑問に応えたいという人はそのうちいなくなります。
Aspiration

2021/06/17 02:09 編集

Try & Error を繰り返し、色々と試行錯誤を繰り返して文章も鍛錬しているのです。 なので、 改めれば良い→思っていないから自身のスタンスを曲げない そんなすぐに、ただちに、良くなる訳ではないと思います。 文章構成の中に、Javaについて未熟であるがゆえに起因している事もあると思います。 >想像だけで答えたい人は少ない 勿論、あなたの仰る通りですし、疑問の余地はありませんし、 私もそう考えております 伝えたい本質ではなく、表面上の言葉をきりとって攻撃するのはやめて頂きたいです。 わざわざ 「書いた人にきいて」 と記載する事に違和感を感じていると、 ここでは申し上げております。 (実際の開発現場では、 作った人の意図がわからないまま現場から去っていく人もいます。なので更に違和感を感じます)
m.ts10806

2021/06/17 02:11 編集

>「書いた人にきいて」 と記載する事に違和感を感じている 違和感も何も、意図を問う場合、書いた人以外、他人には応えられないという意味です。投稿者がそれを分かってないようだから伝える。 それで本当に確認してきて結果を投稿された方もいますよ。そういう人はちゃんと正しく伸びます。
Aspiration

2021/06/17 02:24

とても謙虚な方なら、恐らくどんな人の意見も受けれ入れると思います。 しかしながら、 あなたからの回答は今までの私が質問した中で、 毎度横暴に感じられます。 なので、今後私の質問に対してお答え頂くのはご遠慮頂ければと思います。
guest

0

自己解決

自己解決しました。
アプリケーションサーバはHttpSessionインスタンスを作成
(あるユーザーにとって最初のgetSession()を実行)
すると、内部でセッションIDと呼ばれるIDを…
という文章から、
HttpSession session = request.getSession();

session.setAttribute("registerUser", registerUser);
の前に記述しているのは、
まず、初めにインスタンスを作成しているから、
という事でした。
つまり、これは実際には
リクエストスコープに保存されているモノを取得している訳ではなく、
インスタンス生成だという事がわかりました。

ソース
スッキリわかるJSPサーブレット

投稿2021/06/16 09:41

編集2021/06/24 01:18
Aspiration

総合スコア6

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

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

m.ts10806

2021/06/17 01:53

「インスタンスを生成している」という根拠を自己解釈ではなく出典明示されないと誰の役にも立たない投稿になります。
Aspiration

2021/06/17 02:22

ご指摘ありがとうございます。 後ほど記載いたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問