単一タグのカスタムタグの例として、「Hello World!」を表示するカスタムタグを作成してみます。
JSPでカスタムタグを利用するためには、taglibディレクティブを指定する必要があります。 カスタムタグは、<プレフィックス:タグ名 />で指定します。
HelloTag.jsp |
---|
<%@ page contentType="text/html; charset=Shift_JIS" %> <%@ taglib prefix="ash" uri="http://ash.jp/taglib_1_0" %> <html> <head> <title>Hello カスタムタグ</title> </head> <body> <h1>Hello カスタムタグ</h1> <p><ash:hello /></p> </body> </html> |
タグハンドラは、doStartTagメソッドのみ実装します。 「Hello World!」を表示すると、SKIP_BODYを返却しているため、BODYの処理を行われません。
HelloTag.java |
---|
package jp.ash.taglib; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; /** * 「Hello World!」表示タグライブラリ **/ public class HelloTag extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().print("Hello World!"); } catch(Exception ex) { throw new JspException(ex); } return SKIP_BODY; } } |
属性は、タグハンドラクラスに属性名のセッタメソッド(setXXX)を作成するだけです。セッタメソッドは、set + 「変数名の先頭を大文字にした名前」のメソッドのことです。 セッタメソッドを作成しておくと、JSPで属性を設定すると、setPageContextで自動的に設定されます。
カスタムタグは、<プレフィックス:タグ名 属性名="属性値" />で指定します。
EchoTag.jsp |
---|
<%@ page contentType="text/html; charset=Shift_JIS" %> <%@ taglib prefix="ash" uri="http://ash.jp/taglib_1_0" %> <html> <head> <title>Echo カスタムタグ</title> </head> <body> <h1>Echo カスタムタグ</h1> <p><ash:echo msg="Hello World!" /></p> </body> </html> |
タグハンドラクラスでは、属性名のセッタメソッド(setMsg)を作成します。
EchoTag.java |
---|
package jp.ash.taglib; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; /** * メッセージ表示タグライブラリ **/ public class EchoTag extends TagSupport { private String msg; /** msgの設定 **/ public void setMsg(String msg) { this.msg = msg; } /** タグ初期処理 **/ public int doStartTag() throws JspException { try { pageContext.getOut().print(msg); } catch(Exception ex) { throw new JspException(ex); } return SKIP_BODY; } } |
タグライブラリの情報をタグライブラリ記述子に設定します。
taglib.tld |
---|
<?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>ash</short-name> <uri>http://ash.jp/taglib_1_0</uri> <description>ASHのタグライブラリ</description> <tag> <name>hello</name> <tag-class>jp.ash.taglib.HelloTag</tag-class> <body-content>empty</body-content> <description>「HelloWorld!」を表示</description> </tag> <tag> <name>echo</name> <tag-class>jp.ash.taglib.EchoTag</tag-class> <body-content>empty</body-content> <description>msg内容を表示</description> <attribute> <name>msg</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib> |
タグライブラリ記述子をデプロイメント記述子に設定します。
web.xml |
---|
<?xml version="1.0" ?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <taglib> <taglib-uri>http://ash.jp/taglib_1_0</taglib-uri> <taglib-location>/WEB-INF/taglib.tld</taglib-location> </taglib> </web-app> |