アプリケーションスコープ
アプリケーションスコープとは、Webアプリケーションが終了するまでの間、アプリケーション内のすべてのサーブレットクラスとJSPファイルで利用することができるスコープ。またこのスコープに保存したインスタンスはユーザー(ブラウザ)間で共有することができる。
アプリケーションスコープの基本操作
アプリケーションスコープの正体はjavax.servlet.ServletContextインスタンス。
アプリケーションスコープを取得
ServletContext application = this.getServletContext();
アプリケーションスコープにインスタンスを保存
application.setAttribute("属性名", インスタンス);
アプリケーションスコープからインスタンスを取得
取得するインスタンスの型 変数名 = (取得するインスタンスの型) application.getAttribute("属性名");
アプリケーションスコープからインスタンスを削除
application.removeAttribute("属性名");
セッションスコープ
セッションスコープとは
リクエストスコープに保存したインスタンスはレスポンスを返した際に消えてしまうので、次のリクエスト時にもう一度同じインスタンスを使うことはできない。
スコープに保存したインスタンスを、リクエストをまたいで使うにはセッションスコープを使う。セッションスコープに保存するインスタンスの有効期間は開発者が決めることができるため、リクエストをまたいでインスタンスを利用できる。
セッションスコープの基本操作
セッションスコープの正体は javax.servlet.http.HttpSessionインスタンス。このインスタンスのメソッドを利用すればセッションスコープを操作することができる。
下のコードはJavaBeansインスタンスをセッションスコープに保存し、またセッションスコープを操作するコードの例。
Book book = new Book("エンディミオン", 657); // HttpSessionインスタンスつまりセッションスコープの取得 HttpSession session = request.getSession(); // セッションスコープにインスタンスを保存 session.setAttribute("book", book); // セッションスコープからインスタンスを取得 Book book = (Book) session.getAttribute("book"); // セッションスコープからインスタンスを削除 session.removeAttribute("book");
セッションスコープの取得
セッションスコープつまりHttpSessionインスタンスを取得。
HttpSession session = request.getSession();
※ javax.servlet.http.HttpSessionをimportする必要がある
セッションスコープにインスタンスを保存
session.setAttribute("属性名", インスタンス);
※第1引数はString型、第2引数はObject型。
※第2引数にはあらゆるクラスのインスタンスを指定できる。
セッションスコープからインスタンスを取得
取得するインスタンスの型 変数名 = (取得するインスタンスの型) session.getAttribute("属性名");
※getAttribute()メソッドの戻り値はObject型なので、元のインスタンスの型にキャストしないといけない。
セッションスコープにインスタンスを保存・取得するやり方は、対象インスタンスがrequestかsessionの違いなだけでメソッドや引数はリクエストスコープと同じ。
セッションスコープからインスタンスを削除
session.removeAttribute("属性名");
セッションスコープに格納されたインスタンスをJSPファイルで取得
暗黙オブジェクト"session"を使用すればJSPファイルでセッションスコープが利用できる。
<%@ page language="java" contentType="text/html"; pageEncoding="UTF-8 %> <%@ page import="ex.Book" %> <% // インスタンスをセッションスコープから取得 Book b = (Book) session.getAttribute("book"); %> <!DOCTYPE html> ~省略~ <%= b.getTitle() %>の価格は<%= b.getPrice() %>円です ~省略~
リクエストスコープ
リクエストスコープとは
リクエストごとに生成されるスコープ。
リクエストスコープに保存したインスタンスの有効期限はレスポンスが返されるまで。リクエストスコープを利用することで、フォワード元とフォワード先とでインスタンスを共有することができるようになる。
リクエストスコープの基本操作
リクエストスコープを表すのは、HttpServletRequestインスタンス。なので、HttpServletRequestインスタンスのメソッドを使うことで、リクエストスコープを操作することができる。
下のコードはJavaBeansインスタンスをリクエストスコープに保存する例、また保存されたインスタンスをリクエストスコープから取得する例のサーブレットのコード。
// スコープに保存するインスタンスを生成 Book book = new Book("ハイペリオンの没落", 784); // インスタンスをリクエストスコープに保存 request.setAttribute("book", book); // インスタンスをリクエストスコープから取得 Book b = (Book) request.getAttribute("book");
インスタンスを保存/取得する際の引数にある""で囲まれた名前は、属性名という。属性名はスコープに保存するインスタンスの管理用の名前を表し、インスタンスをスコープから取得する際に必要となる。
インスタンスをリクエストスコープに保存
request.setAttribute("属性名", インスタンス);
※第1引数はString型、第2引数はObject型となる
※第2引数にはあらゆるクラスのインスタンスを指定可能
リクエストスコープ内のインスタンスを取得
取得するインスタンスの型 変数名 = (取得するインスタンスの型) request.getAttribute("属性名");
※getAttribute()の戻り値は、取得したインスタンスがObject型で返される。
なので、取得したインスタンスをキャストで元の型に型変換する必要がある。
JSPファイルでリクエストスコープを使用する例
<%@ page language="java" contentType="text/html"; pageEncoding="UTF-8 %> <%@ page import="ex.Book" %> <% // インスタンスをリクエストスコープから取得 Book b = (Book) request.getAttribute("book"); %> <!DOCTYPE html> ~省略~ <%= b.getTitle() %>の価格は<%= b.getPrice() %>円です ~省略~
参照:「スッキリわかるサーブレット&JSP入門 第2版」
スコープ
スコープとは
スコープとは、インスタンスを保存できる領域のこと。スコープを経由させることで、サーブレットクラスとJSPファイルとでインスタンスを共有することが可能になる。例えばサーブレットクラスで生成したインスタンスをJSPファイルで取得するといったことが可能になる。
スコープには「ページスコープ」「リクエストスコープ」「セッションスコープ」「アプリケーションスコープ」の4種類があり、種類によってスコープに保存したインスタンスの有効期限が異なる。
スコープとインスタンス
スコープに保存できるのはインスタンスに限られる。基本的には「JavaBeans」と呼ばれるクラスのインスタンスを保存する。
JavaBeansとは、Javaのクラスの独立性を高め、部品として再利用しやすくするためのルール、またはそのルールを守っているクラスおよびそのインスタンスのこと。具体的に言うと、JavaBeansのルールには主に以下のものがある。
・直列化可能である(java.io.Serializableを実装している)
・クラスはpublicで、パッケージに所属する
・publicであり、引数のないコンストラクタを持つ
・フィールドはカプセル化する
・命名規則に従ったgetter/setterメソッドを持つ
例:
package ex; import java.io.Serializable; public class Book implements Serializable { private String title; private int price; public Book() { } public Book(String title, int price) { this.title = title; this.price = price; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }
JavaBeansのプロパティ
JavaBeansの考え方では、クラスのフィールドとは別にプロパティというものがあるとのこと。プロパティはgetterやsetterを作ることで生まれる。つまり、フィールドがあってもgetterやsetterが無ければプロパティは生まれない。
getter/setterのget,setの後の部分につけた名前がプロパティの名前になる。
また、getterとsetterのどちらを作ったかによってプロパティの読み取りや変更の可否が決まる。
例:getterのみ作った→読み取りだけできるプロパティ
setterのみ作った→変更だけできるプロパティ
getterもsetterも作った→読み取りも変更もできるプロパティ
MVCモデル
MVCモデルとは
アプリケーション開発の考え方。アプリケーションを
モデル:計算処理など、アプリケーションの主たる処理やデータの格納など
ビュー:ユーザーに対しての画面の表示
コントローラ:ユーザーからの要求を受け取り、処理の実行をモデルに依頼し、その結果の表示をビューに依頼する
の3つの要素に分けて開発すること。
サーブレット&JSPでのWebアプリ開発にこのMVCモデルを当てはめると
サーブレット:コントローラ。ユーザーからのリクエストを受け取る。
JSPファイル:ビュー。レスポンスをユーザーへ返す。
一般的なJavaのクラス:モデル。処理を担う。
となる。”一般的なJavaのクラス”とは『Webアプリケーションに関するクラスやインタフェース(例えばHttpServletRequestなど)を含んでいない』クラスのこと。
・6月18日追記(個人的メモ):
コントローラで担う処理は、「POSTメソッドにてリクエストからパラメータを取得する」「インスタンスをスコープに保存する」「処理をビューへフォワードする」などといったものであり、インスタンスへのデータ格納のような処理はコントローラでは行わない。データ格納など計算処理はモデルにて行う。
フォワード:処理の転送
MVCモデルでの開発においては、サーブレットクラス(コントローラ)がJSPファイル(ビュー)に処理結果の出力を依頼する必要がある。そのような場合、フォワードを使うと処理をサーブレットクラスからJSPファイルに移すことができる。
フォワードのやり方
フォワードはRequestDispatcherインスタンスのforward()メソッドで行う。
RequestDispatcher dispatcher = request.getRequestDispacher("フォワード先"); dispatcher.forward(request, response); * javax.servlet.RequestDispatcher をimportしないといけない
JSPファイルへのブラウザ(ユーザー)からの直接リクエストを禁ずる
ビューの役割をもつJSPファイルはユーザーから直接リクエストできないようにしないといけない。なぜならMVCモデルでは、ビューであるJSPファイルを表示させるのはコントローラであるサーブレットクラスであり、ユーザー自身ではないから。また直接JSPファイルをブラウザから表示するとエラーや不具合が発生することがあるらしい。
JSPファイルを直接リクエストできなくするには、WebContent/WEB-INFのフォルダの下に"jsp"というフォルダを作り、ここにJSPファイルを配置する。
参照:「スッキリわかるサーブレット&JSP入門 第2版」
フォーム
リクエストパラメータ:フォームの送信のボタンをクリックすると、「フォーム部品につけた名前=値」の1組のデータがリクエスト先に送信される。この「名前=値」のペアをリクエストパラメータという。リクエストパラメータ同士は「&」でつなげられて送信される。
例えば、"name=dog&color=black&age=9"というデータが送信されたなら3つのリクエストパラメータが送られてることになる。
リクエストパラメータを送信先のプログラムで取得する
リクエストパラメータは、HttpServletRequestインスタンスに格納され、リクエスト先のサーブレットクラスもしくはJSPファイルに渡される。よって、HttpServletRequestインスタンスのもつメソッドを使えば、リクエストパラメータを取り出すことができる。
@WebServlet("/GetParametersServlet") public class GetParametersServlet extends HttpServlet { protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // リクエストパラメータの文字コードを指定 request.setCharacterEncoding("UTF-8"); // リクエストパラメータを取得 String name = request.getParameter("name"); String color = request.getParameter("color"); }
リクエストパラメータを取得する際に注意する点が4つある。
1.URLパターン
URLパターンをリクエスト送信元フォームのaction属性と一致させる。
2.実行メソッド
サーブレットクラスの実行メソッド(GETメソッド/POSTメソッド)を送信元フォームのmethod属性と一致させる。
3.文字コード
リクエストパラメータを取得する際の文字コードを送信元フォームの文字コードと一致させる。
4.リクエストパラメータのname属性
getParameter()メソッドの引数を送信元フォームのname属性と一致させる。
参照:「スッキリわかるサーブレット&JSP入門」