アットマーク・アイティ @IT@IT自分戦略研究所QA@ITイベントカレンダー+ログ
 @IT > Webアプリケーション構築の最適解 > JSPカスタムタグ徹底入門(2)
 
@IT[FYI]

 
Webアプリケーション構築の最適解“JSPカスタムタグとは?”
JSPカスタムタグ徹底入門

第2回 実践!JSPカスタムタグ活用術

今回は、いよいよJSPカスタムタグを用いたアプリケーションを作成してみる。使わなかった場合と比較しながら、いかにJSPカスタムタグが有効かを紹介する。実際の動作に必要なソースとデータベースがダウンロードできるようになっているので、是非ご自分でJSPカスタムタグの便利さを実感してほしい。 (2002/1/11)

はじめに

 第1回では、JSPカスタムタグの概要とカスタムタグの作成方法の基礎を解説しました。今回は、カスタムタグの利用方法とそのメリットについて見ていきます(カスタムタグ開発者とJSP開発者の役割分担については前回触れました)。

 今回は、J2EE完全準拠のアプリケーションサーバ JRunが提供しているカスタムタグを使用したJSPページと、使用しないJSPページを比較していきましょう。

JRunのインストール

 まず、JRunのサイトから、JRun 3.1J Developer版をダウンロードしましょう。Developer版は、開発/テスト用途に限定されたもので、無償で提供されています。

 Windows95/98/NT/2000版で約27MB、UNIX/Linux版でも約41MBと、J2EEコンテナとしては非常に軽量といえるでしょう。

 本稿では、Windows 2000を使用します。ダウンロードしたファイル(jrun-31-win-jp.exe)を実行すると、インストーラが起動しますので、ガイドに従って、インストールしましょう。

 特に難しい点はないと思いますが、分からない点がある場合などは、マニュアル「JRun セットアップガイド」 を参照してください。

ODBCデータソースの設定

 今回のサンプルコードで使用するデータベースには、Microsoft Accessの.mdbファイル、 jruntagdemo.mdbを使用します。このファイルを、適当なフォルダにダウンロードしましょう。

 コントロールパネルから「データソース (ODBC)」を実行し、「ODBCデータソースアドミニストレータ」を起動します。「システムDSN」タブで「追加」をクリックし、「データソースの新規作成」ウィンドウで、「Microsoft Access Driver (*.mdb)」を選択します。

 「ODBC Microsoft Access セットアップ」ウィンドウで、「データソース名」に「jruntagdemo」を指定し、「選択」をクリックして、ダウンロードしたファイル「jruntagdemo.mdb」を指定します。

 これで、次のようなシステムデータソースが追加されるはずです。

JDBCデータソースの設定

 JSPからODBCデータソースにアクセスするためには、JDBCデータソースを設定しておく必要があります。JRunでは、管理コンソールでこの設定を行えます。

 admin JRunサーバーを起動していない場合は、[スタート]→[プログラム]→[JRun 3.1]→[admin JRunサーバー]を実行し、admin JRun サーバーを起動します。

 [スタート]→[プログラム]→[JRun 3.1]→[JRun 管理コンソール]を実行するか、ブラウザで http://localhost:8000/ にアクセスして、管理コンソールにログインします。

 [JRun Default Server]→[JDBC データソース]で「追加」をクリックし、「JDBC ウィザード」を起動します。タイプ1のJDBCドライバを使用するので、「RDBMS サーバ名」に「JDBC to ODBC Bridge」を選択します。「データソース名」には「jtd_ds」を指定します。

 「データベース名」には、さきほど設定したODBCデータソース名「jruntagdemo」を指定します。

 「手順 3/4」と「手順 4/4」はデフォルトのまま進みます。これで、次のようなJDBCデータソース「jtd_ds」が追加されるはずです。ここで、データソースの設定のテストも行っておきましょう。

 JDBCデータソースの変更を有効にするため、[JRun Default Server]でサーバの再起動 (あるいは開始) しておきましょう。

カスタムタグを使用しないJSPページ

 ここからは、サンプルコードを見ていきましょう。紹介するJSPページは、データベース問合せを実行し、HTMLテーブルで表示するだけの単純なものです。

 まずは、カスタムタグを使用しないで作成したJSPページ「sql_without_taglib.jsp」 を紹介しましょう。

<!-- JRunタグライブラリを使用しないJSP -->

<%@ page contentType = "text/html;charset=Shift_JIS" %>
<%@ page session = "false" %>
<%@ page import = "java.sql.*" %>
<%@ page import = "javax.sql.*" %>
<%@ page import = "javax.naming.*" %>

<html>
<head><title>商品一覧画面</title></head>
<body>

<!-- SQL文を実行し、取得したデータを表示 -->

<%
 String dsName = "jtd_ds";
 String sqlStmt = "SELECT title, price FROM item ORDER BY id";

 Connection dbConn = null;
 Statement dbStmt = null;
 ResultSet dbRSet = null;

 try {

  // データソースのルックアップ
  InitialContext ctx = new InitialContext();
  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/" + dsName);

  // データベースに接続し、問合せを実行
  dbConn = ds.getConnection();
  dbStmt = dbConn.createStatement();
  dbRSet = dbStmt.executeQuery(sqlStmt);

  // 問合せ結果を表示
  out.println("<table align=\"center\">");
  out.println("<tr><td>タイトル</td><td>金額</td></tr>");

  while( dbRSet.next() ) {
    out.println("<tr><td>" + dbRSet.getString("title") + "</td>");
    out.println("<td>" + dbRSet.getString("price") + "円</td></tr>");
  }

  out.println("</table>");

 } catch( Exception e ) {
  e.printStackTrace();
 } finally {
  try {
   if (dbRSet != null) { dbRSet.close();}
   if (dbStmt != null) { dbStmt.close();}
   if (dbConn != null) { dbConn.close();}
  } catch( SQLException se ) {
   se.printStackTrace();
  }
 }
%>

</body>
</html>

 JDBCデータソースのJNDIルックアップ、JDBC接続の取得、結果セットの操作、例外処理などの処理と、HTMLを生成する処理が混在していることは、このコードを一目見れば分かるでしょう。

 このJSPページを、JRunにデプロイしてみましょう。ここでは、「JRun Default Server」のWebアプリケーション「Default User Application」にデプロイすることにします。

 「Default User Application」のルートディレクトリは、{jrun.rootdir}\servers\default\default-app\ですので、このフォルダにsql_without_taglib.jsp をダウンロードしましょう({jrun.rootdir}は、JRunをインストールしたフォルダです)。

 アプリケーションパスのマッピング (Webアプリケーションのコンテキストルート)は「/」なので、このJSPページのURLは「http://localhost:8100/sql_without_taglib.jsp」となります。その実行結果は、次のようになります。

カスタムタグを使用したJSPページ

 続いて、カスタムタグを使用して作成したJSPページ「sql_with_taglib.jsp」を紹介しましょう。今回は、JRunが提供している「JRunタグライブラリ」を利用しています。これは、前回紹介した「カスタムタグの種類」で言えば、「(1)JSPコンテナベンダ(アプリケーションサーバベンダ)が提供するタグライブラリ」に分類されます。

<!-- JRunタグライブラリを使用するJSP -->

<%@ page contentType = "text/html;charset=Shift_JIS" %>
<%@ page session = "false" %>
<%@ page import = "allaire.taglib.*" %>
<%@ taglib uri="jruntags" prefix="jrun" %>

<html>
<head><title>商品一覧画面</title></head>
<body>

<jrun:sql datasrc="jtd_ds" id="itemsql">
SELECT title, price FROM item ORDER BY id
</jrun:sql>

<jrun:param id="itemsql" type="QueryTable" />

<table align="center">
 <tr><td>タイトル</td><td>金額</td></tr>

<jrun:foreach group="itemsql">
 <tr><td><%= itemsql.get("title") %></td>
 <td><%= itemsql.get("price") %>円</td></tr>
</jrun:foreach>

</table>

</body>
</html>

 さきほどと同様に、sql_with_taglib.jspを {jrun.rootdir}\servers\default\default-app\にダウンロードし、http://localhost:8100/sql_with_taglib.jspにアクセスしてみましょう。その実行結果は、次のようになります。

  実行結果はsql_without_taglib.jspの場合と同じですが、JSPコードが大幅に簡略化されていることが分かると思います。実際、sql_without_taglib.jspは59行、sql_with_taglib.jspは29行と、およそ半分になっています。行数が半減した理由は、スクリプトレットの代わりにカスタムタグを活用しているからです。

 では、JSPの内容を見ていきましょう。

<%@ taglib uri="jruntags" prefix="jrun" %>

 taglibディレクティブ で、URI“jruntags”を接頭辞“jrun” にバインドしています。

 なお、「JRunタグライブラリ」は、JRunでは事前構成済みなので、前回紹介したようなTLDの作成 web.xmlの修正は、特に必要ありません。

<jrun:sql datasrc="jtd_ds" id="itemsql">
SELECT title, price FROM item ORDER BY id
</jrun:sql>

 データベース問合せを実行するために、sqlタグを利用しています。datasrc属性にはJDBCデータソース名を指定します。タグのボディには、実行するSQL文を指定します。

 id を指定した場合、問合せ結果は、(javax.sql.RowSet インターフェイスを実装した) allaire.taglib.QueryTableクラスのインスタンスとして、pageContextに格納されます。

<jrun:param id="itemsql" type="QueryTable" />

 paramタグは、(スクリプトレットやほかのカスタムタグ内からアクセスできる) スクリプト変数を宣言します。id属性にはスクリプト変数名を、type属性には、オブジェクトのクラス名を指定します。

 ここでは、次のforeachタグ内で、問合せ結果にアクセスするために、スクリプト変数 itemsql を宣言しています。

<jrun:foreach group="itemsql">
<tr><td><%= itemsql.get("title") %></td>
<td><%= itemsql.get("price") %>円</td></tr>
</jrun:foreach>

 foreachタグは、ループ処理を実行します。foreachタグのボディは、ループの間に繰り返し実行されます。group属性には、java.sql.ResultSetjavax.sql.RowSetのオブジェクトを指定します。または、これらのオブジェクトが格納されたスクリプト変数名でもかまいません。

 ここでは、paramタグで宣言したスクリプト変数 itemsql を指定して、ループ処理を実行しています。itemsqlには、javax.sql.RowSet インターフェイスを実装した allaire.taglib.QueryTable クラスが格納されているので、group属性に指定できます。

 「JRunタグライブラリ」の仕様の詳細は、マニュアル「JRunタグライブラリ リファレンス 」を参照してください。http://localhost:8100/demo/taglib/にも、「JRunタグライブラリ」多数のサンプルが掲載されています。

おわりに

 JSPカスタムタグを利用することによって、いかにJSP開発が簡素化され、より効率的にWebアプリケーションを構築できるか、お分かりいただけたでしょうか?

 前回の「カスタムタグの種類」でも紹介したように、すでに多数のカスタムタグが (多くの場合、無償で) 提供されています。データベース処理、EJBアクセス、XML/XSLT処理、フロー/ループ制御など、汎用的な機能に関しては、既存のカスタムタグがほぼ間違いなく見つかるはずです(カスタムタグを新規作成するのは、おそらく、ドメインに特化された機能が求められる場合だけでしょう)。

 読者のみなさんが、JSPカスタムタグを大いに活用されることを期待しています。

 

記事INDEX
 

対談 JSPの活用がこれからのWeb開発の鍵

  「JSPカスタムタグ徹底入門」
第1回 JSPカスタムタグの仕組みを知ろう
「JSPカスタムタグ徹底入門」
第2回  実践!JSPカスタムタグ活用術
  JSPカスタムタグ・ライブラリ
 


</comment> <tr> <td bgcolor="#EEEEEE"><font size="2"><a href="javascript:KeepIt();"> <img src="/club/keepoint/images/ico_kpt.gif" alt="kee&lt;p&gt;oint保存" border="0" align="absmiddle" width="24" height="18">kee&lt;p&gt;ointで保存</a></font></td> </tr> <comment>

 
@ITトップ@IT Special インデックス会議室利用規約プライバシーポリシーサイトマップ