JSP　Servlet 

自分の為のまとめ:writing_hand:
Eclipseを使用しています

## JSPとServlet
JSPとServletはどちらもJavaを使ってWebアプリケーションを開発するため技術。どちらも密接に連携して動作する。

**JSPとServletの違い**
|特徴　　　|JSP|サーブレット|
|:-:|:-:|:-:|
|役割|プレゼンテーション層(ビュー)を担当|ビジネスロジック層(コントローラー)を担当|
|記述|HTMLにJavaコードを埋め込む|純粋なJavaコードで記述|
|適用場面|HTMLの見た目やデザインを動的に生成|リクエスト処理やビジネスロックを実装|
|実装方法|JSPファイルとして記述|Javaクラスとして記述|
|変換|サーブレットに変換されて実行|そのままSサーブレットとして実行|

## JSPとサーブレットを連携
連携させるには、サーブレットからJSPにリクエストをフォワードする方法をしよう。サーブレットで処理した結果をJSPに渡し、JSPがそれをビューとしてユーザに提供する。

**①サーブレットでリクエスト処理をする**
サーブレットはHTTリクエストを受け取り、ビジネスロックやデータ処理を行う
**②リクエスト属性にデータを設定する**
サーブレットで処理したデータを`reauest`オブジェクトの属性として保存する。
**③JSPにリクエストをフォワードする**
サーブレットは`RequestDispatcher`を使って、処理結果をJSPにフォワードする。JSPがそのリクエストを受け取り、保存されたデータを使ってHTMLに生成する。


## 値の受け渡し
JSPとサーブレットの間で値を受け渡すには、スコープによって値の共有を行う

### リクエストスコープ(Request Scope)
**・対象**
単一のHTTPリクエスト
**・説明**
設定されたデータは、そのリクエスト内でのみ有効。サーブレットからJSPにデータを渡す場合などに使われる。次のリクエストには引き継がれない
**・例**
ユーザーがフォームに入力したデータを、サーブレットで処理してJSPで表示する場合
```java
// 値を設定(セッター)
request.setAttribute("スコープ名",値);
(例)
request.setAttribute("name", "山田太郎");


// 値を受け取る(ゲッター)
データ型 変数名 = (データ型)request.getAttribute("スコープ名")
(例)
String name = (Stirng)request.getAttribute("name")
```



### セッションスコープ(Session Scope) 
**・対象**
単一のユーザセッション
**・説明**
設定されたデータは、特定のユーザーがブラウザを閉じるまで、またはセッションがタイムアウトするまで保持される。ログイン情報やユーザーの状態管理に使われる
**・例**
ユーザーのログイン状態を保持し、異なるページ間でその状態を利用する場合
```java
// 値を設定(セッター)
HttpSession session = request.getSession();
session.setAttribute("スコープ名", 値);
(例)
HttpSession session = request.getSession();
session.setAttribute("name", "山田太郎");


//値を受け取る(ゲッター)
データ型 変数 = (データ型)session.getAttribute("スコープ名", 値);
(例)
String name = (String)session.getAttribute("name",”山田太郎”)
```

### アプリケーションスコープ(Application Scope)
**・対象**
Webアプリケーション全体
**・説明**
設定されたデータは、アプリケーション全体で共有される。サーバーが停止するか、アプリケーションが再展開されるまでデータが保持される。
**・例**
全ユーザーで共有するデータやアプリケーション全体の設定情報
```java
//値を設定する(ゲッター)
getServletContext().setAttribute("スコープ名", 値);
(例)
getServletContext().setAttribute("appName", "MyWebApp");


//値を受け取る(セッター)
データ型 変数名 = (データ型)getServletContext().getAttribute("スコープ名");
(例)
String appName = (String)getServletContext().getAttribute("appName");
```

### ページスコープ(Page Scope)
**・対象**
単一のJSPページ
**・説明**
設定されたデータは、現在のJSPページ内でのみ有効。別のサーブレットやJSPには影響されない　
**・例**
JSPページ内で一時的に使用するデータ
```java
// 値を設定(セッター)
pageContext.setAttribute("greeting", "こんにちは！");
(例)
pageContext.setAttribute("pageTitle", "ホームページ");


// 値を受け取る(ゲッター)
String greeting = (String)pageContext.getAttribute("greeting");
(例)
String pageTitle = (String)pageContext.getAttribute("pageTitle");
```

## コードを記述してみる

### サーブレットからJSPを呼び出す。

```java
//サーブレットファイル(TestServlet.java) 
import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	 //RequestDispatcherオブジェクトを取得
	 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/test.jsp");
	 
	 // jspファイルにリクエストをフォワードする。
	 dispatcher.forward(request,response);
	}
}
```
```jsp
// jspファイル(test.jsp)
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>表示</title>
</head>
<body>
 <p>JSPとサーブレットの連携<p>
</body>
</html>
```



### 値の受け渡し

```java
//サーブレットファイル(TestServlet.java) 
import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	 //	nameというスコープ名に "山田太郎" という値を設定
     request.setAttribute("name", "山田太郎");
     
	 //RequestDispatcherオブジェクトを取得
	 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/test.jsp");
	 
	 // jspファイルにリクエストをフォワードする。
	 dispatcher.forward(request,response);
	}
}
```
```jsp
// jspファイル(test.jsp)
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>名前表示</title>
</head>
<body>
 <p>値の受け渡し<p>
 こんにちは<%= (String)request.getAttribute("name") %>さん
</body>
</html>
```

### ログイン画面

```LoginServlet.java
import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	request.setCharacterEncoding("UTF-8");
	response.setContentType("text/html; charset=UTF-8");
	
	String message = null;
	String id = request.getParameter("id");
	String pass = request.getParameter("pass");
	
	if(id.equals("test") && pass.equals("1234")) {
		message = "ようこそ" + id + "さん";
	} else {
		message = "IDまたはパスワードが違います";
	}
	
	request.setAttribute("message", message);
	
	RequestDispatcher dispatch = request.getRequestDispatcher("/jsp/message.jsp");
	dispatch.forward(request, response);
	}
}
```
```jsp
// login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>ログイン表示画面</title>
</head>
<body>
 <h2>ログイン画面</h2>
 <form method="post" action="/Sample/LoginServlet">
  　Ｉ　Ｄ　：<input type="text" name="id"><br><br>
  パスワード：<input type=text name="pass"><br><br>
  <input type="submit" value="送信"> 
 </form>
</body>
</html>
```

```jsp
// message.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>ログイン結果</title>
</head>
<body>
 <h2>ログイン結果</h2>
 <%= (String)request.getAttribute("message") %>
</body>
</html>
```