14. タグファイル2006.07.19 株式会社四次元データ 宮澤了祐
JSP 14章 タグファイル
14.1. タグファイルタグファイルとは、JSPの文法で記述されたフラグメントを、カスタムタグとして再利用する機能です。 解釈が可能なJSPのフラグメントを「.tag」という拡張子で保存することで、タグファイルを作成できます。 通常のカスタムタグと違い、タグ定義ファイルを作成する必要はありません。 その代わりtagディレクティブでカスタムタグに関する情報を記述します。 「Hello World」という文字列を表示するカスタムタグをタグファイルを用いて作成しつつ解説していきます。 <%@ tag pageEncoding="euc-jp" %> <p>Hello World</p> tagディレクティブを用いてタグファイルの文字コードを指定しています。 これを、hello.tagという名前でアプリケーションルートの「WEB-INF/tags」フォルダに保存するとします。 タグディレクティブの主な属性は以下になります。
JSPのtaglibディレクティブで以下のように設定することで使用できます。 <%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %> <tags:hello /> 「tagdir」属性にタグファイルを保存したフォルダへのパスを指定します。 呼び出し方は「(prefix):(ファイル名)」です。 <tags:hello />が<p>Hello World</p>に置き換えられて出力されます。 14.2. 属性を使用するタグファイルで属性を使用できるようにするには、attributeディレクティブで設定する必要があります。
属性「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. 変数を定義するタグファイルでもカスタムタグと同様に、変数を定義することが出来ます。
属性「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. 属性のフラグメントでの受け取り属性でフラグメントを指定した場合を解説していきます。 (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>」で実行します。 <tags:sample3 value="100">
<jsp:attribute name="text">
出力結果は:${result}です。
</jsp:attribute>
</tags:sample3>
以下のように出力されれば成功です。 出力結果は:200です。 |
![]()
![]()
|