PGBox
P
G
Box

カスタムタグの作成【分岐・繰り返し】

JSPのメニューへ戻る



使用した環境
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"?>
<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>
tldファイルの詳細な情報についてはtldファイルを参照してください。


このタグはJSPでは以下のようにして使用できます。
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<%@ taglib uri="/sample" prefix="sample" %>

<sample:loop count="3">
    繰り返し<br />
</sample:loop>


実行すると、以下のような出力結果となります。
繰り返し
繰り返し
繰り返し




JSPのメニューへ戻る