前回は既存のJSPコードをインクルードすることで、プログラムを再利用する方法を説明しました。今回は、JavaクラスとBeanのそれぞれについてオリジナルのものを作成し、それを利用する方法を解説します。また、JSPにおけるBeanのスコープの概念についても簡単に説明します。
第5回でも解説しましたが、JSPでのプログラムの再利用方法には、主に次のような方法があります。
第5回ではインクルードの手法を解説しました。今回は、上記の手法の後半にあたるオリジナルクラスとオリジナルBeanの作成と使用方法について説明します。クラスとBeanの作成は、一般的なJavaプログラムでも用いられる手法です。ここでは、これらのクラスとBeanを、どのようにしてJSPと連携させるのかを理解しましょう。
JSPプログラムおよびJavaプログラムでは、あらかじめ準備された豊富なAPIの便利な機能を使用して、複雑な処理も楽に実現させることができます。しかしながら、システムを開発していくうえで、独自の機能を持ったクラスが必要になることがあります。そのような場合にはオリジナルのクラスを作成し、それをJSPから使用することになります。繰り返し使用する機能はクラスにまとめてしまうことで、プログラムの有効な再利用を行うことができます。
ここでは、具体例として著作権表示用のHTMLを生成するCopyrightHTMLクラスを作成し、それを使用する方法を説明します。
まず、CopyrightHTMLクラスには、メンバ変数としてそれぞれ文字列型の、year(著作年)と、name(著作者の名前)、およびmail(メールアドレス)があるものとします。また、メソッドとして、標準的な著作権表示HTML文を取得するgetNormalHTML()と、短い著作権表示HTML文を取得するgetShortHTML()があるものとします。
このCopyrightHTMLクラスのソースコードは次のようになります。なお、メールアドレスが指定されている場合には著作者名に自動でリンクする機能を付けています。
package atmarkit; /** * 著作権表示用のHTMLを生成するクラス */ public class CopyrightHTML { /** 著作年 */ public String year = ""; /** 著作者 */ public String name = ""; /** メールアドレス */ public String mail = ""; /** * 標準的な著作権表示HTML文を取得する * @return 標準的な著作権表示HTML文 */ public String getNormalHTML() { // メールアドレスが指定されている場合は著作者名にリンクをつける if(!mail.equals("")) { name = " <a href=\"mailto:" + mail + "\">" + name + "</a>"; } return "Copyright " + year + " " + name + ". All rights reserved."; } /** * 短い著作権表示HTML文を取得する * @return 短い著作権表示HTML文 */ public String getShortHTML() { // メールアドレスが指定されている場合は著作者名にリンクをつける if(!mail.equals("")) { name = " <a href=\"mailto:" + mail + "\">" + name + "</a>"; } return "(C) " + year + " " + name + "."; } }
一般的なJavaプログラミングとなんら変わりはないので、特に難しいところはないでしょう。JSPから使用できるようにするために、クラス自体と、各メンバ変数、メソッドの属性はpublicにしてあることに注意しましょう。
簡単なプログラムコードなのに、コメント文がおおげさに見えるかもしれません。しかし、このようなコメントを付けておくと、javadocコマンドによって次のようなHTML形式のAPIドキュメントを自動で生成することができます。後で仕様を確認するうえで、とても便利です。javadocに関する詳細はこちら(http://java.sun.com/j2se/javadoc/)を参照ください。
さて、いままでのJSPのプログラミングでは明示的にコンパイルを行う必要はありませんでしたが、今回のCopyrightHTML.javaは純粋なJavaのプログラムなので、コンパイルが必要です。次のように入力してコンパイルしましょう。CopyrightHTML.classが生成されます。
% javac CopyrightHTML.java
javacコマンドは、J2SDKをインストールしたディレクトリのbin以下にあります。
次に、コンパイルしてできたCopyrightHTML.classを、WEB-INF/classes/以下に配置します。この配置方法については、本連載第4回目で説明しています。今回は、1行目の、
package atmarkit;
の宣言によって、atmarkitパッケージに属するクラスとして定義しているので、次のようなディレクトリ構成になります。ディレクトリが存在しない場合は作成しましょう($docBaseは、Context pathで指定したdocBaseのパスになります)。
$docBase/WEB-INF/classes/atmarkit/CopyrightHTML.class
さて、これでオリジナルのクラスを使用する準備が整いました。さっそく、JSPからこのクラスを使用してみます。CopyrightHTML.classを使用したサンプルコードは次のとおりです。
<%@ page contentType="text/html; charset=euc-jp" import="atmarkit.CopyrightHTML" %> <% // オリジナルクラスを使用する CopyrightHTML copyright = new CopyrightHTML(); copyright.year = "2001"; copyright.mail = "taro@java.server.pages"; copyright.name = "JSP 太郎"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>オリジナルクラスを使用する</title> </head> <body> <p>-- オリジナルクラスを使用する --</p> <p> <hr> 標準的な著作権表示<br> <%= copyright.getNormalHTML() %> <hr> 短い著作権表示<br> <%= copyright.getShortHTML() %> <hr> </p> </body> </html>
まず1行目で、今回作成したatmarkit.CopyrightHTMLクラスをインポートしています。その後、4行目でインスタンスを作成し、5〜7行目でメンバ変数を設定しています。実際の著作権表示用のHTMLの取得は20行目と23行目で行っています。
一度、オリジナルクラスの作成とその配置方法が分かれば、既存のAPIに準備されたクラスと同じようにして使用できます。
上記のJSPプログラムを実行した結果は次のようになります。
WEB-INF/classes/ 以下にクラスを配置することで、新しく作成したクラスはTomcatを再起動しなくても読み込むことができます。しかしながら、もともと存在しなかったWEB-INFディレクトリを新しく作成した場合など、うまくパスが認識されないことがあるようです。その際は、Tomcatを再起動してみましょう。
Beanとは、JavaBeansの仕様で定義された命名規則と設計規則に従って作成されたJavaクラスのことをいいます。
詳細は、サン・マイクロシステムズのサイトのJavaBeansに関するドキュメント(http://java.sun.com/products/javabeans/docs/)を参照してください。
詳細なドキュメントを読むと、とても難しい話をしている印象を受けますが、BeanであるクラスとBeanでないクラスの違いを一言でいってしまうと「Beanにはプロパティの値を設定するメソッドとプロパティの値を取得するメソッドの名前に決まり事がある」ということができます。基本的には、setとgetの後にプロパティ名を続けたメソッドを準備すればよいだけなので、まずはそれほど難しく考える必要はありません。これらのプロパティの値にアクセスするためのメソッドはアクセッサと呼ばれ、これらをきちんと定義することで、特定のクラスをBeanとして扱うことができるようになります。Beanは、うまく使用することで、開発効率を向上させたり、より信頼性の高いプログラミングを行うことができます。
BeanはJavaクラスの1つなので、当然のことながらすでに述べたクラスファイルの扱いと同じ方法でもJSPから使用することができます。しかしながら、JSPにはBeanをより効率よく使用する仕組みが用意されています。ここではその使用方法について説明します。Bean の設計方法、および作成方法の詳細について説明すると、それだけで本が1冊書けてしまうので、ここでは省略します。本サイト内の連載記事「樋口研究室 スマートなサーバ・サイドJava」内でのBeanの説明も参考にしてみてください。
さてここでは、CopyrightHTMLクラスをBeanにしてみることにします。Beanのクラス名は、CopyrightHTMLBeanとします。プログラムコードは次のようになります。
package atmarkit; /** * 著作権表示用のHTMLを生成するBean */ public class CopyrightHTMLBean { /** 著作年 */ private String year = ""; public void setYear(String year) { this.year = year; } /** 著作者 */ private String name = ""; public void setName(String name) { this.name = name; } /** メールアドレス */ private String mail = ""; public void setMail(String mail) { this.mail = mail; } /** * 標準的な著作権表示HTML文を取得する * @return 標準的な著作権表示HTML文 */ public String getNormalHTML() { // メールアドレスが指定されている場合は著作者名にリンクをつける if(!mail.equals("")) { name = " <a href=\"mailto:" + mail + "\">" + name + "</a>"; } return "Copyright " + year + " " + name + ". All rights reserved."; } /** * 短い著作権表示HTML文を取得する * @return 短い著作権表示HTML文 */ public String getShortHTML() { // メールアドレスが指定されている場合は著作者名にリンクをつける if(!mail.equals("")) { name = " <a href=\"mailto:" + mail + "\">" + name + "</a>"; } return "(C) " + year + " " + name + "."; } }
基本的な様子は、CopyrightHTML.javaとほとんど変わっていません。唯一変わったのは、前回はpublicだったメンバ変数がprivateになり、各変数を設定するためのメソッドset変数名メソッドが追加された点です。
このような簡単な変更で、CopyrightHTMLクラスを、Beanとして定義し直すことができました。
ここで作成したBeanのプログラムは、前回のクラスファイルと同じようにコンパイルし、また同じようにWEB-INF/classes/以下に配置します。
それではさっそく、このBeanをJSPプログラムから使用してみましょう。プログラムコードは次のようになります。
<%@ page contentType="text/html; charset=euc-jp" %> <jsp:useBean id="copyright" class="atmarkit.CopyrightHTMLBean" /> <jsp:setProperty name="copyright" property="year" value="2001" /> <jsp:setProperty name="copyright" property="mail" value="taro@java.server.pages" /> <jsp:setProperty name="copyright" property="name" value="JSP 太郎" /> <% // オリジナルBeanを使用する %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>オリジナルBeanを使用する</title> </head> <body> <p>-- オリジナルBeanを使用する --</p> <p> <hr> 標準的な著作権表示<br> <jsp:getProperty name="copyright" property="normalHTML" /> <hr> 短い著作権表示<br> <jsp:getProperty name="copyright" property="shortHTML" /> <hr> </p> </body> </html>
コードをご覧になれば分かると思いますが、前回のものとはだいぶ様子が違います。<jsp:useBean> <jsp:setProperty> <jsp:getProperty>という新しいタグが出てきました。JSPでは、このようなBeanタグと呼ばれるタグを使用してBeanを使用します。それぞれのタグの使用方法は次のとおりです。
Beanの使用を宣言します。
<jsp:useBean id="copyright" class="atmarkit.CopyrightHTMLBean" />
例えば上のような記述では、atmarkit.CopyrightHTMLBeanクラスのBeanをcopyrightという名前で使用することを宣言しています。通常のプログラムにおける、
atmarkit.CopyrightHTMLBean copyright = new atmarkit.CopyrightHTMLBean();
の記述と同じような意味を持ちます。
Beanのプロパティの値を設定します。
<jsp:setProperty name="copyright" property="year" value="2001" />
例えば、上のような記述では、copyrightという名前で宣言されたBeanのyearというプロパティに2001という値を設定しています。具体的には、copyrightオブジェクトのsetYearメソッドが実行されるので、通常のプログラムにおける
copyright.setYear("2001");
の記述と同じ意味を持ちます。
Beanのプロパティの値を取得します。
<jsp:getProperty name="copyright" property="shortHTML" />
例えば、上のような記述では、copyrightという名前で宣言されたBeanのshortHTMLというプロパティの値を取得しています。具体的には、copyrightオブジェクトのgetShortHTMLメソッドが実行されるので、通常のプログラムにおける、
copyright.getShortHTML();
の記述と同じ意味を持ちます。
さて、上記の実行結果は、クラスを使用したときと同じように、次のようになります。予想どおり、CopyrightHTMLクラスを使用した例と結果はまったく同じですね。
上記の例では、ごく簡単なサンプルだったため、あまりBeanを使用することのメリットが感じられなかったかもしれません。しかし、Beanは使い方によってはとても有効に機能します。今回は、1ページの表示で完結するJSPプログラムだったので、特に意識しませんでしたが、Beanには、その有効範囲を指定できるscope属性があります。
例えば、<jsp:useBean>タグを次のように記述することでscopeを指定できます。
<jsp:useBean id="id_name" class="class_name" scope="scope" />
ここで指定できるscopeの値は、page、request、session、applicationの4通りのいずれかです(scope 属性を指定しなかった場合はデフォルトでpageが使用されます)。このscope属性は、一度宣言されたBeanにアクセスできる有効範囲を意味します。例えば、scopeにsessionを指定した場合、同じセッションの範囲においては、違うページであっても同じidの値を指定することで、同一のBeanにアクセスすることができます。このようにすることで、セッション間の各ページで1つのBeanを共有することができ、異なるページで同一の情報へアクセスできるようになります。
それぞれのscopeを指定したときのBeanの特徴は次のようになります。scopeの指定によって、Beanをより有効に利用できるようになります。
scope の値 | アクセス可能な範囲 | 特徴 | |
---|---|---|---|
page | 現在のページのみ | デフォルトで使用されるスコープ。もっとも有効な期間が短い | |
request | 現在のリクエストの範囲(インクルードされたページ、転送先のページを含む) | レスポンスがユーザーに返されるまでの間だけ有効 (使用例:FORMで入力されたデータを保持させる) |
|
session | 現在のセッションの範囲 | セッションと同じだけの有効期間を持つ (使用例:ログインしたユーザーの情報を保持させる) |
|
application | 現在のWebアプリケーション | アプリケーションの有効期間と同じだけ、永続的に使用できる (使用例:アクセスカウントなど、アプリケーション間で共有する情報を保持させる) |
|
今回は、オリジナルのクラスとオリジナルBeanを作成して使用する方法を解説しました。Beanの扱いについてはとても奥が深いので、今回述べられなかった大切な要素もたくさんあるのですが、まずはBeanの特徴と、JSPからの使用方法を理解してください。次回は、JSPでのセッションの扱いについて解説します。
Copyright © ITmedia, Inc. All Rights Reserved.