14. タグファイル
2006.07.19 株式会社四次元データ 宮澤了祐
- 14.1. タグファイル
- 14.2. 属性を使用する
- 14.3. 変数を定義する
- 14.4. 属性のフラグメントでの受け取り
14.1. タグファイル
タグファイルとは、JSPの文法で記述されたフラグメントを、カスタムタグとして再利用する機能です。 解釈が可能なJSPのフラグメントを「.tag」という拡張子で保存することで、タグファイルを作成できます。
通常のカスタムタグと違い、タグ定義ファイルを作成する必要はありません。 その代わりtagディレクティブでカスタムタグに関する情報を記述します。
「Hello World」という文字列を表示するカスタムタグをタグファイルを用いて作成しつつ解説していきます。
<%@ tag pageEncoding="euc-jp" %> <p>Hello World</p>
tagディレクティブを用いてタグファイルの文字コードを指定しています。 これを、hello.tagという名前でアプリケーションルートの「WEB-INF/tags」フォルダに保存するとします。
タグディレクティブの主な属性は以下になります。
属性名 | 説明 |
---|---|
body-content | ボディ部の書式を指定します。次のどれかを指定します。 「empty」 …ボディ部は空です。「scriptless」 …ボディ部にはJSPスクリプトが含まれてはいけません。 「jsp」 …ボディ部はJSPスクリプトです。 「tagdependent」…カスタムタグの実装に依存します。 |
pageEncoding | 文字コードを指定します。 |
import | インポートするライブラリを指定します。 |
JSPのtaglibディレクティブで以下のように設定することで使用できます。
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %> <tags:hello />
「tagdir」属性にタグファイルを保存したフォルダへのパスを指定します。
呼び出し方は「(prefix):(ファイル名)」です。
hello.tagというファイル名なので「tags:hello」という呼び出し方になります。
<tags:hello />が<p>Hello World</p>に置き換えられて出力されます。
14.2. 属性を使用する
タグファイルで属性を使用できるようにするには、attributeディレクティブで設定する必要があります。
属性名 | 説明 |
---|---|
name | 属性の名前です。 |
reruired | 属性が必須かどうかをtrueまたはfalseで指定します。ディフォルトはfalseです。 |
rtexprvalue | 属性値に式やスクリプトレットを使用できるかどうかをtrueまたはfalseで指定します。ディフォルトはfalseです。 |
fragment | 属性がフラグメントかどうかをtrueまたはfalseで指定します。ディフォルトはfalseです。 |
type | 属性値のデータ型です。ディフォルトはjava.lang.Stringです。 |
属性「value」で指定した数の二倍を出力する、タグファイルを作成すると、次のようになります。
(sample1.tag) <%@ tag pageEncoding="euc-jp"%> <%--引数の名前--%> <%@ attribute name="value" type="java.lang.Integer" required="true"%> ${value * 2}
(呼び出し側) <tags:sample1 value="100" />
「200」と出力されます。
14.3. 変数を定義する
タグファイルでもカスタムタグと同様に、変数を定義することが出来ます。
変数を定義するには、variableディレクティブで設定を行います。
属性名 | 説明 |
---|---|
name-given | スクリプト変数の名前が固定的に決まっている場合に指定。スクリプト変数の名前を指定する。name-from-attributeかどちらかを指定しなければならない。 |
name-from-attribute | スクリプト変数の名前が、カスタムタグの属性の値によって決まる場合に指定。その属性の名前を指定する。name-givenかどちらかを指定しなければならない。 またこれを指定した場合はalias属性も指定しなければならない。 |
variable-class | 変数の型を指定。java.lang.Stringがデフォルト。 |
alias | タグファイル内で使用する変数のローカル名。name-given-attributeと一緒に使用する |
scope | 設定した変数が及ぶ範囲を設定します。「AT_BEGIN」「AT_END」「NESTED」のどれかを設定します。ディフォルトは「NESTED」です。 AT_BEGIN・・・カスタムタグの開始から、スコープの終わりまで変数を保存します。 AT_END ・・・カスタムタグの終了から、スコープの終わりまで変数を保存します。 NESTED ・・・カスタムタグに囲まれた部分まで変数を保存します。 |
属性「value」で指定した数の二倍を、属性「result-name」で指定した変数に格納するタグファイルを作成します。
(sample2.tag) <%@ tag pageEncoding="euc-jp"%> <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <%--引数の名前--%> <%@ attribute name="value" type="java.lang.Integer" required="true"%> <%@ attribute name="result-name" required="true" rtexprvalue="false" %> <%@ variable name-from-attribute="result-name" alias="result"%> <% jspContext.setAttribute("result", value * 2 ); %> <jsp:doBody />
変数の登録には通常のJSPと違って、暗黙オブジェクト pageContext の代わりに jspContext を使用します。
ここでは変数名を属性「result-name」で指定しました。 属性によって変数の名前を指定する場合はattributeディレクティブで読み取る属性を指定し、variableディレクティブでタグファイル内での変数名をaliasで設定する必要があります。
ボディ部を出力するために、アクションタグの「<jsp:doBody>」を使用します。
(呼び出し元)
<tags:sample2 value="100" result-name="result"> 結果は「${result}」です。 </tags:sample2> 結果は「${result}」です。
デフォルトではscope属性は「NESTED」なのでカスタムタグの内部はresultが出力されます。
結果は「200」です。 結果は「」です。
「AT_BEGIN」なら両方、「AT_END」なら下のみが出力されます。
カスタムタグの外部ではresultを出力しても何も出力されません。
14.4. 属性のフラグメントでの受け取り
属性でフラグメントを指定した場合を解説していきます。
「attribute」ディレクティブの「fragment」属性を「true」に設定することでフラグメントとして受け取れます。
(sample3.tag) <%@ attribute name="value" type="java.lang.Integer" required="true"%> <%@ attribute name="text" fragment="true"%> <%@ variable name-given="result" %> <% jspContext.setAttribute("result", value * 2 ); %> <p> <jsp:invoke fragment="text" /> </p>
ボディ部と違い、アクションタグ「<jsp:invoke>」で実行します。
「fragment」属性に、実行するフラグメントを指定します。
<tags:sample3 value="100"> <jsp:attribute name="text"> 出力結果は:${result}です。 </jsp:attribute> </tags:sample3>
以下のように出力されれば成功です。
出力結果は:200です。