見出し画像

職業訓練でJavaを学ぶ!28日目(2/2)「Javaプログラミング実習(JSP/Servlet編)」

職業訓練で、Javaを使ったWebシステム開発・Androidアプリ開発を学ぶことになりました。復習かねて情報発信をします!
これから職業訓練に通うことを検討している方の参考になれば嬉しいです。

↓↓職業訓練に通うことになった経緯はこちら
https://note.mu/yukoro/n/ned8d43b0110d

本日の授業

・リクエスト処理
・状態維持 ←この記事


状態維持

ここでの状態維持とは、要は取得したデータをどう保持していくかということです。

Webには取得したデータを一定期間保持しておくための「クッキー」や「セッション」という仕組みが備わっています。

Webサーバとクライアントの通信はリクエストごとにリセットされるステートレスな通信であるため、Webサーバはリクエストをまたいでユーザーを識別するということができません。これではショッピングカートに入れた商品を一定の期間保持しておくといったことはできません。

このような状況を解消するために、「クッキー」や「セッション」があるのです。

おそらくインターネットを日常使っているユーザーは全員、無意識のうちにこれらの機能を利用しています。


Cookie(クッキー)

まずはクッキーのしくみと使い方を説明していきます。

インターネットを利用してショッピングサイトを訪れた際などに、過去に閲覧したことのある商品がおすすめ商品として表示された事はきっとありますよね。

このような仕組みはCookieという仕組みを使って実現しています。

■Cookieとは
Webサーバからクライアントにデータを送って、そのデータをクライアントに保存できる仕組みです。

Webサーバもクライアント側に保存したこのデータを参照することが可能です。2回目以降にクライアントが再びサーバにアクセスする際に、保存したCookieのデータを含めることができます。


例えば、1回目にクライアントがサーバにアクセスした(リクエストを送った)際はCookieはありません。そのリクエストに対して、サーバーがクライアントにレスポンスを返すわけですが、その際に「Cookie情報を登録せよ」という情報も一緒に戻します。
そして再びクライアントがサーバーに2回目のレスポンスを送る際に、前回クライアント側に保存されたCookieデータが一緒にサーバに送られ、サーバーはリクエストとCookie情報を含めた情報を元にクライアントにレスポンスを返します。


Cookieの特徴をまとめると下記のようになります。
--------------
期間:中期的な決められた期間
目的:際訪問時のデータの利用
データの例:言語設定などの各種設定、過去にチェック済みの商品
データの保存場所:クライアント側
--------------


■Cookieの操作

Cookieをセット
クライアントにCookieを送り保存させる
 ・Cookieクラスのインスタンスを生成
 ・インスタンスに設定を行う
 ・addCookie()メソッドで登録作業を行う

Cookieを参照
クライアントが保存しているCookieを参照する
 ・getCookie()メソッドを使用する


■Cookieのセット
それではサーバーがクライアントに、どのようにCookieをセットするかを見ていきます。

◇Cookieクラスのインスタンスを生成
まずはクッキー名と値を指定してCookieクラスのインスタンスを生成します

書式:
-----------
Cookie 変数 = new Cookie(クッキー名, 値);
-----------

この時Cookieに日本語を保存する場合は、値をURLエンコードする必要があります。逆にCookieを参照する場合はURLデコードを行います。

書式:
-----------
URLEncoder.encode("日本語", "UTF-8")
-----------

例)日本語の値をエンコードして、Cookie情報を変数「c」に格納

Cookie c = new Cookie("cookieName", URLEncoder.encode("日本語のクッキー名", "UTF-8"));

◇インスタンスに設定を行う
生成したインスタンスに、各種設定を行います

Cookieに設定を行うメソッドとして次のようなものが用意されています。

<Cookieの設定メソッド>
-------------
void setMaxAge(int expiry)
 - クッキーの存続期間を秒単位で設定。0でクッキーを削除。負の値だとブラウザ終了時まで有効。
 - デフォルト:ブラウザ終了時まで有効
void setPath(String uri)
 - クッキーが有効になるパスを指定。指定されたパスとそのサブディレクトリが有効範囲。
 - デフォルト:現在のパス
void setDomain(String pattern)
 - クッキーが有効になるドメインを指定。
 - デフォルト:クッキー送信元のドメイン
void setSecure(boolean flag)
 - HTTPSなどSSLが有効な場合のみクッキーを有効にするかどうか
を指定。
 - デフォルト:false
-------------

◇addCookie()メソッドで登録作業を行う
JSPの暗黙オブジェクトである responseオブジェクトの addCookie() メソッドでクッキーを登録します。

書式:
-------------
response.addCookie("生成したオブジェクト名");
-------------


実際にCookieのインスタンス生成と設定を行ってみます。

例)idというCookieに値5をセット、有効期限やパスを設定、登録を行う

// Cookieクラスのインスタンスを生成
Cookie c = new Cookie("id", "5");

// Cookieに各種設定
// 有効期限を2日後に設定(秒数で指定)
c.setMaxAge(60 * 60 * 24 * 2);
//Cookieが有効になるパスを設定
c.setPath("/item/");

//設定したCookieの登録
response.addCookie(c);


■Cookieの参照
request オブジェクトの getCookies() メソッドでCookieオブジェクトの配列を得ることができます。

書式:
------------
Cookie[] cs = request.getCookies();
------------

<Cookieの参照メソッド>
------------
String getName()
 - Cookieの名前を返す
String getValue()
 - Cookieのを返す
------------


実際にCookieの参照を行ってみます。

例)idという名前のCookieの値を取り出す

Cookie[] cs = request.getCookies();

//Cookieの初期値にnullを設定
String id = null;

//もしCookieの値がnullじゃなければloopで値を取り出す
if (cs != null) {
    for (Cookie c : cs) {
        if (c.getName().equals("itemId")) {
            // デコードする場合は右辺を下記にする
            // URLDecoder.decode(c.getValue(), "utf-8");
            itemId = c.getValue();
        }
    }
}


 <Cookie参照時の注意点>
addCookie()で登録されたクッキーの値が、getCookies()で取得できるのは、addCookie()が呼び出された次のアクセス以降です。


■ChromeでのCookie操作

Chromeでは、このようにしてクッキー情報の表示を行うことができます。
-----------
F12キーでDeveloper Toolを開く
「Applications」⇒「Storage」 ⇒「Cookies」
-----------


Session(セッション)

次はセッションのしくみと使い方について見ていきましょう。

■Sessionとは
Webサイトにアクセスしたユーザ(正確にはWebクライアント)についての情報を、サーバ上に保持する仕組みです。

クライアントがサーバにアクセスすると、セッション IDが発行され、Cookieでクライアント側に保存されます。それと同時に、サーバー側にはクライアントごとのデータ保存領域が確保され、Cookieに保存されたセッション IDでクライアントを識別することができます。ます。この保存領域とクライアントはセッションIDで紐づけられており、今後このセッションIDを使い、サーバ側にあるユーザごとのデータ保存領域を参照します。

Sessionの特徴をまとめると下記のようになります。
--------------
期間:目的を果たすまでの期間
目的:買い物、会員登録、会員ページの閲覧
データの例:カート内の商品、入力中の個人情報、ログイン認証
データの保存場所:サーバ側
--------------


■Sessionの操作

Sessionへのデータの保存
 - setAttribute()メソッドを使用

Sessionからのデータの取得
 - getAttribute()メソッドを使用

Sessionの破棄
 - 特定のセッションを破棄する場合は、removeAttribute()メソッドを使用
 - 全てのセッションを破棄する場合は、invalidate()メソッドを使用


■Sessionへのデータの保存
JSPの暗黙オブジェクトであるsessionのsetAttribute()メソッドを利用し、データを保存します。
セッションの場合は日本語を保存する場合でもURLエンコードする必要はありません。

書式:
------------
session.setAttribute(キー, オブジェクト);
------------

例)「item」というキーに「テレビ」というオブジェクトを保存

session.setAttribute("item", "テレビ");


■Sessionからのデータの取得
SessionオブジェクトのgetAttribute()メソッドを利用し、データを取得します。

書式:
------------
Object object = session.getAttribute(キー);
------------

例)キー「item」にあるオブジェクトを取得

String item = (String) session.getAttribute("item");


■Sessionの破棄
特定のSessionデータを破棄することも可能です。その場合は次のように記述します。

書式:
-----------
Object object = session.removeAttribute(キー);
-----------

全てのSessionデータを破棄する場合はこのように記述します。

書式:
------------
session.invalidate();
------------


■Sessionの有効期限
Sessionデータの有効期限はサーバによって設定が異なります。そのため、クライアントからのアクセスがない状態で有効期間を経過するとサーバ側でセッションが自動的に破棄されることになります。

Tomcatの場合はweb.xmlファイルでセッションの有効期限が設定されています。

例えば下記のような設定になっている場合は30分でセッションが切れます。

例)Tomcat(web.xml)の有効期限の設定が30分になっている場合

<session-config>
<session-timeout>30</session-timeout>
</session-config>


================

補足:アプリケーション属性
Webアプリケーション全体で共有するデータを格納する領域をアプリケーション属性と呼びます。

アプリケーション属性として保存されたデータは、全ユーザ、全画面で利用することができ、JSPでは application という暗黙オブジェクトからアクセスできるようになっています。

書式:
------------
Object object = application.getAttribute("someValue");
------------

================


状態維持については以上です。

最後までお読みいただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?