はじめに
JSPでは、自分でタグを作成できる。これにより、JSP中に極力Javaコードを書かずに済む。
作成して利用するまでに必要なこと
カスタムタグを利用するまでには、以下のことを行う必要がある。
- タグハンドラクラスを作成する
- タグ設定を記述する
- 利用側で利用宣言する
上記の他に、タグファイルを作成し、利用宣言をすることでそのタグも利用できる。
カスタムタグを作成する手順
タグハンドラクラスの作成
タグハンドラクラスは、(Tag|IterationTag|BodyTag)インターフェースの実装が必要だが、各タグには共通して記述する部分が多いため、それらを実装した以下のいずれかのクラスを継承すると楽に作成できる。
-
javax.servlet.jsp.tagext.TagSupport
クラス: bodyなしのタグ、bodyに作用しないタグ、bodyを繰り返すタグ -
javax.servlet.jsp.tagext.TagSupport
: bodyの内容を変更するタグ -
javax.servlet.jsp.texext.SimpleTagSupport
: Servlet2.4以上でbodyなしのタグ
以下に、TagSupport
クラスを継承し、bodyなしのタグを作成する場合を掲載する。
bodyなしハンドラ(SampleTagHandler.java)
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class SampleTagHandler extends TagSupport {
private String name;
@Override
public int doEndTag() throws JspException {
try {
// 出力
pageContext.getOut().print("あなたが入力した名前は「" + name + "」です。");
} catch (IOException ex) {
Logger.getLogger(SampleTagHandler.class.getName()).log(Level.SEVERE, null, ex);
}
// 残りのページを評価する値を返して終了
return EVAL_PAGE;
}
// name属性をセットするためのセッタ
public void setName(String name) {
this.name = name;
}
}
タグ記述毎に最低限変更が必要になるであろう関数は以下。
作成するタグの種類 | 継承するクラス | doStartTag() |
doAfterBody() |
doEndTag() |
---|---|---|---|---|
bodyなし | TagSupport | 変更する | ||
bodyあり | TagSupport | 変更する | 変更する | |
bodyを繰り返す | TagSupport | 変更する | 変更する | 変更する |
また、属性を持たせる場合、単純セッタ(name属性 -> setName()
)が必要。
タグ設定を記述する
タグ設定を記述するフォーマットは、XMLもしくはTLDである。
以下では、TLDによる記述を紹介する。
以下に掲載するのは、NetBeansIDE8.1で生成したものである。
/WEB-INF/tlds/mytaglib.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version>
<short-name>mytaglib</short-name>
<uri>/WEB-INF/tlds/mytaglib</uri>
<!-- タグの定義 -->
<tag>
<!-- タグの名前 -->
<name>SampleTag</name>
<!-- タグハンドラクラス -->
<tag-class>SampleTagHandler</tag-class>
<!-- bodyを持つかどうか -->
<body-content>empty</body-content>
<!-- 属性の定義。attributeを複数並べられる。 -->
<attribute>
<!-- 属性名 -->
<name>name</name>
<!-- 必須属性かどうか -->
<required>true</required>
<!-- 実行時評価属性かどうか -->
<rtexprvalue>true</rtexprvalue>
<!-- 属性の型 -->
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
<tag>
タグの中に1つのタグを記述する。
タグに付与したい属性は、<attribute>
タグで指定する。
利用宣言する
作成したタグを利用したいJSPで、以下の記述をする。
<!%-- TLDファイルの取り込み -->
<%@taglib prefix="my" uri="/WEB-INF/tlds/mytaglib" %>
<!%-- カスタムタグの利用 -->
<my:SampleTag name="Foo" /><!%-- あなたが入力した名前は「Foo」です。 -->