jsp

自分なりのまとめ:writing_hand:

## JSPとは
JavaServer Pagesの略。
サーブレットと同じ、サーバサイドプログラム。サーブレットクラスの代わりにJSPファイルを使用する。サーブレットクラスでできることはJSPファイルでもできる。
JSPは基本的にHTMLページで、そこにJavaコードを埋め込むことができる。それにより、Webページの中で動的な処理を行い、動的なコンテンツを生成することができる。

## 代表的なディレクティブ

**①pageディレクティブ**
JSP全体に影響を与える設定を行う。
属性　　　　　|説明|
|:-:|:-:|
|language|スクリプト言語を指定。通常はjavaだが、他のJSPでサポートされるスクリプト言語を指定することも可能|
|contentType|JSPファイルのレスポンスのMIMEタイプ及びエンコーティングを指定。クライアントが受け取るデータの形式を定義|
|pageEncoding|JSPページ自身のエンコーティング方式を指定。JSPファイルを読み込む際に使用される文字エンコーティングを設定|
|extends|JSPページがServletに変換された際に、サーブレットが継承するクラスを指定。デフォルトではHttpServletを継承するが、カスタムクラスを指定することも可能|
|import|SPページ内で使用するJavaのクラスやパッケージをインポート。複数のクラスをインポートする場合は、カンマで区切る|
|errorPage|ページ内で発生した例外がキャッチされなかった場合に、リダイレクトされるエラーページを指定。|
|session|セッションの有無を指定。この属性が`true`の場合はHTTPセッションが利用され、`false`だどセッションを使用しない。|

```JSP
<%-- ContentType --%>
<%@ page contentType="text/html; charset=UTF-8" %>

<%-- pageEncoding --%>
<%@ page pageEncoding="UTF-8" %>

<%-- import --%>
<%@ page import="java.util.Date, java.util.List" %>
```

**②includeディレクティブ**
他のファイルを静的にインクルード(読み込む)する。JSPページの中に他のHTMLファイルやJSPファイルの内容を挿入することができる。インクルードされたファイルはコンパイル時に1つのページとして扱われる。
主にヘッダーやフッターにような共通部分を再利用するときに使用する。
```JSP
<%@ include file="header.jsp" %>
```

**③taglibディレクティブ**
JSPでカスタムタグライブラリを使用する。これを使うことで、JSTL（JavaServer Pages Standard Tag Library）や独自に定義したカスタムタグを使用できる。
```uri```
使用するタグライブラリのURIを指定。STLなどの標準ライブラリには既定のURIがあり、それを指定する。
```prefix```
カスタムタグを使用する際の接頭辞（プレフィックス）を指定。このプレフィックスを使ってタグを呼び出す。
```JSP
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
```

## スクリプトタグ
JSP内でjavaコードを直接埋め込む為のタグ。
スクリプトタグを使用することで、JSPページに動的なロジックを追加できる

**①スクリプトレットタグ** 
JSPページ内にJavaコードを直接埋め込む為のタグ。
こんにちは　と表示させる
```jsp
<%
 out.println("こんにちは");
%>
```

**②式タグ<%= ..... %>**
Javaの式を評価し、その結果を直接HTMLとして出力する。式タグは出力を自動的にout.printで書き出すため、簡潔なコードを書ける。
現在時刻の表示
```jsp
<%= "現在の時刻: " + new java.util.Date() %>
```

**③宣言タグ<%! .... %>**
JSPページ内でクラスレベルの変数やメソッドを定義するためのタグ。このタグ内に書かれたコードは、JSPがサーブレットに変換される際に、クラスレベルのメンバーとして定義される。
int型の変数numを宣言し、0で初期化
```JSP
<%!
 int num=0;
%>
```

**④コメント<%-- .... --%>**
```jsp
<%-- コメントを入れる --%>
``` 

## コードを書いてみる
### 日時を表示
```JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.text.SimpleDateFormat, java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="ContentType" content="text/html; charset=UTF-8">
 <title>時刻表示</title>
</head>
<body>
 <%
  //現在の日時を取得
  Date now = new Date();
 
  //日付のフォーマットを指定
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分");
  
  //フォーマットした日付を文字列として取得
  String formattedDate = sdf.format(now);
  %>

 <p>現在の日時は、<%= formattedDate %>です</p>
</body>
</htm
```

### 入力フォーム
```JSP
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="ContentType" content="text/html; charset="UTF-8">
<title>入力フォーム</title>
</head>
<body>
 <h2>ユーザー情報を入力してください</h2>
 <form method="post"  action="display.jsp" >
  名前：<input type="text" name="name"><br><br>
  年齢：<input type="text" name="age"><br><br>
  出身：<input type="text" name="from"><br><br>
  <input type="submit" value="送信">
 </form>
</body>
</html>
```

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="ContentType" content="text/html; charset=UTF-8">
<title>表示画面</title>
</head>
<body>
 <h2>ユーザ情報</h2>
  <p>名前：<%= request.getParameter("name") %></p>
  <p>年齢：<%= request.getParameter("age") %></p>
  <p>出身：<%= request.getParameter("from") %></p>
</body>
</html>
``` 

## 定義済みオブジェクト
JSPや他のプログラミング環境において、しすてむによって自動的に提供される。

|オブジェクト名|説明|
|:-:|:-:|
|request|クライアントからサーバーへのリクエストを表すオブジェクト。HTTPリクエスト情報にアクセス可能|
|response|サーバーからクライアントへのレスポンスを表すオブジェクト。レスポンスの設定や出力を制御|
|out|クライアントに出力するためのオブジェクト。HTMLや文字列を送信|
|sessio|クライアントとサーバー間のセッションを管理するオブジェクト。セッションスコープでデータ共有|
|applicatio|Webアプリケーション全体でデータを共有するためのオブジェクト|
|pageContext|JSPページ全体の情報にアクセスするためのオブジェクト。他のスコープにもアクセス可能|
|page|現在のJSPページ自身を表すオブジェクト。通常thisキーワードで使用|
|exception|SPページでエラーが発生した場合の例外情報にアクセスするオブジェクト|

**request**
対応クラス：`jakarta.servlet.http.HttpServletRequest`
クライアントから送信されたフォームデータ(名前・年齢)を取得
```JSP
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>リクエストパラメータの取得</title>
</head>
<body>
    <h2>リクエストパラメータの取得</h2>
    <%
        // クライアントから送信された名前と年齢を取得
        String name = request.getParameter("name");
        String age = request.getParameter("age");
    %>
    <p>名前: <%= name %></p>
    <p>年齢: <%= age %></p>
</body>
</html>
```

**response** 
対応クラス：`HttpServletRequest`
クライアントを別のURLにリダイレクトする
```JSP
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // クライアントにリダイレクトを行う
    response.sendRedirect("https://www.example.com");
%>
```

**session** 
対応クラス：`ttpServletResponse`
ユーザ名をセッションに保存し、別のページでそのデータを取得
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // セッションにユーザー名を保存
    session.setAttribute("userName", "山田太郎");
%>
<!DOCTYPE html>
<html>
<head>
    <title>セッションの使用</title>
</head>
<body>
    <h2>セッションから取得したユーザー名</h2>
    <p>ユーザー名: <%= session.getAttribute("userName") %></p>
</body>
</html>
```

**out**
対応クラス：`JspWriter`
クライアントにテキストを出力させる
```JSP
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // クライアントに文字列を書き出す
    out.println("Hello, JSP World!");
%>
```

**application**
対応クラス：`ServletContext`
Webアプリケーション全体で共有されるデータ(アプリケーション名)を設定し、それを表示する
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // アプリケーション全体で共有されるデータを設定
    application.setAttribute("appName", "MyJSPApp");
%>
<!DOCTYPE html>
<html>
<head>
    <title>アプリケーションスコープの使用</title>
</head>
<body>
    <h2>アプリケーション名</h2>
    <p>アプリケーション名: <%= application.getAttribute("appName") %></p>
</body>
</html>
```