Jspにおけるカスタムタグの作成方法(備忘録)


※実際に使ったわけではなく、振返りやすいようにQiitaに投稿したため、
動作確認はできていません。

## 概要

tldファイルを用いる
tldファイルはカスタムタグの動作を定義するXML形式のファイルのこと。

- xmlで定義する場合

```xml
<?xml version="1.0" ?>

<!-- XMLスキーマの定義を記載 -->
<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">

-------カスタムタグの定義-------
-------カスタムタグの定義-------

</taglib>
```
- DTD形式で定義する場合

```xml
<?xml version="1.0" ?>

<!-- DTDの定義を記載 -->
<!DOCTYPE taglib PUBLIC
          "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
          "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

-------カスタムタグの定義-------
-------カスタムタグの定義-------

</taglib>
```

## 使用例
### 属性なし、タグの本体を許容しないカスタムタグの定義
- xmlファイル

```xml
<?xml version="1.0" ?>

<!-- (1)XMLスキーマの定義を記載 -->
<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>hello</short-name>

  <tag>
    <!-- (3)JSPプログラムで使用するタグ名を指定 -->
    <name>sayHello</name>
    <!-- (4)タグの動作を定義したタグハンドラクラスを指定 -->
    tag-class>tags.helloTag</tag-class>
    <!-- (5)タグの本体は空を指定 -->
    <body-content>empty</body-content>
  </tag>
</taglib>
```
- JSPプログラム例

```jsp
<%@ page contentType="text/html; charset=windows-31j" 
         import="tags.*" %>
<%@ taglib uri="http://www.javaroad.jp/tags/hello" 
           prefix="hello" %>

  ---------------------
  ---------------------

<%-- (1)カスタムタグを使用します。タグのプレフィックスに
        taglibディレクティブで指定した値を使用します。タ
        グ名にはtldファイルの<name>タグで指定した値を使
        用します。<body-content>タグでemptyを指定してい
        るため、タグの本体は記載しません。 --%>
<hello:sayHello />

  ---------------------
  ---------------------
```
### 属性あり、タグの本体にコードの記載を許容するカスタムタグ

- tldファイル例

```xml
<?xml version="1.0" ?>

<!-- (1)XMLスキーマの定義を記載 -->
<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>helloFirst</short-name>
  <tag>
    <!-- (3)JSPプログラムで使用するタグ名を指定 -->
    <name>sayHelloFirst</name>
    <!-- (4)タグの動作を定義したタグハンドラクラスを指定 -->
    <tag-class>tags.helloFirstTag</tag-class>
    <!-- (5)タグの本体にJSPが理解できるコードの記載を許容 -->
    <body-content>JSP</body-content>
    <!-- (6)属性の名前がcount、必須の属性で、
            属性値に式が許容できる属性を宣言 -->
    <attribute>
      <name>count</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>
```
- JSPプログラム例

```jsp
<%@ page contentType="text/html; charset=windows-31j"
         import="tags.*" %>
<%@ taglib uri="http://www.javaroad.jp/tags/helloFirst" 
           prefix="hello2" %>

  ---------------------
  ---------------------

<%-- (1)カスタムタグの属性としてtldファイルの<attribute>タグ
        で指定したcount属性を使用しています。<body-content>
        タグでJSPを指定し、本体にコードの記載を許容している
        ため、本体にprintlnメソッドを記載しています。 --%>
<hello2:sayHelloFirst count="<%= check %>">
  out.println("Hello World!");
</hello2:sayHelloFirst>

  ---------------------
  ---------------------
```