カスタムタグとは、自分で作ったタグの動作をJSPで定義できる機能です。これによりデザインとロジックを分離する考えがあるようです。
簡単なのは、<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 は 開始タグと終了タグとの間にボディがないタグです。ボディがある場合の処理は、様々な利用方法があります。
ボディのないカスタムタグを実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。
| 1 | JSP ファイル | hellotag.jsp | /examples/jsp/ |
| 2 | TLD ファイル | 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
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)します。
属性のあるカスタムタグで実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。
| 1 | JSP ファイル | echotag.jsp | /examples/jsp/ |
| 2 | TLD ファイル | 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
(ファイル名をクリックするとそのソースを表示)
ボディのあるカスタムタグですが、ボディは操作しません。Htmlタグを属性 tag に指定された値で変更する例です。実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。
| 1 | JSP ファイル | tagstag.jsp | /examples/jsp/ |
| 2 | TLD ファイル | 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 から実行された後に呼ばれます。
ボディを操作するカスタムタグです。ボディの内容を属性 count に指定された値で繰り返し表示する例です。実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。
| 1 | JSP ファイル | LoopTag.jsp | /examples/jsp/ |
| 2 | TLD ファイル | 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>
|
ネストされたカスタムタグです。親タグインスタンスの属性を取得し表示する例です。実際に次のファイルを作成してみます。実行環境は、「1. JSP とは」と同じ環境とします。
| 1 | JSP ファイル | LoopTag.jsp | /examples/jsp/ |
| 2 | TLD ファイル | 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
(ファイル名をクリックするとそのソースを表示)