【Java】Webスコープ(データの有効範囲)

<!-- タイトルを記述 -->
# Webスコープ

「スコープとは、データの有効範囲」

<!--  上記の詳しい説明 -->
## 【説明】

Webスコープとは「サーブレットやJSPをまたいでデータを共有したい場合に用いる保存領域」のことです。ショッピングサイトやアプリなどは、多くの情報を載せるのでWebページは複数にわたりますが、ページが切り替わるたびにログインIDやパスワードを入力するのは手間なので、入力情報を保持しておく仕組みがあり、その有効範囲を「スコープ」と呼ぶ。

<!-- メリット「使うことのメリット」 -->
## 【メリット】
ページをまたいでも入力情報を保持しておくことができる。

<!-- 特徴「特筆すべき所」 -->
## 【特徴】
Servletでは共有範囲に応じて以下のの3つのスコープがあります。

- リクエストスコープ(requestスコープ)
- セッションスコープ(sessionスコープ)
- アプリケーションスコープ(applicationスコープ)

それぞれの詳細は以下です。

| スコープ名                                | クラス名           | 内容                                                                                                                                                                                                                                      | 使用例                                                                    | 
| ----------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | 
| アプリケーションスコープ(application)<br> | ServletContext     | Webアプリケーション自体を指し、最も広い有効範囲を示します。<br>アプリケーション・サーバーが終了しない限り保持されるスコープ。<br>ブラウザを閉じても保持されます。<br>                                                                     | マスターデータのキャッシュやアクセスカウント数の保管                      | 
| セッションスコープ<br>(session)           | HttpSession        | ある特定のWebクライアントとWebサーバの通信を1つの単位として扱い、<br>その通信が閉ざされるまでの間を有効範囲とします。<br>ブラウザを閉じない、あるいはタイムアウトしない限り保持されます。                                                 | ショッピングカード内容の保存 / 各ユーザーのログイン・ログアウト状態の記録 | 
| リクエストスコープ<br>(request)           | HttpServletRequest | クライアント（ブラウザ）から1回のリクエストの間だけを有効範囲とします。<br>ブラウザからのリクエスト毎に生成されます。<br>次のリクエストが来た場合やブラウザを閉じたり、<br>アプリケーション・サーバーが再起動した場合は原則保持されません | ログインIDやパスワード情報の保管                                          | 


<!-- 使用場面 「いつつかうか？」「どこで、つかうか？」-->
## 【使用場面】
サーブレットのdoGetやdoPostメソッド内でスコープに保存し、
フォワードメソッドで次に引き渡す使い方が多い。

<!-- 使用方法「どう使うか？」「どうやって使うか？」-->
## 【使用方法】


### 【一覧】各スコープのデータ操作で使用するメソッド
各スコープのデータ操作で使用するメソッドについて解説します。各スコープごとに属するオブジェクトは異なりますが、メソッドは各オブジェクトで共通のものが定義されています。

下記にWebスコープの セッション を使用した属性を設定する例を示します。

| 戻り型       | メソッド                      | 説明                                                                                                                                                     | 
| ------------ | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | 
| Object       | getAttribute(String)          | 引数に指定されたデータ名に該当するデータ値を返します。該当のデータ名がない場合にはnullを返します。                                                       | 
| Enum eration | getAttributeNames( )          | スコープで利用可能なすべてのデータ名を返します。                                                                                                         | 
| void         | removeAttribute(String)       | 引数に指定されたデータ名をスコープから削除します。                                                                                                       | 
| void         | setAttribute( String, Object) | 第一引数にデータ名、第二引数にデータ値を指定し、スコープにデータを登録します。すでにデータ名が存在する場合は、新しく指定されたデータ値が上書きされます。 | 


<!-- ここから 各キャプチャー↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -->
<!-- サンプルコード、サブセクションを記述↓↓↓↓↓ -->

<!-- 基本構文など -->
## 【書き方】doGet,doPostメソッドの宣言
doGetメソッドとdoPostメソッドの宣言部分のテンプレートは次の通り。

```java
// doGet
Public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException{
}

// doPostも同じ
Public void doPost(HttpServletRequest request, HttpServletResponse response)
      Throws ServletException, IOException{
}
```

<!-- 基本構文など -->
## アプリケーションスコープ
アプリケーション・サーバーが終了しない限り保持されるスコープ。ブラウザを閉じても保持される。webアプリケーション間でデータを共有したい場合に使用します。

### 【書き方】

```java
// アプリケーションスコープの保存領域を確保
ServletContext sc = getServletContext();

// アプリケーションスコープに保存
sc.setAttribute("属性名", 保存したいインスタンス)

// アプリケーションスコープからインスタンスを取得
型 名前 = (型) sc.getAttribute("属性名");
```




<!-- 基本構文など -->
## リクエストスコープ
ブラウザからのリクエスト毎に生成されるスコープのこと。
### 【書き方】

```java
// リクエストスコープに保存する
request.setAttribute("属性名", 保存したいインスタンス);

//リクエストスコープからインスタンスを取得する
型 名前 = (型) request.getAttribute("属性名");


// 属性名とはスコープを指し示すインデックスのこと
// 型とは保存したインスタンスの型のこと
// 名前とは取得したインスタンスにつけたい参照変数のこと
```



<!-- 基本構文など -->
## セッションスコープ
ブラウザを閉じない、あるいはタイムアウトしない限り保持されるスコープ。
### 【書き方】

```java
// セッションスコープの保存領域を確保
HttpSession session = request.getSession();

// セッションスコープに保存
Session.setAttribute("属性名", 保存したいインスタンス)

// セッションスコープからインスタンスを取得
型 名前 = (型) session.getAttribute("属性名");
```



<!-- ここから キャプチャー -+-+-+-+-+-+-+ -->
<!-- キャプチャータイトル -->
## 処理の引き渡し


<!-- 説明 「〜〜とはなど」-->
### 【説明】

処理を次のサーブレットやJSPに渡す際、スコープに保存したデータを引き継ぐにはフォワードというメソッドを用いる。
データを引き継がない場合外部サイトに引き渡す際に利用されることが多い。
フォワードメソッドではサーバー内でしか処理を引き渡せない。

## フォワードメソッド
フォワードは次のページに処理を引き渡す方法のこと。
ブラウザ側のURLが変わらずに画面など変えることができます。
### 【説明】
スコープに保存したデータを引き継いでサーバー側で他のファイルの処理へ移すことができる。
サーバー側が自動的に次の処理を実行してブラウザに返す。同サーバー内で処理を引き渡す際は、特にデータの引き継ぎがなくてもフォワードを用いることがある。

<!-- 基本構文 -->
### 【書き方】サーブレットからJSPファイルへフォワードさせる
フォワード先のパスはJSPファイルなら/WebContentからのパス
サーブレットなら/URLパターンとなる。
javax.servlet.RequestDispatcherをインポートした上で下記のように書く
### 【書き方】

```
RequestDispatcher dispatcher = request.getRequestDispatcher("フォワード先のパス");
dispatcher.forward(request,response);
```


## リダイレクト
次にどこにアクセスすれば良いかをサーバーからブラウザに返し、ブラウザはその指定先に次の処理をリクエストする。この仕組の都合上、外部サイトへのアクセスに適している。

### 【サンプル.java】

```java
request.sendRedirect("リダイレクト先");

// リダイレクト先はURLで指定しても良いし、同サーバー内であればファイル構成に従ったパスでも可
// 例えば：
request.sendRedirect("http://www.hogehoge.com")
request.sendRedirect("/サーブレット名")

```

<!-- ここまで  キャプチャー -+-+-+-+-+-+-+ -->

<!-- サンプルコードや、サブセクションを記述↑↑↑↑↑ -->
<!-- ここまで 各キャプチャー↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -->


<!-- ## 【まとめ】 -->
<!-- 今後どうするかなどを有れば記述 -->

## 参考文献・記事

- [スコープ](http://www.javaroad.jp/servletjsp/sj_servlet4.htm)
- [http://www.javaroad.jp/servletjsp/sj_servlet4.htm](http://www.javaroad.jp/servletjsp/sj_servlet4.htm)
- [ざっくりJava JSP/サーブレット](https://qiita.com/kazukichi/items/4325b64450f93f04e316)
- [スコープの使い方と処理の引き渡し(サーブレット)](https://qiita.com/shuyam/items/a9a1be62f52009748844)

<!-- 以下ショートリンク↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -->