JavaBeansの設計 本章のプログラムを御覧の際には、Tomcatが必要です。
こちらからダウンロード出来ます。
ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。
Beanの設計 Beanの設計は、クラスの作り方と全く同様ですが、Beanと呼ばれる為には、幾つかの条件が有ります。
先ずは、クラスの作り方について簡単に復習しながら、Beanの規則を押さえておきましょう。
クラスは以下の手順で作ります。 @フィールドの設計 此のクラスには、どんなデータを持たせるべきか決定します。
クラスにとって、最も基本で最も重要な作業です。 Aコンストラクタの設計 此のクラスをインスタンス化してオブジェクトを生成する為の特別なメソッドで、クラス名とコンストラクタ名は同一でなければなりません。
Beanでは、必ず「引数無しのコンストラクタを用意」しなければなりません。 Bセッタメソッドとゲッタメソッドの設計 フィールドの各データを参照するメソッドであるゲッタメソッドと、フィールドに値を設定する為のメソッドであるセッタメソッドを作成します。
Beanでは、 セッタ名:set○○○()
ゲッタ名:get○○○() |
でなければなりません。
しかも「○○○」の内容は、該当するフィールド名の先頭を大文字にした物でなければなりません。 C操作メソッドの設計 各フィールドを使って情報を加工した結果を取得したり、条件に従って、フィールドの値を変更したりするメソッドです。 日付を扱うBean(MyDate.java) 其れでは、実際にBeanを設計して作ってみましょう。
先ず、日付を扱うMyDateクラスです。 @フィールド 日付を扱うクラスはDateクラスが便利である事は、第7章の最後で学習しました。
此処では、Dateクラスのオブジェクトを1つフィールドに持つ事にします。 Aコンストラクタ 会議室予約システムの起動時は、其の日の予約状況が表示された方が良いでしょう。
其処で、オブジェクトをインスタンス化時には、dateフィールドは、「現在」の情報で初期化される様にします。
現在の日付と時刻をマシンのシステム時計から取得するには以下のメソッドを使います。 date = Calender.getInstance().getTime(); |
Bセッタメソッドとゲッタメソッド dateオブジェクトのセッタメソッドとゲッタメソッドを作ります。 public void setDate(Date date)
public Date getDate() |
C操作メソッド 表示形式の文字列を得る 此処で設定されている日付をブラウザ画面に表示する時には、「2004年3月9日(火)」と表示するので、此の形式の文字列を取得するメソッドを作っておきましょう。
日付を指定の形式の文字列に変換するには、SimpleDateFormatクラスを使うと便利でしたね。 public String toDispFormat() |
指定の日数だけ日付を変更 予約状況を表示する画面は、「先週」「昨日」「明日」「来週」の様に、表示する日付が移動出来る様にします。
其処で、指定の日数だけ日付を移動するメソッドを作っておきましょう。
日付の計算を行うには、Calendarクラスが便利です。
ドキュメントで調べてみて下さい。 public void moveDate(int dx){
//dx:変更したい日数
Calendar calendar = new GregorianCalendar();
calendar.setTime(date); //Calendarクラスへの変換
calendar.add(Calendar.DATE,dx); //日付の変更
date = calendar.getTime(); //dateクラスに変換
} |
ログイン情報をまとめるBean「UserInfomation.java」 次に、ログイン情報を1まとめにするBeanを作ります。
此を使って、まとめてセッションにバインド出来る様になります。 @フィールドの設計 ログイン時の「ID」「パスワード」「E-mail」に加えて、現在表示している「日付情報」も一緒に入れておきます。
此の人が、何日の予約状況を見ているかと言う事も、セッションにバインドする必要が有るからです。 private String userID; //担当者
private String password; //パスワード
private String email; //E-mail
private MyDate date; //予約日 |
Aコンストラクタの設計 Beanの条件である、引数無しのコンストラクタに加えて、インスタンス化時に、フィールドの初期化を行うコンストラクタも用意する事にしましょう。 public UserInformation()
public UserInformation(String userID, String password, String email, MyDate date) |
Bセッタメソッドとゲッタメソッドの設計 4つのフィールドのそれぞれにセッタメソッド、ゲッタメソッドを用意します。 public void setUserID(String userID)
public String getUserID();
ppublic void setPassword(String password)
public String getPassword();
ppublic void setEmail(String email)
public String getEmail();
ppublic void setDate(MyDate date)
public MyDate getDate(); |
パッケージ化 Beanは、全部まとめてパッケージ化しておきましょう。
此処では、 C:\javasrc\yoyaku\WEB-INF\classes |
フォルダの下に「yoyakuBeans」と言うフォルダを作って、此処にまとめておく事にします。
各Beanのソースでは先頭に、 と書いておきます。 JSPによるBeanの利用
JSPでは、Beanのオブジェクトを利用する為のタグが用意されています。
@「<jsp:useBean>」アクション 此のタグにより、指定のクラスのオブジェクトが利用出来る様になります。
タグの構文は、以下の通りです。 <jsp:useBean id = "オブジェクト名" scope = "オブジェクトの有効範囲" class = "クラス名"/> |
又は、 <jsp:useBean id = "オブジェクト名" scope = "オブジェクトの有効範囲" class = "クラス名">
beansに関する処理
</jsp:useBean> |
各属性には、以下の様な値を与えます。
属性 |
説明 |
id |
オブジェクト名を与える
此のタグ以降、インスタンス化されたオブジェクトとして利用可能 |
scope |
以下の何れかを書く
値 |
説明 |
page |
此のページ中でのみ利用可能
デフォルト |
request |
此のリクエストの処理の間、参照可能
此のページのみならず、includeされたページの中でも参照可能 |
session |
セッションが継続する間、参照可能
セッションに此の「id」のオブジェクトが存在した場合、改めてインスタンス化せずに、同じ物を参照
セッションにバインドされていない場合には、新しくインスタンス化 |
application |
アプリケーションが継続している間、参照可能
セッションを越えて、他のサーブレットやJSPから、同一のオブジェクトが参照可能 | |
class |
オブジェクトのクラスを指定 |
例: |
<jsp:useBean id = "user" class
= "yoyakuBeans.UserInformation"
scope = "session"> | A「<jsp:setProperty>アクション Beanのセッタメソッドを呼び出して、フィールドに値を設定するタグです。
構文は、以下の通りです。 <jsp:setProperty name = "オブジェクト名" property = "フィールド名" value = "値" /> |
又は、 <jsp:setProperty name = "オブジェクト名" property = "フィールド名" param = "パラメータ名" /> |
フィールドに設定する値を直接書く場合は、前者を使います。
フォームを持つJSPやHTMLから呼び出され、パラメータを伴う場合には、後者を使います。
つまり後者は、 と、値の設定を同時に行う物です。
例: |
<jsp:setProperty name = "user"
property = "userID" param = "userID"/>
<jsp:setProperty name = "user"
property = "password" value = "YOYAKU"/> | 「userID」には、ログイン画面のフォームに入力された文字列が設定されます。
「password」には、常に「"YOYAKU"」が設定されます。 B「<jsp:getProperty>アクション Beanのゲッタメソッドを呼び出して、フィールドに設定されている値を取得するタグです。
構文は、以下の通りです。 <jsp:getProperty name = "オブジェクト名" property = "フィールド名" /> |
HTTPプロトコルGETコマンドによるパラメータの引き渡し HTMLやJSPのフォームに配置されたボタンをクリックすると、HTTPのPOSTコマンドが発行され、サーブレットのdoPostメソッドが呼び出される事は、既に学びました。
HTMLの「<A HREF=・・・・・・> </A>」によるハイパーリンクでも、パラメータのサーブレットに引き渡せます。
HTMLの構文は以下の通りです。 <A HREF = "リンク先?パラメータ名 = パラメータ値">リンク文字列</A> |
日付の移動に、パラメータ付きのハイパーリンクを使用します。
例: |
<A HREF = "../servlet/ChangeDate?
diff = -7">先週</A>
<A HREF = "../servlet/ChangeDate?
diff = -1">昨日</A>
<A HREF = "../servlet/ChangeDate?
diff = 0">今日</A>
<A HREF = "../servlet/ChangeDate?
diff = 1">明日</A>
<A HREF = "../servlet/ChangeDate?
diff = 7">来週</A> | パラメータ名「diff」に対応するパラメータ値には、移動する日数を指定します。
ハイパーリンクによるパージの移動では、HTTPのGetコマンドが発行され、サーブレットのdoGetメソッドが呼び出されます。
メソッドの中でパラメータ値を取得するのは、POSTコマンドの時と同じです。 String p = request.getParameter("パラメータ名"); |
セッションにバインドされているデータの変更 日付を移動したら、セッションにバインドされているデータを新しい日付に更新します。
此処で、メモリ内のデータの様子を確認しておきましょう。
セッションは、サーバ側のメモリに記憶される情報でしたね。
サーブレットは、セッションにバインドしたいオブジェクトをインスタンス化します。
鈍行列車予約システムでは、ログイン画面への入力内容をチェックして、認証可能である時、オブジェクトをインスタンス化してセッションにバインドします。
日付情報を変更するには、セッションを取得して、其処のバインドされているパラメータ名「"userInf"」に当たるパラメータ値を取得、更に其の中から、日付情報を取得して、データを書き換えます。 プログラムのつながり 日付の変更するサーブレット「ChangeDate.java」を加えて、プログラムのつながりを確認しましょう。 戻る |