JavaとJSPでインスタンスを共有する

JavaのサーブレットクラスとJSPでインスタンスを共有することのできる、スコープにていて書いてみます！

## スコープ
スコープとはインスタンスを保存できる領域のこと。
サーブレットクラスで生成したインスタンスを、他のサーブレットクラスやJSPで利用するためにスコープを使用する。
サーブレットクラスでインスタンスをスコープという入れ物に入れて、他のサーブレットクラスやJSPでスコープに入っているインスタンスを取り出す。
今回は３つのスコープについて書きます。
![無題の図形描画.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551832/82bf04f9-07f4-0fb0-bb02-c9c787551282.jpeg)

## リクエストスコープ
リクエストごとに生成されるスコープ。このスコープに生成したインスタンスはレスポンスが返されるまで利用することができる。

リクエストスコープにインスタンスを保存する方法
**request.setAttribute("属性名",インスタンス)**

#### リクエストスコープの使い方
Animalクラス
変数(animal)、ゲッター(getAnimal)、セッター(setAnimal)を用意。
```Animal.java

public class Animal implements Serializable {
    private String animal;

    public void setAnimal(String animal) {
        this.animal = animal;
    }

    public String getAnimal {
        return this.animal;
    }
}
```
Animalクラスのインスタンスを生成して、セッターで変数に値を入れる。
その後リクエストスコープにインスタンスを保存。
 
```Main.java

public class Main extends HttpServlet {
    protected void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException {
        Animal animal = new Animal();
        animal.setAnimal("猫");
        //animalという属性名で保存
        request.setAttribute("animal",animal);

        //フォワード
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Animal.jsp");
        dispatcher.forward(request,response);
    }
}
```

JSPファイルでリクエストスコープからインスタンスを取得。
取得方法
**取得するインスタンスの型 変数名 = (取得するインスタンスの型)request.getAttribute("属性名");**

取得後はゲッターを使用して、画面上に猫と表示させている。
Animal.jsp
```jsp
<%@ page language="java" contentType="text/html"; charset="UTF-8" pageEncoding="UTF-8" %>
<%@ page import="model.Animal" %>
<!--リクエストスコープからインスタンスを取得して変数に格納-->
<% Animal animal = (Animal)request.getAttribute("animal"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>動物</title>
</head>
<body>
<p><%= animal.getName() %></p> <!--猫と表示される-->
</body>
```

## セッションスコープ
リクエストスコープはリクエストを跨いで使用することはできない。一度レスポンスを返すと、リクエストスコープの中のインスタンスは消えてしまう。
![無題の図形描画.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551832/e755f027-321d-ee5a-6961-86709c6cbc54.jpeg)
リクエストを跨いでもインスタンスが消えないようにするためには、セッションスコープを利用する。
セッションスコープに保存したインスタンスの有効期限は開発者が決めることができる。
![無題の図形描画.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551832/08d686ae-7326-3b35-1bf5-16b630100e35.jpeg)

#### セッションスコープの使い方
javax.servlet.http.HttpSessionインスタンスを使用して、セッションスコープを操作する。
**HttpSession session = request.getSessino();**
**session.setAttribute("属性名",インスタンス);**
```Main.java

public class Main extends HttpServlet {
    protected void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException {
        Animal animal = new Animal();
        animal.setAnimal("猫");
        //HttpSessionインスタンスの取得
        HttpSession session = request.getSessino();
        //セッションスコープに保存
        session.setAttribute("animal",animal);

        //フォワード
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Animal.jsp");
        dispatcher.forward(request,response);
    }
}
```
取得方法
**取得するインスタンスの型 変数名 = (取得するインスタンスの型)session.getAttribute("属性名")**
Animal.jsp
```jsp
<%@ page language="java" contentType="text/html"; charset="UTF-8" pageEncoding="UTF-8" %>
<%@ page import="model.Animal" %>
<!--セッションスコープからインスタンスを取得して変数に格納-->
<% Animal animal = (Animal)session.getAttribute("animal"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>動物</title>
</head>
<body>
<p><%= animal.getName() %></p> <!--猫と表示される-->
</body>
```
セッションスコープ内のインスタンスを削除
```java
session.removeAttribute("属性名")
```

## アプリケーションスコープ
セッションスコープはユーザーごとのインスタンスを保存するもの。セッションスコープは全員で共有したいインスタンスを保存できる。Webアプリケーションが終了するまで利用することができる。

#### アプリケーションスコープの使い方
**ServletContext application = this.getServletContext();**
**application.setAttribute("属性名",インスタンス);**

```Main.java

public class Main extends HttpServlet {
    protected void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException {
        Animal animal = new Animal();
        animal.setAnimal("猫");
        //ServletContextインスタンスの取得
        ServletContext application = this.getServletContext();
        //アプリケーションスコープに保存
        application.setAttribute("animal",animal);

        //フォワード
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Animal.jsp");
        dispatcher.forward(request,response);
    }
}
```

取得方法
**取得するインスタンスの型 変数名 = (取得するインスタンスの型)application.getAttribute("属性名")**
Animal.jsp
```jsp
<%@ page language="java" contentType="text/html"; charset="UTF-8" pageEncoding="UTF-8" %>
<%@ page import="model.Animal" %>
<!--アプリケーションスコープからインスタンスを取得して変数に格納-->
<% Animal animal = (Animal)application.getAttribute("animal"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>動物</title>
</head>
<body>
<p><%= animal.getName() %></p> <!--猫と表示される-->
</body>
```
アプリケーションスコープ内のインスタンスを削除
```java
application.removeAttribute("属性名")
```

以上、３つのスコープについて書かせていただきました:slight_smile:
何か指摘点があれば、よろしくお願いいたします！