5.JSP のカスタムタグ

カスタムタグとは、自分で作ったタグの動作をJSPで定義できる機能です。これによりデザインとロジックを分離する考えがあるようです。

(1) カスタムタグの利用

 簡単なのは、<ta:hello /> の記述で、あらかじめ定義しておいたタグ名(hello)の内容(例: hello を表示)を実行できるものです。

 カスタムタグの作成例です。この他にも様々な機能があります。

No種類JSP 記述例 / 結果
 1ボディ(本体)のないカスタムタグ<ta:hello />
例えば Hello を表示
 2属性のあるカスタムタグ<ta:echo msg1="ohayo!"
      msg2="おはよう!" />
属性に指定された値を表示
 3ボディ操作なしカスタムタグ
(タグボディの値を、属性tagに指定された
HTMLタグで囲って出力)
<ta:tags tag="i">
It is Italic     ( ここがボディ )
</ta:tags>
<i>It is Italic</i> を実行した結果
 4ボディ操作ありカスタムタグ
(タグボディの値を、属性countに指定された
回数だけボディを繰り返し表示)
<ta:loop count="3">
test     ( ここがボディ )
</ta:loop>
test test test を表示
 5ネストされたカスタムタグ
(親タグインスタンスの属性を取得&出力)
<ta:child name="東京"><br>
  <ta:child name="港区"><br>
    <ta:child name="赤坂"><br>
    </ta:child>
  </ta:child>
</ta:child>
私は東京に住んでいます。
私は東京の港区に住んでいます。
私は港区の赤坂に住んでいます。


※1,2 は 開始タグと終了タグとの間にボディがないタグです。ボディがある場合の処理は、様々な利用方法があります。


(2) カスタムタグの作成-1 (ボディなし)

 ボディのないカスタムタグを実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。

1JSP ファイルhellotag.jsp/examples/jsp/
2TLD ファイル hellotag.tld/examples/jsp/
3タグハンドラhellotag.class/examples/WEB-INF/classes/
  タグ 名  hello
  属性名  なし

 ※TLD(Tag Library Description) は、タグライブラリ記述ファイルのことであり、JSP ファイルで参照するタグや属性などを、また、該当タグと属性を処理タグハンドラクラスを定義するものです。

 ※タグハンドラーは、該当タグの機能を処理化するクラスであり、ブラウザに表示するコンテンツを作成します。

 ※アプリケーションルートは、C:\Program Files\Apache Group\Tomcat 4.1\webapps です。



 (2)-1. JSP ファイル ( hellotag.jsp )


<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="hellotag" %>
<%@ taglib uri="/jsp/hellotag.tld" prefix="ta" %>

<html>
<body>
<h4> タグテスト-1 (ボディなし) </h4>

  <ta:hello />

</body>
</html>



 (2)-2. JSP 実行

  ブラウザーで http://127.0.0.1:8080/examples/jsp/hellotag.jsp

  

タグテスト-1 (ボディなし)

Hello!


 webapps (ルート)  ・・・  "C:\Program Files\Apache Group\Tomcat 4.1\webapps\"
   │
   ├─ examples ─┬─ jsp   ─┬─ hellotag.jsp
   │              │           ├─ hellotag.tld
   │              │           └─ hellotag.java
   │              │      
   │              └─ WEB-INF ── classes ── hellotag.class


 (ファイル名をクリックするとそのソースを表示)

 タグハンドラとはタグを処理するクラス(hellotag.class)です。ボディを処理しない場合またはボディがない場合はTagインターフェース、ボディを処理する場合はBodyTagインターフェースを実装(implements)します。

 実際にはタグハンドラはTagインターフェースを実装(implements)したTagSupportクラスまたはBodyTagインターフェースを実装(implements)したBodyTagSupportクラスを継承(extends)します。



(3) カスタムタグの作成-2 (属性あり)

 属性のあるカスタムタグで実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。

1JSP ファイルechotag.jsp/examples/jsp/
2TLD ファイル echotag.tld/examples/jsp/
3タグハンドラechotag.class/examples/WEB-INF/classes/
  タグ 名  echo
  属性名  msg1
         msg2

 ※アプリケーションルートは、C:\Program Files\Apache Group\Tomcat 4.1\webapps です。



 (3)-1. JSP ファイル ( echotag.jsp )

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="echotag" %>
<%@ taglib uri="/jsp/echotag.tld" prefix="ta" %>

<html>
<body>
<h4> タグテスト-2 (属性あり) </h4>

  <ta:echo msg1="ohayo!" msg2="おはよう!" />

</body>
</html>



 (3)-2. JSP 実行

  ブラウザーで http://127.0.0.1:8080/examples/jsp/echotag.jsp

  

タグテスト-2 (属性あり)

ohayo! おはよう!


 webapps (ルート)  ・・・  "C:\Program Files\Apache Group\Tomcat 4.1\webapps\"
   │
   ├─ examples ─┬─ jsp   ─┬─ echotag.jsp
   │              │           ├─ echotag.tld
   │              │           └─ echotag.java
   │              │      
   │              └─ WEB-INF ── classes ── echotag.class


 (ファイル名をクリックするとそのソースを表示)



(4) カスタムタグの作成-3 (ボディ操作なし)

 ボディのあるカスタムタグですが、ボディは操作しません。Htmlタグを属性 tag に指定された値で変更する例です。実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。

1JSP ファイルtagstag.jsp/examples/jsp/
2TLD ファイルtagstag.tld/examples/jsp/
3タグハンドラtagstag.class/examples/WEB-INF/classes/
  タグ 名  tags
  属性名  tag


 ※アプリケーションルートは、C:\Program Files\Apache Group\Tomcat 4.1\webapps です。



 (4)-1. JSP ファイル ( tagstag.jsp )

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="tagstag" %>
<%@ taglib uri="/jsp/tagstag.tld" prefix="ta" %>

<html><body>
<h4> タグテスト-3 (ボディ操作なし) </h4>

  <ta:tags tag="i">
  It is Italic
  </ta:tags>
  <br><br>
  <ta:tags tag="u">
  It is underline
  </ta:tags>

</body></html>


 (4)-2. JSP 実行

  ブラウザーで http://127.0.0.1:8080/examples/jsp/tagstag.jsp

ブラウザーJSP 出力 ( html , body タグ省略 )
  

タグテスト-3 (ボディ操作なし)

It is Italic It is underline
<h4> タグテスト-3 (ボディ操作なし) </h4>

  <i>It is Italic</i>
  <br><br>
  <u>It is underline</u>


 webapps (ルート)  ・・・  "C:\Program Files\Apache Group\Tomcat 4.1\webapps\"
   │
   ├─ examples ─┬─ jsp   ─┬─ tagstag.jsp
   │              │           ├─ tagstag.tld
   │              │           └─ tagstag.java
   │              │      
   │              └─ WEB-INF ── classes ── tagstag.class


 (ファイル名をクリックするとそのソースを表示)

空タグの場合、doStartTag(), doEndTag() どちらのメソッドを実装しても得られる効果に違いはありませんでしたが、ここでは両方必要です。doEndTag は doStartTag から実行された後に呼ばれます。



(5) カスタムタグの作成-4 (ボディ操作あり)

 ボディを操作するカスタムタグです。ボディの内容を属性 count に指定された値で繰り返し表示する例です。実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。

1JSP ファイルLoopTag.jsp/examples/jsp/
2TLD ファイルLoopTag.tld/examples/jsp/
3タグハンドラLoopTag.class/examples/WEB-INF/classes/
  タグ 名  loop
  属性名  count


 ※アプリケーションルートは、C:\Program Files\Apache Group\Tomcat 4.1\webapps です。



 (5)-1. JSP ファイル ( LoopTag.jsp )

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="LoopTag" %>
<%@ taglib uri="/jsp/LoopTag.tld" prefix="ta" %>

<html><body>
<h4> タグテスト-4 (ボディ操作あり) </h4>

  <ta:loop count="3">
  test
  </ta:loop>

</body></html>


 (5)-2. JSP 実行

  ブラウザーで http://127.0.0.1:8080/examples/jsp/LoopTag.jsp

ブラウザーJSP 出力 ( html , body タグ省略 )
  

タグテスト-4 (ボディ操作あり)

test test test
<h4> タグテスト-4 (ボディ操作あり) </h4>

test test test


 webapps (ルート)  ・・・  "C:\Program Files\Apache Group\Tomcat 4.1\webapps\"
   │
   ├─ examples ─┬─ jsp   ─┬─ LoopTag.jsp
   │              │           ├─ LoopTag.tld
   │              │           └─ LoopTag.java
   │              │      
   │              └─ WEB-INF ── classes ── LoopTag.class


 (ファイル名をクリックするとそのソースを表示)


 ※カスタムタグを使用しなければ、次この方法でも可能です。

タグテスト-4 (埋め込み Java )



test 1 test 2 test 3
<html><body>
<h4> タグテスト-4 (埋め込み Java ) </h4>
<br><br>
<%     for (int i = 1; i<=3; i++) {%>
test <%= i %>
<% } %>

</body></html>






(6) カスタムタグの作成-5 (ネスト)

 ネストされたカスタムタグです。親タグインスタンスの属性を取得し表示する例です。実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。

1JSP ファイルLoopTag.jsp/examples/jsp/
2TLD ファイルLoopTag.tld/examples/jsp/
3タグハンドラLoopTag.class/examples/WEB-INF/classes/
  タグ 名  child
  属性名  name


 ※アプリケーションルートは、C:\Program Files\Apache Group\Tomcat 4.1\webapps です。



 (6)-1. JSP ファイル ( ChildTag.jsp )

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="ChildTag" %>
<%@ taglib uri="/jsp/ChildTag.tld" prefix="ta" %>

<html><body>
<h4> タグテスト-5 (ネスト) </h4>

<ta:child name="東京"><br>
  <ta:child name="港区"><br>
    <ta:child name="赤坂"><br>
    </ta:child>
  </ta:child>
</ta:child>

</body></html>


 (5)-2. JSP 実行

  ブラウザーで http://127.0.0.1:8080/examples/jsp/ChildTag.jsp

  

タグテスト-5 (ネスト)

私は東京にいます。 私は東京の港区に住んでいます。 私は港区の赤坂に住んでいます。


 webapps (ルート)  ・・・  "C:\Program Files\Apache Group\Tomcat 4.1\webapps\"
   │
   ├─ examples ─┬─ jsp   ─┬─ ChildTag.jsp
   │              │           ├─ ChildTag.tld
   │              │           └─ ChildTag.java
   │              │      
   │              └─ WEB-INF ── classes ── ChildTag.class


 (ファイル名をクリックするとそのソースを表示)





前の章(4.JSP のスクリプト)    次の章(7.JSP のFORM処理)