JSPのカスタムタグ・ライブラリを作ろう

 JSP 1.1からは、JSPの文書の中に、HTMLやCSSで定義されたタグ以外に、 自分で自由な名前と機能を持ったタグを自作(カスタムタグ)できるようになりました。 たくさんのJSP文書に埋め込む必要がある情報出力をカスタムタグにまとめておけば、 各JSP文書の中身をとてもスッキリさせることができます。

 カスタムタグを使うには、次のものを作成する必要があります。

  • カスタムタグの機能を定義したJavaクラス(タグハンドラクラス)。 タグが挿入されたコンテキスト(pageContext)の中で、どのような処理をして、 どのような出力をページに行うかを定義するクラスです。
  • タグライブラリデスクリプタ。 .tldという拡張子を持ち、タグの名前をタグハンドラクラスを関連付けるXML文書です。
  • web.xml。 アプリケーションのweb.xmlです。この中に、servletタグやservlet-mapping タグに混じって、taglibタグで使用するタグを定義します。
  • カスタムタグを使用するJSP文書。 タグを使用するJSP文書です。冒頭部で@jsp taglib命令を使ってカスタムタグを使用することを宣言します。


サンプルのタグ

 サンプルといっても、何か役に立つものを作りたい、 というわけで、ここで定義するのは、「自分自身へのリンクURLを出力するタグ」です。 それのどこが便利なんじゃ?例えば、入力フォームを表示し、 その入力内容に対する応答も同じページでやるスタイルのJSP文書で、

<form action="<ushi:selfurl />">

のように自分自身のURLを指定しなくてもよいようにするためのタグです。 これを、

タグの名前ushitag:selfurl
タグハンドラクラスushitag.SelfURLTag
タグライブラリデスクリプタushitag.tld

という名前で作ることにします。

リソースの配置
ここで、$APPはアプリケーションのホームディレクトリを表します。 例えば、アプリケーションの名前がapp1なら、 $TOMCAT_HOME/webapps/app1 のような名前のディレクトリになるはずです。
タグハンドラクラス$APP/WEB-INF/classes/ushitag/SelfURLTag.class
タグライブラリデスクリプタ$APP/WEB-INF/ushitag.tld
web.xml$APP/WEB-INF/web.xml
タグを使用するJSP文書$APP/test.jsp
但し、タグハンドラクラスはそのクラスのパッケージ階層に合わせたディレクトリ階層に配置する必要があります (上の例はSelfURLTagがパッケージushitagの中にあるのでこのようになっています)。 また、タグを使用するJSP文書は、$APPの直下でなくても、 サブディレクトリを作って配置してもOKです。

タグハンドラクラス

package ushitag;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;

import javax.servlet.http.*;

/**
 * 現在表示しているJSPページのURLを出力するタグです。
 * 属性、本体はありません。
 * @version 20021117-20030115
 */
public class SelfURLTag extends TagSupport {
  public int doStartTag(){
    try {
      JspWriter out = pageContext.getOut();
      HttpServletRequest request =
        (HttpServletRequest) pageContext.getRequest();
      HttpServletResponse response =
        (HttpServletResponse) pageContext.getResponse();
      out.print(response.encodeURL(request.getRequestURI()));
    } catch(IOException ex){
      System.out.println("Error in SelfURLTag: " + ex);
    }
    return SKIP_BODY;
  }
}
/* end. */

 まずは本体も属性もないタグのタグハンドラの典型例です。 TagSupportクラスを継承し、 doStartTagメソッドをオーバーライドします。 その中では、pageContext.getOutメソッドで出力ストリームを取得して、 何か書き出す処理をするのが普通です。 その後、タグ本体の処理をしないことを示す記号定数 SKIP_BODYを返します。

タグライブラリデスクリプタ

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>ushitag</short-name>
  <uri></uri>
  <description>
  A simple tab library
  </description>

  <tag>
    <name>selfurl</name>
    <tag-class>ushitag.SelfURLTag</tag-class>
    <body-content>EMPTY</body-content>
    <description>
    Insert the URL of the page in which this tag is inserted
    </description>
  </tag>
</taglib>

 このタグライブラリデスクリプタはJakarta Tomcat 4.1.12のサンプルについていたものを改造したものです。 JSP 1.2準拠の書き方です。 書籍によってタグtag-classやbody-contentは tagclass、bodycontentとそれぞれなっていることが多いようですが、 これはJSP 1.1でのタグ名のようです。 ここでは、タグハンドラ ushitag.SelfURLTag がselfurlというタグ名に使われることを定義しています。

web.xml

    <taglib>
      <taglib-uri>ushitag</taglib-uri>
      <taglib-location>/WEB-INF/ushitag.tld</taglib-location>
    </taglib>

 このweb.xmlは、普通のservletタグやservlet-mappingタグを書くweb.xmlに追加して書くもので、 Tomcatのサンプルアプリケーションのweb.xmlには最初からコメント化されて書かれています。 そこでそのコメントを外し、上のように書き換えればよいでしょう。 ここでは、ushitagというURI(タグのグループを表すようなもの。デスクリプタを一意識別する名前) のタグが現れると、デスクリプタ /WEB-INF/ushitag.tld の記述を見に行くように、ということを指示しています。

JSP文書

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<%@ taglib prefix="ushi" uri="ushitag" %>
<html><body>
<font color="#700040">●タグライブラリのテスト</font><br>
<a href="<ushi:selfurl />">このページを再描画</a>
</body></html>

 そしてこのタグを使うJSP文書です。 冒頭部で%@ taglib命令を使い、 ushiという接頭辞のつくタグに出会うとURI=ushitagで定義されたデスクリプタを見に行くことを指示しています。 実際のタグは「接頭辞:タグ名」という書き方をするので、 ここでは <ushi:selfurl /> です。

Server Side Java Index Top

(first uploaded 2002/11/17 last updated 2003/01/16, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル