JSP & Servletメモ

## サーブレットの基礎知識
Webアプリケーションで核となるのがサーバーサイドプログラム。サーバーサイドプログラムは、ブラウザのリクエストによってサーバー上で動作し、実行結果をHTMLでレスポンスする。
サーブレットは、javaを用いて、そのサーバーサイドプログラムを実現する技術。また、サーブレットクラスはブラウザから実行できるクラスを使用し、ブラウザのリクエストによってサーバー上で動作し、実行結果をHTMLでレスポンスする。

## サーブレット作成ルール
1. javax.servlet.http.HttpServletクラスを継承する。
このクラスを継承することにより、サーブレットクラスを一から作成する必要がない。
2. doGet()メソッドをオーバーライド
サーブレットクラスがリクエストされると実行されるメソッド。
3. サーブレット関係のクラスをインポートする。

## HttpServletRequestとHttpServletResponse
### HttpServletRequest
ブラウザから届くリクエストに関係する情報と機能を持つインスタンス。
ここに格納されているリクエストの詳細の情報を取り出し、計算の方法などの様々な処理を実行する。
## HttpServletResponse
結果画面のHTMLをHttpServletResponseインスタンスを用いてブラウザに返信。

## サーブレットクラスの実行方法
URLパターンの設定
@WebServlet("/URLパターン")

```java
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/SampleServlet")
public class SampleServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
	ServletException, IOException{
		String[] Arrays = {"very Good", "Good", "Soso"};
		int index = (int)(Math.random()*3);
		String luck = Arrays[index];

		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>FortuneTelling</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<p>"+luck +"</p>");
		out.println("</body>");
		out.println("</html>");
	}
}
```

## JSPの基礎知識
Javaを用いてサーバーサイドプログラムを実現する技術。サーブレットクラスではなく、JSPファイルというプログラムを使用する。
JSPファイルは、リクエストされるとサーブレットクラスに変換されるため、サーブレットクラスと同じことが可能。
また、JSPファイルの特徴としては、
HTMLの中でjavaコードを埋め込むことができ、サーブレットクラスよりもHTMLを楽に出力可能。
Javaを埋め込む構文は、<% javaのコード %>.
コメントを入力する場合は、<%--   --%>
設定方法は<%@ page 属性名="値" %>

```java
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import ="ex.*"%>

<%
String[] Arrays = {"very Good", "Good", "Soso"};
int index = (int)(Math.random()*3);
String luck = Arrays[index];

 Employee emp = new Employee("1", "A");
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>FortuneTelling</title>
</head>
<body>
	<p><%= luck %></p>
	<p>IDは<%= emp.getId() %>、名前は<%= emp.getName() %></p>
</body>
</html>

package ex;

public class Employee {
	private String id;
	private String name;

	public Employee(String id, String name) {
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}


```

## GETリクエストとPOSTリクエスト
リクエストパラメータとは、ユーザーによって入力され、サーバー側に送信されたデータ。
そのリクエストパラメータを送信する際に使用されるのが、GETやPOST。
GETは、リクエストによって新しい情報を取得するような場合を使用し、POSTリクエストはリクエストによってフォームに入力したデータを登録する場合に使用する。

### リクエストパラメータの取得
サーブレットクラスやJSPファイルはHttpServletRequestのメソッドを使用して、リクエストパラメータを取得できる。
サーブレットクラスの場合
```java
String name = request.getParameter("name");
String gender = request.getParameter("gender");
```

JSPファイルの場合
```java
<% 
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String gender = request.getParameter("gender");
%>
```
## MVCモデル
WebアプリケーションなどのGUIアプリケーションを効率よく開発するための模範的な構造。
### MVCモデルにおける開発の3要素
1. model 
リクエストで受けたデータの演算を行う。HttpServletRequestなどを含んでいないjavaのクラスが担当する。
2. View
画面出力を行う。JSPファイルが担当する。
3. controller
ユーザーからのリクエストを受けとり、処理の実行をモデルに依頼し、その結果の表示をviewに依頼する。主にサーブレットクラスが担当する。

### フォワード
処理を他のサーブレットクラスやJSPファイルに移すことができる。
サーブレットクラスからJSPファイルにフォワードすることにより、処理担当をサーブレットクラスからJSPファイルに変更する。
RequestDispatcherインスタンスのforward()メソッドで実行する。
RequestDispatcher dispatcher = request.getRequestDispatcher("フォワード先");
dispatcher.forward(request,response);

フォワード先の指定方法は、
JSPファイルの場合、 /WebContentからのパス
サーブレットクラスの場合、/URLパターン

### リダイレクト
ブラウザのリクエスト先を変更して処理の転送を実行する仕組み
構文
response.sendRedirect("リダイレクト先のURL");
フォワード先の指定方法は、
JSPファイルの場合、 /アプリケーション名/WebContentからのパス
サーブレットクラスの場合、/アプリケーション名/URLパターン

## スコープ
サーブレットクラスやJSPファイルで生成したインスタンスを保存できる領域。
また、保存されたインスタンスを取得することも可能。
スコープには4種類あり、ページスコープ、リクエストスコープ、セッションスコープ、アプリケーションスコープ。
保存されるインスタンスは基本的にJavaBeansクラスのインスタンスです。

### JavaBeansのルール
1. 直列化（インスタンスからバイナリへと変更し保存、バイナリからインスタンスへと変更し取得)
2.クラスはpublicでパッケージに所属する
3. public で引数をもたないコンストラクタを持つ。
4.フィールドはカプセル化する
5.getter/setterを持つ

JavaBeansは複数のデータをまとめて保存できる。

### リクエストスコープ
このスコープに保存したインスタンスはレスポンスが返されるまで利用可能。これによりフォワード先とフォワード元でインスタンスを共有できるようになる。
リクエストスコープに保存する構文
request.setAttribute("属性", インスタンス);
リクエストスコープから取得する構文
取得するインスタンスの型　変数名 = (取得するインスタンスの型) request.getAttribute("属性");

### セッションスコープ
リクエストスコープと違い、開発者がセッションスコープに保存したインスタンスの有効期間を決めることができる。

セッションスコープの取得
HttpSession session = request.getSession();

セッションスコープに保存
session.setAttribute("属性", インスタンス);
セッションスコープからインスタンスを取得
取得するインスタンスの型　変数名 = (取得するインスタンスの型) session.getAttribute("属性");
保存したインスタンスを削除
session.removeAttribute("属性名");

セッションスコープの破壊
session.invalidate();
保存していたインスタンスが消滅する
ログアウト実行時に使用される。

## DBとJDBCプログラム
データベースの接続
try(Connection conn = DriverManager.getConnection(
	"jdbc:h2:tcp://localhost/~/example", "sa", "")){


## select文の準備
String sql = "SQL文";
PreparedStatement pStmt = conn.prepareStatement(sql);
sqlをDBに届けるPreparedStatementインスタンスを取得

##結果表を取得
ResultSet rs= pStmt.executeQuery();
ResultSetインスタンスにsql文の結果が格納される

## 結果表に格納された行の内容を表示
while(rs.next()){
	String id = rs.getString("ID");
	String name = rs.getString("NAME");
	int age = rs.getInt("AGE");

## 取得したデータの出力
System.out.println("ID" + id);
System.out.println("name" + name;
System.out.println("age" + age);
}
//失敗時の処理
} catch (SQLException e){
e.printStackTrace();
}
}
}

## DAO
データベースの操作を担当とするクラス
DAOクラスはテーブルごとに作成し、クラス名「テーブル名+DAO」とするのが一般的。

参考資料
スッキリわかるサーブレット&jsp入門