PGBox
P
G
Box

カスタムタグの作成【スクリプト変数】

JSPのメニューへ戻る



使用した環境
JDK 6 Update 11
Tomcat 6.0.18

タグクラス内の処理でpage, request, session, applicationに対しsetAttributeによってセットした変数を、スクリプトレットからも使用できるようにします。


スクリプト変数の定義には3つの方法があります。

方法1:変数名があらかじめ決定されている場合


変数名があらかじめ決定されている場合は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>sample</name>
        <tag-class>sample.SampleTag</tag-class>
        <body-content>empty</body-content>
        <variable>
            <name-given>sampleVar</name-given>
            <variable-class>java.lang.String</variable-class>
            <scope>AT_BEGIN</scope>
        </variable>

    </tag>
    
</taglib>
tldファイルの詳細な情報についてはtldファイルを参照してください。


<variable>要素がスクリプト変数の使用を定義するタグになります。
ネストされた、それぞれのタグの意味は以下のようになります。
タグ意味
<name-given>スクリプト変数名が予め決まっている場合に指定する。使用するスクリプト変数名を指定する。
<variable-class>スクリプト変数のクラス型を指定する(省略可)。デフォルトはjava.lang.String
<scope>スクリプト変数のスコープを指定する。詳細はページ下部の「スクリプト変数のスコープについて」の項を参照してください。


タグクラスでは、上記で定義されたスクリプト変数の名前と同様の名前でpageContext or request or session or applicationに対しsetAttributeを行います。
package sample;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class SampleTag extends TagSupport {
    
    @Override
    public int doStartTag() throws JspException {
        
        pageContext.setAttribute("sampleVar", "スクリプト変数のサンプル");
    
        return SKIP_BODY;
    }
    
}


このサンプルは、JSPでは以下のようにして使用する事が可能です。
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<%@ taglib uri="/sample" prefix="s" %>

<s:sample />

<%= sampleVar %>


結果は以下のように出力されます。
スクリプト変数のサンプル


変数sampleVarは、スクリプトレットで
<% String sampleVar; %>
と宣言されていませんが、タグ<s:sample />でスクリプト変数の使用が定義されているので、
タグ以降であれば、変数として使用する事が可能となっています。



方法2:属性として受け取った値を変数名として使用する場合


属性値を変数名として使用する場合は、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>sample</name>
        <tag-class>sample.SampleTag</tag-class>
        <body-content>empty</body-content>
        
        <variable>
            <name-from-attribute>varName</name-from-attribute>
            <variable-class>java.lang.String</variable-class>
            <scope>AT_BEGIN</scope>
        </variable>
        
        <attribute>
            <name>varName</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    
</taglib>
tldファイルの詳細な情報についてはtldファイルを参照してください。


<variable>要素がスクリプト変数の使用を定義するタグになります。
ネストされた、それぞれのタグの意味は以下のようになります。
タグ意味
<name-from-attribute>実行時にタグの属性で渡された値をスクリプト変数名として使用する場合に指定する。タグの属性名を指定する。(<attribute><name>で定義されている属性名)
<variable-class>スクリプト変数のクラス型を指定する(省略可)。デフォルトはjava.lang.String
<scope>スクリプト変数のスコープを指定する。詳細はページ下部の「スクリプト変数のスコープについて」の項を参照してください。


<name-from-attribute>で指定した属性は<attribute>内で定義されている必要があります。このサンプルの場合は属性「varName」が該当します。


タグクラスでは、上記で定義された属性の値を名前に使用してpageContext or request or session or applicationに対しsetAttributeを行います。
package sample;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class SampleTag extends TagSupport {
    
    /** スクリプト変数の名前 */
    private String varName;
    
    @Override
    public int doStartTag() throws JspException {
        
        // 属性値を名前に使用する
        pageContext.setAttribute(varName, "スクリプト変数のサンプル");
    
        return SKIP_BODY;
    }

    public void setVarName(String varName) {
        this.varName = varName;
    }
    
}


このサンプルは、JSPでは以下のようにして使用する事が可能です。
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<%@ taglib uri="/sample" prefix="s" %>

<s:sample varName="aaa" />

<%= aaa %>


結果は以下のように出力されます。
スクリプト変数のサンプル


スクリプト変数の名前は、属性に与えた値で動的に決定されるので
<s:sample varName="bbb" />

<%= bbb %>

としても同様の結果を得る事ができます。



方法3:独自の処理で動的に定義する


teiクラスを作成する事により、独自の処理で動的にスクリプト変数を定義する事が可能です。
teiクラスのサンプルについてはカスタムタグの作成【動的なタグの検証とスクリプト変数の定義】を参照してください。



スクリプト変数のスコープについて


<variable>の<scope>要素で指定可能な値は以下のようになっています。
意味
NESTED開始タグ(doStartTag)から終了タグ(doEndTag)の間でのみスクリプト変数が使用可能。デフォルト
AT_BEGIN開始タグ(doStartTag)以降でスクリプト変数が使用可能
AT_END終了タグ(doEndTag)以降でスクリプト変数が使用可能



NESTEDはボディ部を持つタグの場合のみ使用可能です。
ボディ部内でのみスクリプト変数を使用可能とします。ボディ部が終了すると、変数は開放されます。
<%-- 使用不可 --%>
<s:sample>
    <%-- ボディ部内なので使用可能 --%>
</s:sample>
<%-- 使用不可 --%>


AT_BEGINは、開始タグ以降でスクリプト変数を使用可能です。
<%-- 使用不可 --%>
<s:sample>
    <%-- 開始タグ以降なので使用可能 --%>
</s:sample>
<%-- 開始タグ以降なので使用可能 --%>


AT_ENDは、終了タグ以降でスクリプト変数を使用可能です。
<%-- 使用不可 --%>
<s:sample>
    <%-- 使用不可 --%>
</s:sample>
<%-- 終了タグ以降なので使用可能 --%>






JSPのメニューへ戻る