JSP2.0から、独自タグ(カスタムタグ)を作る方法としてタグファイルというものが用意された。
タグファイルを使う側から見れば従来のカスタムタグと同じ形式で書けるが、
タグファイルを作る側から見ると、インクルード用の共通JSPと似ている。
コンパイルされた実体はSimpleTagSupportクラスを継承したひとつのクラスとなるので、従来のカスタムタグと同形式。
|
WEB-INFの下にタグファイルを置くディレクトリーを作り、タグファイルはそこに置く。拡張子は「tag」にしなければならない。
従来のカスタムタグと違い、tldファイルを記述する必要は無い。
<%@ tag pageEncoding="Windows-31J"%> <p>hello,tag!</p>
通常のjspファイルではpageディレクティブ(<%@page 〜%>
)を記述するが、タグファイルの場合はtagディレクティブを記述する。
その後に、通常のjspファイルと同様にHTMLタグやJSPのアクションタグを書いていく。
使う側は、taglibディレクティブを使ってタグファイルの場所を指定する。
タグ名の接頭辞(prefix)はtaglibディレクティブで指定した文字列になる。
タグ名の本体は、タグファイルのファイル名になる。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@taglib tagdir="/WEB-INF/tags" prefix="tags"%>
<html>
<head>
<title>タグファイル実験</title>
</head>
<body>
<h1>タグファイル実験</h1>
<tags:hello />
</body>
</html>
↓生成されるHTML
<html> <head> <title>タグファイル実験</title> </head> <body> <h1>タグファイル実験</h1> <p>hello,tag!</p> </body> </html>
タグファイルを置くディレクトリーは、WEB-INFの下でないと駄目なようだ。
WEB-INFの下に「WEB-INF/tags/sub1」のように複数階層のディレクトリーを作るのは大丈夫なようだが、tagdirは個別に指定する必要がある。
<%@taglib tagdir="/WEB-INF/tags" prefix="tags"%> <%@taglib tagdir="/WEB-INF/tags/sub1" prefix="sub1"%>
開発を進めていくと複数のタグファイルが出来ることになると思うが、tagdirはディレクトリー指定なのでtaglibディレクティブを複数書く必要は無い。
タグファイルを使う側で、カスタムタグのボディー部にHTMLを記述することが出来る。
タグファイル側では、ボディー部を出力する箇所を指定できる。
<%@ page contentType="text/html; charset=Windows-31J"%> <%@taglib tagdir="/WEB-INF/tags" prefix="tags"%> <html> <head> <title>タグファイル実験</title> </head> <body> <h1>タグファイル実験</h1> <tags:body> ボディー部 </tags:body> </body> </html>
<%@ tag pageEncoding="Windows-31J"%> body_tag_start[ <jsp:doBody /> ]body_tag_end
<jsp:doBody/>の場所が、使用元のjspファイルで指定されたボディー部に置き換わる。
(2回書けば、2回出力されることになる)
<jsp:doBody/>の部分は、実行時には以下のようなコードに置き換わっている。
JspFragment jspBody = getJspBody(); //SimpleTagSupport#getJspBody() if (jspBody != null) { jspBody.invoke(null); //デフォルトのwriterに対して出力される }
タグファイルに引数(属性)を渡すことが出来る。
タグファイル側でattributeディレクティブを使って、受け付ける引数名を指定する。
<%@ tag pageEncoding="MS932"%> <%@ attribute name="value"required="true" %> attr_tag:value=${value}
タグファイル内で引数の値を使うには、EL(式言語)を使用する。
引数はページスコープのプロパティーとして扱われているようなので、Strutsの<bean:write>でも出力できる。
<bean:write name="value" /> <bean:write name="value" scope="page" />
タグファイルを使う側は、タグの属性として引数を記述する。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@taglib tagdir="/WEB-INF/tags" prefix="tags"%>
<html>
<head>
<title>タグファイル実験</title>
</head>
<body>
<h1>タグファイル実験</h1>
<tags:attr value="何かの値" />
</body>
</html>