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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

servlet

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

Q&A

解決済

4回答

6636閲覧

このサーブレットが何をやっているのか途中から理解できません。

R.lawliet

総合スコア41

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

servlet

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

0グッド

1クリップ

投稿2015/06/05 00:37

###前提・実現したいこと
現在提供されたサーブレットのサンプルを解読しながら類似の課題を進めております。
しかしどうしても自分の検索力では理解出来ない部分があるので、
ご教授いただけないでしょうか?

具体的には、ArrayLIST<>が出現するあたりです。
PLANBEAN_LISTは、
入力された今までの情報全てを詰め込む為のリスト??だと思うのですが。
しかしいつどこで宣言されて出現したのでしょうか?

###発生している問題・エラーメッセージ

###ソースコード

lang

1package servlet; 2 3import java.io.IOException; 4import java.util.ArrayList; 5import java.util.List; 6import javax.servlet.ServletException; 7import javax.servlet.http.HttpServlet; 8import javax.servlet.http.HttpServletRequest; 9import javax.servlet.http.HttpServletResponse; 10import javax.servlet.http.HttpSession; 11import bean.PlanBean; 12 13public class Controller extends HttpServlet { 14 private static final long serialVersionUID = 1L; 15 16 @SuppressWarnings("unchecked") 17 public void service(HttpServletRequest request, HttpServletResponse response) 18 throws ServletException, IOException { 19 20 try{ 21 //リクエストの文字コードをセットする。 22 request.setCharacterEncoding( "Shift_JIS" ); 23 24 /* クライアントから送信された入力情報を取得する */ 25 String sMonth = (String)request.getParameter("month"); 26 String sDay = (String)request.getParameter("day"); 27 String sStart = (String)request.getParameter("startTime"); 28 String sEnd = (String)request.getParameter("endTime"); 29 String sContents = (String)request.getParameter("contents"); 30 String sCategory = (String)request.getParameter("category"); 31 32 /* クライアントの入力情報を加工しPlanBeanにセットする */ 33 PlanBean pb = new PlanBean(); 34 pb.setDate( sMonth + "/" + sDay ); 35 pb.setTime( sStart + "-" + sEnd ); 36 pb.setContents( sContents ); 37 pb.setCategory( sCategory ); 38 /* requestスコープへクライアントの入力情報をセットする */ 39 request.setAttribute("PLANBEAN",pb); 40 41 42 43//↓↓↓ここからが分かりません 44 45 /* クライアントの入力情報をsessionスコープへ追加する 46 * sessionスコープがnullであれば 47 * 初回リクエストと判断しインスタンスを生成する 48 */ 49 HttpSession session = request.getSession(); 50//↓この↓↑の間が一番わかりません。 51 List<PlanBean> list = 52 (ArrayList<PlanBean>)session.getAttribute("PLANBEAN_LIST"); 53//↑いきなりPLANBEAN_LISTが出現したことに戸惑いを隠せません。 54 55 if( list==null ) list = new ArrayList<PlanBean>(); 56 list.add(pb); 57 58 /* sessionスコープへクライアントの入力情報履歴をセットする */ 59 session.setAttribute("PLANBEAN_LIST",list); 60 61 }finally{ 62 /* jspへ転送する */ 63 response.setContentType("text/html; charset=Shift_JIS"); 64 request.getRequestDispatcher("/jsp/output.jsp").forward(request, response); 65 } 66 } 67} 68

どうかよろしくお願いします。

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

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

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

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

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

guest

回答4

0

こんにちは。

lang

1//①セッションからPLANBEAN_LISTを取り出す 2List<PlanBean> list = (ArrayList<PlanBean>)session.getAttribute("PLANBEAN_LIST"); 3 4//②取り出したPLANBEAN_LISTがNULLならnewする 5if( list==null ) list = new ArrayList<PlanBean>(); 6//③今回の値をセットする。 7list.add(pb); 8//④セッションにPLANBEAN_LISTをセットする。 9session.setAttribute("PLANBEAN_LIST",list);

1.初回起動
①セッションからPLANBEAN_LISTを取り出しますが、セットされてないのでNULLになります。
②PLANBEAN_LISTがNULLなのでnewされます。
③今回の値をPLANBEAN_LISTにセットします。
④セッションにPLANBEAN_LISTをセットします。

2.二回目以降の起動
①セッションからPLANBEAN_LISTを取り出します。初回起動の時にセットされているので取得できます。
②PLANBEAN_LISTがNULLではないので、何もしません。
③今回の値をPLANBEAN_LISTに追加します。
④セッションにPLANBEAN_LISTをセットしなおします。

このような感じいかがでしょうか?

投稿2015/06/05 01:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

R.lawliet

2015/06/05 01:44

分かりやすくまとめて頂きありがとう御座います。 ようやく全貌が見えました。 ifの外にlist.add(pb);があったのですね、これを読み違えて疑問が広がっておりました。
退会済みユーザー

退会済みユーザー

2015/06/05 01:50

コメントでも書かれていましたが{}をつけることをお勧めします。 プログラム関係の書籍にも、機能はありますが視認性の問題から{}をつけることをお勧めしますみたいなことが載っていたの覚えています。
guest

0

ベストアンサー

セッションコンテキストをご存じでしょうか。
ざっくり言うと、セッション単位でデータを持ちまわる入れ物です。
Mapのように「キー=値」という形でデータを保持しておけます。
突然出てきたように見えるArrayListは、"PLANBEAN_LIST"というキーで
セッションコンテキストにあらかじめ保持されていたオブジェクトを取り出しているのです。

なので、いつ作られたかというと、前回このサーブレットが呼ばれた際に作られました。
最初にサーブレットを呼んだ場合は作られていませんので、セッションコンテキストにも入っていません。
そこでNullを判定して新規作成していますね。

セッションスコープと、オブジェクトのライフサイクルを学ぶと理解できると思います。

投稿2015/06/05 01:06

kawamori

総合スコア61

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

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

R.lawliet

2015/06/05 01:18

5回くらい読み直してやっと理解が出来ました。 新規作成するときは、 list.add(pb);でnullの中身に上書きしたのが分かるのですけれど、 "PLANBEAN_LIST"という形で呼び出された時はどこの瞬間でpbの内容をくっつけているのですか? List<PlanBean> list = (ArrayList<PlanBean>)session.getAttribute("PLANBEAN_LIST"); ここの中のどこかだと思うのですが・・・ (ArrayList<PlanBean>)の所がまだ理解出来ません。
kaputaros

2015/06/05 01:32

"PLANBEAN_LIST"でセッションにsetしているのは、 session.setAttribute("PLANBEAN_LIST",list); の部分ですよ。 ここで、キー:"PLANBEAN_LIST" と 値:list を紐付けてます。 List<PlanBean> list = (ArrayList<PlanBean>)session.getAttribute("PLANBEAN_LIST"); の部分は、値をセッションから取り出しているだけ。 ちなみに、キーは、setする時とgetする時とに同じ値を使えば、任意のものでもかまわないんですよ。 今回のソースでは、たまたま分かりやすいように"PLANBEAN_LIST"としているだけです。
R.lawliet

2015/06/05 01:49

ようやく理解が追いつきました。 一番悩んでいる部分を汲み取ってのご説明を頂いたのでベストアンサーを送ります!!
guest

0

問題の箇所ですが、簡単に言うと、
PLANBEAN_LISTArrayList<PlanBean>が入っているかどうか分からないけど、とりあえず取り出してみて、nullだったら初回リクエストと判断して新しくArrayList<PlanBean>を作るよ」みたいな感じです。

2回目以降のリクエストの場合でセッションがまだ有効なら、PLANBEAN_LISTに前回のリクエストでセットしたArrayList<PlanBean>が取得できますので、list==nullfalseになります。

投稿2015/06/05 00:53

argius

総合スコア9388

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

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

R.lawliet

2015/06/05 01:23

1周目でPLANBEAN_LISTを作って2周目以降で呼び出してたんですね、 やっとここはわかりました。 しかし2回目以降の呼び出した瞬間は 前回までの入力情報が入ったPLANBEAN_LISTだと思うのですが、 どこで今回の情報がPLANBEAN_LISTに加わっているのでしょうか? 恐らくはList<PlanBean>とArrayList<PlanBean>の違いがよく理解出来ていないあたりが鍵だと思うのですが・・・
argius

2015/06/05 01:29

list.add(pb); はif文に関係なく実行されますので、今回の情報はそこで追加されます。 このifのぶら下がり文の書き方は読み間違いやすいですね。
R.lawliet

2015/06/05 01:37

あ、ifの中じゃなかったんですね笑 理解出来ました。 ifの{}省略出来る事を最近知ったのですけれど、 自分で書く時は絶対付けるようにしたいと思います。
guest

0

HttpSession.getAttribute

java.lang.Object getAttribute(java.lang.String name)
指定された名前でこのセッションに結びつけられているオブジェクトを返します。 指定された名前に結びつけられているオブジェクトが存在しない場合は null を返します。

と書いてありますので、"PLANBEAN_LIST" ← これはセッション名ですね。

List<PlanBean> list には セッションに結びつけられているオブジェクトかnull が返ります。

if( list==null ) list = new ArrayList<PlanBean>();
list.add(pb);
nullの場合 クライアントの入力情報を加工したPlanBean pb
を"PLANBEAN_LIST"このセッションに書き込む処理がされていますね。
session.setAttribute("PLANBEAN_LIST",list);

投稿2015/06/05 00:49

MasaakiIrie

総合スコア1021

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

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

R.lawliet

2015/06/05 01:26

session.setAttribute("PLANBEAN_LIST",list); ここが初めてPLANBEAN_LISTという名前が付けられた瞬間ですね!! やっとちょっとわかりました。 前回までの入力情報が入ったPLANBEAN_LISTが2周目以降で呼び出されると思うのですが、 どこで今回の情報がPLANBEAN_LISTに加わっているのでしょうか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問