12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JSP カスタムタグの作成

Posted at

はじめに

JSPでは、自分でタグを作成できる。これにより、JSP中に極力Javaコードを書かずに済む。

作成して利用するまでに必要なこと

カスタムタグを利用するまでには、以下のことを行う必要がある。

  • タグハンドラクラスを作成する
  • タグ設定を記述する
  • 利用側で利用宣言する

上記の他に、タグファイルを作成し、利用宣言をすることでそのタグも利用できる。

カスタムタグを作成する手順

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

タグハンドラクラスは、(Tag|IterationTag|BodyTag)インターフェースの実装が必要だが、各タグには共通して記述する部分が多いため、それらを実装した以下のいずれかのクラスを継承すると楽に作成できる。

  • javax.servlet.jsp.tagext.TagSupportクラス: bodyなしのタグ、bodyに作用しないタグ、bodyを繰り返すタグ
  • javax.servlet.jsp.tagext.TagSupport: bodyの内容を変更するタグ
  • javax.servlet.jsp.texext.SimpleTagSupport: Servlet2.4以上でbodyなしのタグ

以下に、TagSupportクラスを継承し、bodyなしのタグを作成する場合を掲載する。

bodyなしハンドラ(SampleTagHandler.java)
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class SampleTagHandler extends TagSupport {

    private String name;

    @Override
    public int doEndTag() throws JspException {
        try {
            // 出力
            pageContext.getOut().print("あなたが入力した名前は「" + name + "」です。");
        } catch (IOException ex) {
            Logger.getLogger(SampleTagHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
        // 残りのページを評価する値を返して終了
        return EVAL_PAGE;
    }

    // name属性をセットするためのセッタ
    public void setName(String name) {
        this.name = name;
    }
    
}

タグ記述毎に最低限変更が必要になるであろう関数は以下。

作成するタグの種類 継承するクラス doStartTag() doAfterBody() doEndTag()
bodyなし TagSupport 変更する
bodyあり TagSupport 変更する 変更する
bodyを繰り返す TagSupport 変更する 変更する 変更する

また、属性を持たせる場合、単純セッタ(name属性 -> setName())が必要。

タグ設定を記述する

タグ設定を記述するフォーマットは、XMLもしくはTLDである。
以下では、TLDによる記述を紹介する。
以下に掲載するのは、NetBeansIDE8.1で生成したものである。

/WEB-INF/tlds/mytaglib.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>mytaglib</short-name>
  <uri>/WEB-INF/tlds/mytaglib</uri>

  <!-- タグの定義 -->
  <tag>
    <!-- タグの名前 -->
    <name>SampleTag</name>
    <!-- タグハンドラクラス -->
    <tag-class>SampleTagHandler</tag-class>
    <!-- bodyを持つかどうか -->
    <body-content>empty</body-content>
    <!-- 属性の定義。attributeを複数並べられる。 -->
    <attribute>
      <!-- 属性名 -->
      <name>name</name>
      <!-- 必須属性かどうか -->
      <required>true</required>
      <!-- 実行時評価属性かどうか -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 属性の型 -->
      <type>java.lang.String</type>
    </attribute>
  </tag>
</taglib>

<tag>タグの中に1つのタグを記述する。
タグに付与したい属性は、<attribute>タグで指定する。

利用宣言する

作成したタグを利用したいJSPで、以下の記述をする。

<!%-- TLDファイルの取り込み -->
<%@taglib prefix="my" uri="/WEB-INF/tlds/mytaglib" %>

<!%-- カスタムタグの利用 -->
<my:SampleTag name="Foo" /><!%-- あなたが入力した名前はFooです -->
12
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?