11.6.オリジナルのクラスを使う
 11.6.1.オリジナルクラスの使用方法
 11.6.2.JavaBeanを使ってみる
 


11.6.オリジナルのクラスを使う

 11.6.1.オリジナルクラスの使用方法
    JSPの基本のところで、Javaのクラスライブラリは<%@ %>タグの中でインポートすればJSPでも使えることができることを、説明しました。今度は自分で作成したクラスを使って複雑な計算をさせJSPで出力するものを作成していきます。

 オリジナルクラスを使う例として、いいものはないかといろいろと考えた結果。自分の誕生日を入力するとその誕生日の曜日を返してくれるクラスを作ってみたいと思います。
 まあ、オリジナルといっても普通のJavaプログラミングと変わらないのでこのへんは皆さん得意ですよね?
 とにかく、下のプログラムを入力して見ましょう。まずはオリジナルのクラスからです。
DayWeek.java
package myclass;

import java.util.*;

public class DayWeek
{
 private int year;
 private int mon;
 private int day;

 public DayWeek(int year,int mon,int day)
 {
  //日にちの取得
  this.year=year;
  this.mon=mon;
  this.day=day;
 }

 //曜日を計算して出力
 public String getWeek()
 {
  //カレンダーにして曜日を取得
  GregorianCalendar cld=new GregorianCalendar(year,mon-1,day);
  int week=cld.get(Calendar.DAY_OF_WEEK);

  //曜日名配列の作成
  String weekday[]={"","月","火","水","木","金","土","日"};

  return weekday[week];
 }
}

 入力が終わったら、これを「javac」コマンドでコンパイルして「class」ファイルを得ましょう。ここからがすこし重要です、取得したclassファイルを今まで作っただけで何もいれてなかった「%Tomcat%\webapps\ex\WEB-INF\classes\」ディレクトリ以下におきます。
 ただし、パッケージを作成しましたので、今回は
  「%Tomcat%\webapps\ex\WEB-INF\classes\myclass」
 にコピーしてください。
 こうすることによって、パッケージ名とクラス名をJSPの中で指定することによってオリジナルのクラスが使用できるようになります。たとえば次のような形なります。
ex11_6_1.jsp
<%@ page contentType="text/html; charset=Shift_JIS"%>
<%
 //情報の受け取りと分割
 String date[]=request.getParameter("date").split("/");
 //整数型に型変換
 int year=Integer.parseInt(date[0]);  int mon=Integer.parseInt(date[1]);
 int day=Integer.parseInt(date[2]);
 
 //オリジナルオブジェクトの作成
 myclass.DayWeek dk=new myclass.DayWeek(year,mon,day);
 //曜日の取得
 String week=dk.getWeek();
%>
<html>
<head><title>ex11_6_1.jsp</title></head>
<body>
あなたの誕生日は<%= year +"/"+ mon +"/"+ day %>ですね。<BR>
この日は<%= week%>曜日でした。
</body>
</html>

 このJSPの11行目でオリジナルのクラスDayWeekのオブジェクトを生成しています。このようにして、「%Tomcat%\webapps\ex\WEB-INF\classes\」ディレクトリはオリジナルのクラスを利用する場合に使用します。それでは確認のためにJSPを動作させてみましょう。今回もパラメータ「date」が必要ですので「http://localhost:8080/ex/ex11_6_1.jsp?date=2002/08/12」のようにアドレスを入力してください。
 

 このように、オリジナルのクラスによって処理された結果を使用することができました。このようにしてclassにしてしまえばあとはJavaのアプリケーションの製作と同じですのでJSPは大変便利なことがわかります。

 11.6.2.JavaBeanを使ってみる
    上のようにクラスを使ってJSPを作成すればどんなに大きなソフトウェアでもJSPにすることができます。つまりJSPは「Javaアプリケーションのインターフェース部分をWeb対応にした」ということができます。さらにJavaにはクラスに一定の規則を持たせることで再利用しやすしようということでJavaBeanというものが存在します。このJavaBeanはJSPにおいて特別でかつ有用なものとして扱われます。今回はJavaBeanを用いてどのリクエスト・セッションからでも扱える永続オブジェクトを作成してみようと思います。
 とにかく難しいことはおいておいて、次のCounterBeanを入力してみてください。
CounterBean.java
package myclass;

public class CounterBean
{
 private int count;

 public void setCount(int n)
 {
  count=n;
 }

 public int getCount()
 {
  return count++;
 }
}

 このクラスはもうみなさんなら、当然理解できると思いますが、プライベートなクラス変数countがあり、それに値を設定するsetCountと値を取得するgetCountメソッドを持ちます。
 これを使用するためには「javac」コマンドでコンパイルして
   「%Tomcat%\webapps\ex\WEB-INF\classes\myclass\」
 においてください。

 このクラスを用いてJSPで訪問者をカウントするカウンタを作ってみたいと思います。Beanを使用するには下のようにします。
ex11_6_2.jsp
<%@ page contentType="text/html; charset=Shift_JIS"%>

<jsp:useBean id="count" class="myclass.CounterBean" />
<jsp:setProperty name="count" property="count" value="123" />

<html>
<head><title>ex11_6_2.jsp</title></head>
<body>
あなたは
<jsp:getProperty name="count" property="count" />
番目の訪問者です。
</body>
</html>

 JSPの中からJavaBeanを使用するにはまず「<jsp:usrBean>」をつかってBeanをJSPで使用できるように宣言する必要があります。
  ・属性「id」はJSPの中で使用するBeanの名前を指定します。
         名前の規則はありませんので任意のもので結構です。
  ・属性「class」はBeanのクラスを指定します。今回はmyclassパッケージのCounterBeanを指定してあります。ここで指定するクラスは「%Tomcat%\webapps\ex\WEB-INF\classes\」など、Webアプリケーションの「WEB-INF」内のclassesディレクトリ以下に置くことが決められています。
 以上の二つの属性を最低限指定してやることでJSPの中からは「id」で指定した名前でBeanが使用できるようになります。

 Beanを実際に使用するには「<jsp:setProperty>」と「<jsp:getProperty>」を用います。
 Beanに対して値を設定するには上の4行目のように<jsp:setProperty>」に以下の属性を与えて呼び出します。
  ・属性「name」は「<jsp:useBean>」で指定した「id」名を指定します。
  ・属性「property」はBeanの中のどの変数に値を設定するかを指定します。
  ・属性「value」は設定する値を指定します。
 今回の場合の「<jsp:setProperty name="count" property="count" value="123" />」は通常のプログラムから「CounterBean.setCount(123)」とすることと同じ意味になります。

 逆にBeanから値を取得するには「<jsp:getProperty name="count" property="count" />」となります。これも先ほどの設定の場合と同じで通常のプログラムから「CounterBean.getCount()」とすることと同じ意味になります。
 実際にこれを実行してみると下図のようになります。
 

 実行してみると、カウントがあがっていかないことがわかると思います。これはBeanがクライアントのリクエストのたびに消滅してしまっているからです。

 
   >>> 一覧へ戻る <<<


このドキュメントの間違い・誤字・脱字を発見された方は筆者までご連絡をいただけるとうれしいです。

また、私のわかる範囲でご質問にも答えようと思います。ご質問や疑問点がある方は気楽にメールをください。