Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Servlet・JSP > JSP −13.カスタムタグ(概要)
更新日:2006/10/8
JSP−13.カスタムタグ(概要)
JSPでは、<jsp:forward>、<jsp:useBean>などあらかじめ用意されているアクションタグがあります。これらのタグを使用することにより、JSPのコードを簡潔に記述することができます。アクションタグをプログラマが独自に定義することもできます。これらのタグをカスタムタグといいます。ここでは、タグを指定すると、「Hello World!」と表示するカスタムタグを例にとり、カスタムタグの作成方法について解説します。
なお、Jakarta Projectでは、頻繁に使用する動作をあらかじめカスタムタグとして定義し、Taglibsとして公開しています。Taglibsについては、Javaの道:Taglibs(インストール)を参照してください。
カスタムタグの作成
カスタムタグは以下の手順により作成されます。

1.タグハンドラクラスの作成

カスタムタグの動作を定義するクラスファイルを作成します。

2.tldファイルの作成
カスタムタグの使用方法をJSPコンテナに知らせるため、カスタムタグの動作を定義したXML形式の定義ファイルを作成します。

3.web.xmlファイルの設定
web.xmlファイルにJSPプログラムがtldファイルの配置場所を認識するための配置情報を指定します。

4.JSPプログラムの作成
JSPプログラムのtaglibディレクティブでカスタムタグを指定します。指定したカスタムタグを使用して、JSPプログラムを作成します。
タグハンドラクラスの作成
タグを指定すると「Hello World!」と表示するカスタムタグのタグハンドラクラスは以下のようになります。詳細な説明は別のページで行いますため、ここでは概要のみ説明します。タグハンドラクラスをコンパイルする際はCLASSPATHにjsp-api.jarを指定します。
【helloTagServlet.java】
//(1)J2SDK1.4からデフォルトパッケージをインポートすることは
//   できなくなったため、JSPプログラムからインポートできる
//   ようにパッケージを宣言します。

package tags;

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

//(2)タグハンドラクラスを作成するために、
//   Tagインタフェースを実装します。
public class helloTagServlet implements Tag {
  private PageContext pageContext;
  private Tag parentTag;

  public void setPageContext(PageContext pageContext) {
    this.pageContext = pageContext;
  }

  public void setParent(Tag parentTag) {
    this.parentTag = parentTag;
  }

  public Tag getParent() {
    return this.parentTag;
  }

  //(3)開始タグが呼び出されたときにを実行される
  //   doStartTagメソッドです。このメソッドに
  //   実行させたい処理を記述します。
  public int doStartTag() throws JspException {
    try {
      JspWriter out = pageContext.getOut();
      //(4)タグが実行されたときに画面に
      //   "Hello World!"と表示します。
      out.print("Hello World!");
    } catch(Exception e) {
      throw new JspException(e.getMessage());
    }
      return SKIP_BODY;
    }

    //(5)終了タグが呼び出されたときに実行される
    //   doEndTagメソッドです。このメソッドに
    //   実行させたい後処理を記述します。
    public int doEndTag() throws JspException {
      return EVAL_PAGE;
    }

  public void release() {}
}
tldファイルの作成
カスタムタグの動作を定義するtldファイルを作成します。詳細な説明は別のページで行いますため、ここでは概要のみ説明します。
【hello.tld】
<?xml version="1.0" ?>
<!-- (1)JSP2.0よりXMLの定義方法がDTDからXMLスキーマに変わりました。
        DTDも使用できるようですが、XMLスキーマを使用する場合は
        以下のような宣言を行います。DTDを使用する場合は<!DOCTYPE 
        ---- >といった宣言を行います。 -->

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
            web-jsptaglibrary_2_0.xsd"
        version="2.0">

  <tlib-version>1.0</tlib-version>
  <!-- (2)使用するJSPのバージョンを指定します。 -->
  <jsp-version>2.0</jsp-version>
  <short-name>helloTag</short-name>
  <tag>
    <!-- (3)JSPで使用するタグ名を指定します。 -->
    <name>helloTag</name>
    <!-- (4)タグの動作を定義したタグハンドラクラスを
            パッケージ名から記述します。 -->
    <tag-class>tags.helloTagServlet</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>
web.xmlの設定
web.xmlにはJSPプログラムがtldファイルを参照するための設定を行います。tldファイルの参照は<taglib>タグで行います。Servlet2.4から<taglib>タグは<jsp-config>タグのサブ要素として設定するようになりました。

<taglib>タグ内に<taglib-uri>タグ、<taglib-location>タグを設定します。<taglib-uri>タグにはJSPファイルのtaglibディレクティブのuri属性で指定した値を設定します。<taglib-location>タグにはtldファイルが配置されている場所をコンテキストルートからの相対パスで指定します。
【<jsp-config>タグのサブ要素】
要素
内容
要素数
taglib
JSPプログラムからtldファイルを参照する設定を記載します。
0以上
taglib-uri
<taglib>タグのサブ要素です。JSPプログラムのtaglibディレクティブのuri属性に指定される値を設定します。
1
taglib-location
<taglib>タグのサブ要素です。tldファイルの配置場所をコンテキストルートからの相対パスで指定します。
1
jsp-property-group
指定したURLパターンに合致するJSPプログラムの個別の設定(エンコード方式、式言語(EL)の使用可否など)を指定できます。
0以上
【web.xml】
<?xml version="1.0" encoding="UTF-8"?>
<!-- (1)Servlet2.4よりXMLの定義方法がDTDからXMLスキーマに変わり
        ました。DTDも使用できるようですが、XMLスキーマを使用す
        る場合は以下のような宣言を行います。DTDを使用する場合は
        <!DOCTYPE ---- >といった宣言を行います。 -->

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
             web-app_2_4.xsd"
         version="2.4">
  <jsp-config>
    <taglib>
      <!-- (2)JSPプログラムのtaglibディレクティブのuri属性で指
              定した値を設定します。設定したURLに実際のファイル
              が配置されているわけではありません。このタグで設
              定した値は単にtaglibディレクティブのuri属性で指定
              された値と紐付けする値として使用されます。 -->
      <taglib-uri>http://www.javaroad.jp/tags/hello</taglib-uri>
      <!-- (3)tldファイルの配置場所をコンテキストルートからの相
              対パスで指定します。 -->
      <taglib-location>/WEB-INF/lib/hello.tld</taglib-location>
    </taglib>
  </jsp-config>
</web-app>
JSPプログラムの作成
カスタムタグを使用するJSPプログラムを作成します。JSPプログラムにどのカスタムタグを使用するかの設定を行う必要があります。l設定はtaglibディレクティブで行います。
<%@ taglib uri="属性値" prefix="属性値" %>
【taglibディレクティブの属性】
属性名
説明
デフォルト
uri 該当するweb.xmlの<taglib-uri>タグに設定された値を指定します。
prefix JSPプログラムでカスタムタグを使用する際のタグのプレフィックスを指定します。
今回作成するJSPファイルは以下のようになります。
【exHelloTag.jsp】
<%-- (1)pageディレクティブでタグハンドラクラスが
        属するパッケージをインポートします。 --%>
<%@ page contentType="text/html; charset=windows-31j"
         import="tags.*" %>

<%-- (2)taglibディレクティブでJSPプログラムでカスタムタグ
        を使用するための設定を行います。 --%>
<%@ taglib uri="http://www.javaroad.jp/tags/hello"
    prefix="hello" %>

<HTML>
<BODY>
<%-- (3)カスタムタグを使用します。タグのプレフィックスに
        taglibディレクティブで指定した値を使用します。
        タグ名にはtldファイルで指定した値を使用します。 --%>
<hello:helloTag />

</BODY>
</HTML>
使用例
カスタムタグの使用例を例示します。各ファイルは以下のように配置します。コンテキストルートとは、各アプリケーションごとに作成された領域のルートディレクトリです。ここでは、コンテキストルートとして$CATALINA_HOME\webappsディレクトリの配下にserTestディレクトリを作成し、コンテキストルートとします。
Javaの道_カスタムタグ_配置例
【実行結果】JSPプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。
Javaの道_カスタムタグ_実行結果



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道