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でも使用可能)
request
、session
など
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() %>です。 <!-- リクエストスコープのデータを使用 -->