JSP スッキリわかる サーブレット&JSP 入門 - user000422/0 GitHub Wiki

サーブレットクラスとJSPを組み合わせてWebアプリケーションを作成することが一般的

サーブレットコンテナ … サーブレットクラスを実行する機能
Apach Tomcat … アプリケーションサーバソフトウェア
動的Webプロジェクト … Webアプリケーション
サーブレットクラス … ブラウザからのリクエストによって実行されるクラス
サーブレットクラスの作成
動的Webプロジェクトを右クリック -> 新規 -> サーブレット
Javaパッケージ「servlet」※何でもいいはず
クラス名「○○○Servlet」※何でもいいはず
-> 次へ -> 次へ -> 継承された抽象メソッド と doGet のみチェック -> 完了
doGetメソッドの中身(デフォルトの)は削除推奨

サーブレットクラス doGetメソッド … リクエストによって実行する処理を記述
HTMLを出力する記述は常に必須

// Java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

	// Content-Typeヘッダ設定 レスポンスのヘッダを指定
	response.setContentType("text/html; charset=UTF-8");
	// HTML出力
	PrintWriter out = response.getWriter();
	out.println("<html>");
	out.println("…");
	out.println("</html>");
}

サーブレットクラスの実行方法
サーブレットクラスのURL形式 … http://サーバ名/アプリケーション名/URLパターン
例)http://localhost:8080/example/SampleServlet
WebアノテーションURLパターン を設定

// Eclipseでサーブレットクラスを作成した場合、URLパターンは自動設定される
@WebServlet("/URLパターンはココ")

サーブレット実行方法 1
ブラウザを起動し、サーブレットクラスのURLを入力しリクエスト(このときアプリケーションサーバを起動しておく必要がある)

サーブレット実行方法 2
Eclipseで実行したいサーブレットクラスを右クリック -> 実行 -> サーバで実行

JSP(JavaServer Pages)… リクエストされるとサーブレットクラスに変換され楽にHTML出力が可能
JSPファイルの作成
動的Webプロジェクトを右クリック -> 新規 -> JSPファイル
JSPファイルはHTMLの中でJavaのコードを埋め込んで作成する

フォーム基本型
method … 登録機能などの送信をする場合はpost、検索機能などの情報を取得する場合はget
URLからのデータ漏洩を防ぎたい場合post
submitボタンで入力値を送信
入力値はname=入力値の形で送信される(これをリクエストパラメータと呼ぶ)

<%-- action属性で送信先 --%>
<form action="送信先" method="post">
  <input type="text" name="name">
  <input type="hidden" name="sampleHidden" value="apple"> <%-- hidden 画面に表示させずにパラメータを送信 --%>
  <input type="submit" value="送信">
</form>

暗黙オブジェクト … 宣言せずに利用できるオブジェクト(JSPでも使用可能)
requestsessionなど

request.setCharacterEncoding("UTF-8"); // エンコード(お約束)
String name = request.getParameter("name"); // request.getParameter フォーム送信したパラメータを取得

forward(フォワード) … 別のJSPまたはサーブレットに処理を任せる
Redirect(リダイレクト) … 別のJSPやサーブレットやHTMLに処理を任せる(外部アプリケーションも可)
基本はフォワードを使う、別のアプリケーションへ処理を転送する場合のみリダイレクトを使う
ログイン処理でログイン失敗画面遷移のようにURLは元画面から変更したくない場合もリダイレクトを使用

// forward
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/sample.jsp");
dispatcher.foward(request, response);

// Redirect
response.sendRedirect("/sample/SampleServlet");

スコープ … サーブレットクラスやJSPで共有するインスタンス(基本JavaBeans)の保存領域
JavaBeans … 複数の情報をひとつにまとめて保持、JavaやJSPから情報のsetやgetが行われる

// JavaBeans(Serializableを実装する)
public class Monster implements Serializable {
  private String name; // フィールドは必ずカプセル化(private)

  // getter/setter を用意する
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

リクエストスコープ … リクエストにより生成されレスポンスを返すまで利用できるスコープ
セッションスコープ … レスポンス後も(リクエストをまたいで)データを保持できるスコープ
アプリケーションスコープ … Webアプリケーションが終了するまで全ユーザが使用できるスコープ
setAttribute … スコープにインスタンスを保存(同じ属性名が既に存在する場合、上書きする)
getAttribute … スコープからインスタンスを取得(キャストで型変換する必要がある)
セッションスコープの有効期限は基本的にブラウザが閉じられるまで(Cookieを利用しブラウザが閉じられても有効にすることもできる)
セッションスコープ(HttpSessionインスタンス)はブラウザを閉じてすぐは破棄されないため、メモリ不足問題が起きる可能性がある
リクエスト間のみデータを保持したい場合はリクエストスコープ、ブラウザを閉じるまでデータ保持したい場合はセッションスコープ
インスタンスを複数のユーザが同タイミングで更新するような処理を想定する場合、競合により不整合が起きるためアプリケーションスコープは向かない(もしくはスレッド機能を利用する)

Monster monster = new Monster("キラーマシン", 10);

HttpSession session = request.getSession(); // セッションスコープを取得
ServletContext application = this.getServleteContext(); // アプリケーションスコープを取得

// setAttribute スコープにインスタンスを保存(3種スコープ同様)
request.setAttribute("monster", monster);

// getAttribute スコープからインスタンスを取得(3種スコープ同様)
Monster m = (Monster) request.getAttribute("monster");

// removeAttribute スコープからインスタンスを削除(セッションとアプリケーションで使用)
session.removeAttribute("monster"); // セッションスコープからインスタンスを削除

// invalidate スコープを破棄(ログアウト後処理などで使用)
session.invalidate(); // セッションスコープを破棄(ログアウト後処理などで使用)

<%-- JSP --%>
<%@ page import="samplePackage.Monster" %> <%-- 取得するインスタンスのクラスをインポート --%>
<%
  Monster rm = (Monster) request.getAttribute("monster"); // リクエストスコープからインスタンス取得
  Monster sm = (Monster) session.getAttribute("monster"); // セッションスコープからインスタンス取得
  Monster am = (Monster) application.getAttribute("monster"); // アプリケーションスコープからインスタンス取得
%>
<!DOCTYPE html>
モンスター名は<%= rm.getName() %>です。 <!-- リクエストスコープのデータを使用 -->

⚠️ **GitHub.com Fallback** ⚠️