リファレンストップへ Java | カスタムタグの作成【分岐・繰り返し】使用した環境 JDK 6 Update 11 Tomcat 6.0.18 分岐や繰り返し処理を行うJSPカスタムタグを自作する場合のサンプルです。このサンプルページではEL式を使用しています。EL式についてはEL式【基本】を参照してください。条件によってボディ部を評価する属性で指定された値がtrueとなる場合のみ、ボディ部を処理するカスタムタグを作成してみます。JSTLの<c:if test="xxx">と同様の動作を行うタグとなります。 IfTag.java package sample; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; public class IfTag extends TagSupport { /** 属性値:trueの場合にボディを評価する */ private Object test; @Override public int doStartTag() throws JspException { boolean evalBody = false; if (test != null && "true".equalsIgnoreCase(test.toString())) { evalBody = true; } if (evalBody) { return EVAL_BODY_INCLUDE; // (1) } return SKIP_BODY; // (2) } @Override public void release() { super.release(); test = false; } public void setTest(Object test) { this.test = test; } } (1) testの値がtrueに該当する場合はEVAL_BODY_INCLUDEを返す事で、ボディ部の評価を行います。 (2) testの値がtrueに該当しない場合はSKIP_BODYを返す事で、ボディ部の評価をスキップします。 /WEB-INF/sample.tld <?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xml="http://www.w3.org/XML/1998/namespace" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <uri>/sample</uri> <tag> <name>if</name> <tagclass>sample.IfTag</tagclass> <body-content>JSP</body-content> <attribute> <name>test</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> このタグはJSPでは以下のようにして使用できます。 <%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> <%@ taglib uri="/sample" prefix="sample" %> <% pageContext.setAttribute("aaa", "1"); %> <sample:if test="${1 == aaa}"> 条件が成立している </sample:if> <sample:if test="${1 != aaa}"> 条件が成立していない </sample:if> 繰り返し処理を行う指定回数、ボディ部の評価を繰り返す単純なタグを作成してみます。LoopTag.java package sample; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class LoopTag extends BodyTagSupport { /** 属性値:繰り返しを行う回数 */ private int count; /** 現在の繰り返し回数 */ private int currentIndex; @Override public int doStartTag() throws JspException { // 繰り返し回数に0以下を指定されている場合は何も行わない if (count <= 0) { return SKIP_BODY; } currentIndex = 0; return EVAL_BODY_INCLUDE; } @Override public int doAfterBody() throws JspException { // 現在の繰り返し回数をカウントアップする currentIndex++; // 繰り返し回数が指定回数に達した場合は再評価を終了する if (count == currentIndex) { return SKIP_BODY; // (1) } // ボディ部の再評価を行う return EVAL_BODY_AGAIN; // (2) } @Override public int doEndTag() throws JspException { return EVAL_PAGE; } @Override public void release() { super.release(); count = 0; currentIndex = 0; } public void setCount(int count) { this.count = count; } } (1) 再評価をこれ以上行わない場合はSKIP_BODYを返します。 (2) EVAL_BODY_AGAINを返す事によって、ボディ部が再度評価されます。 /WEB-INF/sample.tld <?xml version="1.0" encoding="UTF-8"?> tldファイルの詳細な情報についてはtldファイルを参照してください。<taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xml="http://www.w3.org/XML/1998/namespace" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <uri>/sample</uri> <tag> <name>loop</name> <tagclass>sample.LoopTag</tagclass> <body-content>JSP</body-content> <attribute> <name>count</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> このタグはJSPでは以下のようにして使用できます。 <%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> <%@ taglib uri="/sample" prefix="sample" %> <sample:loop count="3"> 繰り返し<br /> </sample:loop> 実行すると、以下のような出力結果となります。 繰り返し 繰り返し 繰り返し |
|