まずはタグ用のJavaサーブレット本体から。
helloTag.java
package tag; import java.io.IOException; import javax.servlet.jsp.tagext.TagSupport; public class helloTag extends TagSupport { public int doStartTag() { try { pageContext.getOut().write("Hello,world"); } catch (IOException e) { e.printStackTrace(); } return SKIP_BODY; } } |
カスタムタグはTagSupportクラスをextendsして作成します。
TagSupportクラスにあるメソッドのうち、doStartTag、doAfterBody、doEndTagの各メソッドを上書きして実行します。
各メソッドは名前のとおり、タグ開始時点、タグボディが終わったあと、タグの終了時点で行う処理を意味しています。
デフォルトでは各メソッドとも何もしません。
今回は文字を書くだけなのでdoStartTagを上書きします。
各メソッドは返り値を返さなければなりません。
EVAL_PAGEやEVAL_BODY_INCLUDE等色々ありますが、今回はタグボディを気にしないのでSKIP_BODYを返します。
次にタグを呼び出すJSPです。こちらは簡単。
helloTag.jsp
<%@ taglib uri="http://localhost:8080/example/tags/helloTag" prefix="hw" %> <hw:helloworld /> |
http://localhost:8080/example/tags/helloTagって何処のこと?
気にせずに次はweb.xml
<jsp-config> <taglib> <taglib-uri>http://localhost:8080/example/tags/helloTag</taglib-uri> <taglib-location>/WEB-INF/lib/hello.tld</taglib-location> </taglib> </jsp-config> |
実はhttp://localhost:8080/example/tags/helloTagではなく何でもいいのです。
命名規則のようなものはありますが比較的どうでもいいです。
web.xmlで<taglib-uri>と<taglib-location>を結び付けるという意味なのです。
<taglib-location>には実在するtldファイルを置かねばなりません。
http://yuubiseiharukana.blog.shinobi.jp/Entry/40/
で作成したタグの使用法が、
<%@taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
となっていたのも、web.xml(のようなもの)にそのように書かれていたからです。
というわけで最後にhello.tld。
/WEB-INF/lib/hello.tld
<?xml version="1.0" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>hw</short-name> <tag> <name>helloTag</name> <tag-class>tag.helloTag</tag-class> <body-content>empty</body-content> </tag> </taglib> |
JSPによるタグファイルの設計図は<%@tag%><%@attribute%>等で記述していたのに対し、tldファイルはタグの設計図をxml形式で記入します。
両者は概ね共通していますが、
<tag-class>にパッケージ付きのフルパス、<name>はタグのクラス名を指定します。
さて、(のようなもの)に嫌な予感を感じた方はいませんか。
上記を見てのとおりカスタムタグを一個追加するために複数のファイルを書かねばなりません。
しかもweb.xmlまで書き換える必要があります。
web.xmlはJavaアプリケーションの根幹であり、PHPでいうところのphp.iniのようなものです。
たかだかタグ追加のためだけにわざわざ編集するなどという面倒なことはしたくありません。
また、自作のすごいカスタムタグを配布したい、という場合に、「導入する場合はweb.xmlを書き換えて」などとヘルプを書くのもどうかという感じです。
というわけでweb.xmlを書き換えずに済む方法があるのですがまあまたいつか。