今までに何度も聞いたことはあるかもしれませんが、Webアプリケーションを開発する時に、表示ロジックとビジネス・ロジックを分離することは本当に重要なことです。近年、Javaプラットフォームはアーキテクチャーにこの分離を組込むために発展してきました。例えば、JSPアーキテクチャーにJavaBeansコンポーネントが含まれていると、開発者はコード化されたJavaコンポーネントのプロパティの取得やセットにJSPタグを使用することができます。これらのコンポーネント、すなわちJavaBeansは表示層に代わってバックエンドのビジネス処理を行なっています。
JSPカスタム・タグはJSP/JavaBeanアーキテクチャをもとに出来ています。JavaBeansテクノロジーのように、カスタム・タグは表示ロジックとビジネス・ロジックの分離を容易にしています。また、カスタム・タグは、Webデザイナーが行うHTML、XML、Javascriptの世界とソフトウェア・エンジニアが行うJavaコード、SQL呼び出し、アルゴリズムの世界の橋渡しの役割をします。
今回のJ2EEパスファインダー では、JSPページでJSPカスタム・タグを使用する基本のうちのいくつかを学んでいきましょう。まずJSPタグの紹介から始めて、次にタグを作成して、JSPコンテナにタグを組み入れて、JSPページで使用するというプロセスで進めていきます。記事の終わりでは、JavaStandard Tag Library (JSTL)、つまりJava開発プロジェクトで使用できる標準的なJSPカスタム・タグについて簡単に説明をしましょう。
JSPカスタム・タグ は、JSP JavaBeanタグ(つまりuseBean、getProperty、setProperty)で使用されている特殊なXML構文に従ったユーザ定義タグです。カスタム・タグがservletコンテナーに処理される時、JSPページを呼びだすJavaBeanの処理にJavaクラス・ファイルが使用されるのとほぼ同じ方法で、1つ以上のJavaクラス・ファイルがカスタム・タグを処理するために呼び出されます。タグが処理される時、コンテナーはタグのボディに存在するコンテンツだけでなくその名前と属性を取得して、処理をする複数のクラス・ファイルへそれを渡しています。
Java開発者はタグを加工して、Javaコーディングとデータ操作を処理するようなタグ・ハンドラー・クラスを作成します。Webデザイナーにとっては、バックエンドで動的なデータを活用していることを除けば、カスタム・タグは標準HTMLタグのようなものです。適切に記述されたカスタム・タグにより、WebデザイナーはJavaコードを一行も書くことなく、データを作成したり、問い合わせたり、操作することができます。適切に作成されたカスタム・タグにより、Java開発者はコーディング・プロセスに表示プロセスを組み入れる必要がなくなります。このようにして、アプリケーション開発チームのメンバーは、それぞれが行うべきことに集中することができるのです。
JSPアーキテクチャーは、カスタム・タグの実装に以下のコンポーネントを必要とします。
- それぞれのページでのJSPの宣言
- Webアプリケーション・ディスクリプタへの登録(web.xml)
- カスタム・タグの処理のために呼び出される特殊なXMLファイルとJavaクラスが含まれたJARファイル
次のセクションでは、上記の要件を満たし、JSPページにカスタム・タグを組み込む方法を少しずつ学んでいきましょう。JSPカスタム・タグ実装を成功させるには、次の5ステップがあります。
- タグ・ハンドラー・クラスを作成する
- タグ・ライブラリー・ディスクリプタ(TLD)を作成する
- TLDファイルとハンドラー・クラスをアクセス可能にする
- タグ・ライブラリーを参照する
- JSPページにタグを使用する
この要素はかなり基本的で、簡単なものです。では始めましょう。
次の例を通して、現在の日付と時刻を表示する非常に簡単なカスタム・タグを学びましょう。これが、DateTagです。
<abc:displayDate /> |
最初に行うべきことは、タグ・ハンドラー・クラスの作成です。JSPコンテナーはカスタム・タグを参照するJSPページの実行中に、それぞれのカスタム・タグを評価しています。コンテナーはタグを見つけると、そのタグに関連したタグ・ハンドラー・クラスを呼び出します。このプロセスは、後で詳しく説明します。すべてのタグ・ハンドラーはJSP APIとの特別なインタフェースを実装しています。タグには、タグのコンテンツ(あるいはボディ)を処理することができるタグと、できないタグの2種類があります。
<abc:tagWithNoBody attribute="value"/>
<abc:tagWithBody attribute="value">
This is some body content that the tag handler can operate upon.
</abc:tagWithBody>
|
例で示したDateTagは現在の日付を表示するだけなので、ボディ・コンテンツを含む必要はありません。そのため、ハンドラー・クラスは(通常TagSupportクラスを拡張することで)Tagインタフェースを実装します。もしボディ・コンテンツを処理することができるタグを作成するならば、(通常BodyTagSupportクラスを拡張することで)BodyTagインタフェースを実装する必要があるでしょう。リスト1は、DateTag用のハンドラー・クラスです。
リスト1. タグ・ハンドラー・クラス
package myTags;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import javax.servlet.http.*;
import java.text.*;
import java.util.*;
public DateTagextends TagSupport {
public intdoStartTag() throws javax.servlet.jsp.JspException {
HttpServletRequest req;
Locale locale;
HttpJspPage g;
DateFormat df;
String date;
JSPWriter out;
req = ( HttpServletRequest )pageContext.getRequest();
locale = req.getLocale();
df = SimpleDateFormat.getDateInstance( SimpleDateFormat.FULL,locale );
date = df.format( new java.util.Date() );
try {
out = pageContext.getOut();
out.print( date );
} catch( IOException ioe ) {
throw new JspException( "I/O Error : " + ioe.getMessage() );
}//end try/catch
return Tag.SKIP_BODY;
}//end doStartTag()
}//end DateTag
|
DateTagハンドラー・クラスに関して、いくつか注目しておくことがあります。まず、メソッド宣言を見てください。もし直接Tagインタフェースを実装するならば、いくつかのメソッド宣言を行う必要があります。TagSupportクラスはTagインタフェースに宣言されたメソッドを完全に実装しているシンプルで分かりやすいクラスなので、カスタム・タグに使用したいメソッドだけを自由に実装することができます。このシンプルな例では、doStartTag()メソッドだけ使用しましたが、このメソッドは開始タグを見つけた時に呼び出されます。
また、doStartTag()メソッドがSKIP_BODYを返していることに気付いてください。この理由はもちろん、シンプルなdateタグにボディがないためです。注目すべきことの最後は、出力ストリームにコンテンツを直接送るために、出力バッファにアクセスするpageContextオブジェクトが使用されているということです。このシリーズの過去の記事から思い出していただけるように、pageContextオブジェクトは現在のページと関係のある属性へのアクセスを提供している暗黙オブジェクトです。
ソース・コード・ファイルを書いたら、(classpathにServlet/JSPのJARファイルを含めて)他のJavaクラスをコンパイルするようにクラスをコンパイルして、Webアプリケーションのクラス・ディレクトリ(WEB-INF/classes)にコンパイルされたクラス・ファイルを置きます。もしいくつかのタグを開発したり、タグ変数を備えたタグを定義しているならば、多数のタグ・ハンドラー・クラスがあることでしょう。その場合は、クラス・ディレクトリにアーカイブされていないファイルとしてファイルを配置するのではなく、JARファイルにハンドラー・クラスをパッケージ化するほうがいいかもしれません。
次のステップは、カスタム・タグとカスタム・タグを処理するJavaクラスとのマッピングを含んだライブラリの定義です。このライブラリは、タグ・ライブラリ・ディスクリプタ(TLD)というXMLドキュメントに定義されています。DateTagのTLDはDateTagLib.tld となります。「.tld」はこのようなファイルの標準拡張子です。
リスト2.DateTagLib.tldファイル
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
<tlibversion>1.0</tlibversion>
<info>A simple tag library</info>
<tag>
<name>displayDate</name>
<tagclass>myTags.DateTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Display Date</info>
</tag>
</taglib>
|
DateTagLib.tldは最小限のタグ・ライブラリ・ディスクリプタ・ファイルです。タグ名とハンドラー・クラスがマップされるTagタグ内に重要な情報はすべて含まれており、ボディ・コンテンツへのタグに関係する宣言がなされています。より複雑には、ライブラリやタグに関してより多くの情報を提供する追加のXMLタグを使用することができます。一つのライブラリに複数のタグを定義することは一般的なことです。
ステップ3.TLDファイルとハンドラー・クラスをアクセス可能にする
第3のステップは、クラスとTLDをWebアプリケーションからアクセス可能にすることです。このためには2つの方法があります。JARファイルにクラスとTLDをパッケージ化して、WebアプリケーションのlibディレクトリにJARファイルを格納する方法か、クラスのサブディレクトリにアーカイブされていないクラス・ファイルを置いて、WebアプリケーションのWEB-INFディレクトリの配下にTLDファイルを置くという方法です。
この例では、Webアプリケーション・ディレクトリ構造内にTLDファイルとアーカイブされていないクラスを配置する第2のアプローチを使用します。既にステップ1で、クラス・ディレクトリにタグ・ハンドラー・クラスを配置したことを覚えていることでしょう。したがって、ここではTLDファイルを格納するだけです。TLDファイルはWEB-INFディレクトリもしくはサブディレクトリに格納され、JARファイルのデプロイの場合にはMETA-INF/ディレクトリあるいはJARのサブディレクトリに格納されます。今回は、JARファイルを使用していません。したがって、WebアプリケーションのWEB-INF/libディレクトリにTLDを格納します。
次のステップは、JSPページとタグ・ライブラリ間の参照を確立することです。ここまでは、タグ・ハンドラー・クラスを作成し、ハンドラーとタグとのマッピングを定義するためにTLDファイルを作成し、クラスとタグがアプリケーションにアクセス可能であるようにしてきました。JSPページとそのライブラリとの参照を宣言するためには、2つの方法があります。Webアプリケーション・ディスクリプタ(web.xml)で静的な参照を宣言する方法か、ページ内で動的な参照を直接宣言する方法です。両方とも試してみましょう。
静的な参照をおこなうためには、まずweb.xmlファイルに以下のエントリを追加しなければなりません。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<Web-app>
<!-- Define Servlets, Servlet Mappings, etc. -->
<taglib>
<taglib-uri>myTags</taglib-uri>
<taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location>
</taglib>
</Web-app>
|
次に、カスタム・タグ・ライブラリを使用するすべてのページにJSP宣言を追加します。
<%@ tagliburi="myTags" prefix="abc" %> |
指定したuri属性が、web.xmlファイルで指定したtaglib-uriの値と一致することに留意してください。
動的な参照をおこなうためには、ライブラリを使用するすべてのページにJSPの宣言を加えるだけです。
<%@ tagliburi="/WEB-INF/lib/DateTagLib.tld" prefix="abc" %> |
taglibへの静的な参照を行う時、JSP宣言はライブラリ検索のためにweb.xmlファイルに問い合わせをしなければなりません。これは、ライブラリを移動させたり、リネームしたり、web.xmlファイルにライブラリを追加したい場合は、サーバを停止して、web.xmlファイルを更新し、サーバをリスタートしなければならない、ということです。動的なアプローチの場合は、TLDの位置に対するJSPページ・ポイントを保持しており、したがって、JSPページの変換時間に処理されることになります。
静的なアプローチは、ページとライブラリの名前および位置間に間接性を提供します。つまり、ページを変更することなく、これらの属性を変更することができる柔軟性を提供しています。他方で、動的なアプローチはランタイムにタグの宣言を追加したり削除することができるさらなる柔軟性を提供しています。動的アプローチは魅力的ではあるものの、変更の際は常に多数のページを変更しなければならなうという潜在的なメンテナンスの頭痛が気になるならば、Web appのカスタム・ライブラリにアクセスするそれぞれのページに、includeしている個別のJSPファイルにJSPの宣言を配置するようにします。これにより、情報を一度更新するだけで、ランタイムにライブラリを追加するとことができます。
ここまでのすべての作業ができていれば、JSPページでカスタム・タグを使用する準備ができています。リスト3はDateTagを含むJSPページのブラウザー出力です。
リスト3.カスタム・タグを備えたJSPページ
<%@ taglib uri="/WEB-INF/lib/DateTagLib.tld" prefix="abc" %>
<HTML>
<HEAD>
<TITLE>Date tag example</TITLE>
</HEAD>
<BODY>
<H1>Date tag Example</H1>
<p>Hi today is <b><abc:displayDate /></b> </p>
</BODY>
</HTML>
|
Webサーバをブートして、JSPページを試してみてください! 結果は図1で示されるようなものになるでしょう。
図1. DateTagのブラウザー出力
必要となるカスタム・タグ機能の80%以上が、J2EEコミュニティによって既に作成され標準化されています。ゼロからすべてを作成するのではなく、既存のタグ・ライブラリを使用することで多くの時間およびエネルギーを省くことができます。何十ものタグ・ライブラリがパブリック・ドメインで利用できますが、業界は1つの特別なカスタム・タグ・ライブラリのもとに結集しました。Java Standard Tag Library (JSTL)は、Java Community Processに設計されました。また、その参照実装はJakarta TaglibsプロジェクトのApache Groupによって開発され、維持されています(参考文献を参照)。
JSTLは、可変サポート、フロー制御、URL管理、XML操作、国際化、データベース・アクセス、などの共通Webアプリケーション処理に必要なものを扱うタグを定義しています。タグの豊富さに加えて、JSTLは式言語(EL)を定義しています。ELにより、アプリケーションのデータに簡単にアクセスができ、スクリプトレットやリクエスト時の式なしに簡単にデータを操作することができます。
すべてのタグをゼロから開発する時間およびエネルギーを省くことができるのに加え、JSTLには標準化および業界の承認という利点があります。これらにはベンダー・サポート、豊富な文献、JSTLの利用した経験のある人を見つける見通しが含まれています。
J2EE Web開発でビジネスロジックと表示ロジックを分離する技術的なソリューションの探求において、JSPカスタム・タグは平易な昔のJavaBeansやJava scriptletsに代わる選択肢を提供しています。さらに役立つものは、JSTLに定義されている標準的なカスタム・タグ・ライブラリの存在です。 J2EEパスファインダー の今回の記事では、ゼロからカスタム・タグを作成して、それをJSPページに実装するプロセスを学んできました。さらに、ゼロからすべてのカスタムを作成するのではなく、JSTLを簡潔に紹介してそれを使用する利点も概説しました。
次回は、J2EEのWebアプリケーションのセキュリティ・アーキテクチャーへと進んで、J2EEテクノロジーの探求を続けていきましょう。では、次回をお楽しみに!
-
Jakarta Taglibs ProjectはJava Standard Tag Library 1.2のホーム・ページです。
- Ken Wilson氏の「I Love JSP Custom Tags!」!ページは、カスタム・タグを使用するWebデザイナの観点から書かれたJSPカスタム・タグへの楽しい入門ページです。
- Brett McLaughlin'氏の最新の「taglib入門」(developerWorks 、2003年7月)は、スクリプトレットをJSPカスタム・タグに変換する方法を説明しています。
- Mark Kolb氏の4部の JSTL入門(developerWorks 、2003年2月-6月)は、JSPカスタム・タグとJSTLについて知っておくべきことがすべて書かれています。
- Professional JSP の中で、著者Dan Malks氏は、ビジネス・ロジックと表示ロジックを分離することの重要性だけでなく、この分離をサポートするJavaプラットフォーム・アーキテクチャの発展について説明しています。
-
J2EE パスファインダー シリーズ全編を参照してください。
- developerWorks のJavaテクノロジー・ゾーンでは、Javaプログラミングに関する多くの記事を参照することができます。

Kyle Gabhart氏は、世界中のクライアントに一流の教育と指導を提供するダイナミックな知識企業であるLearningPatterns の上級指導者です。Kyleは、その熱意と新しいテクノロジーに対するダイナミックな分析や紹介で知られる人気の演説者です。彼の最近および次回の演説や業界関係の出版物については、Gabhart.com をご覧ください。Kyleの連絡先はkyle@gabhart.com です。