リファレンストップへ Java | カスタムタグの作成【スクリプト変数】使用した環境 JDK 6 Update 11 Tomcat 6.0.18 タグクラス内の処理でpage, request, session, applicationに対しsetAttributeによってセットした変数を、スクリプトレットからも使用できるようにします。スクリプト変数の定義には3つの方法があります。 方法1:変数名があらかじめ決定されている場合変数名があらかじめ決定されている場合は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>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> <variable>要素がスクリプト変数の使用を定義するタグになります。 ネストされた、それぞれのタグの意味は以下のようになります。
タグクラスでは、上記で定義されたスクリプト変数の名前と同様の名前で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"?> 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>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> <variable>要素がスクリプト変数の使用を定義するタグになります。 ネストされた、それぞれのタグの意味は以下のようになります。
<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はボディ部を持つタグの場合のみ使用可能です。 ボディ部内でのみスクリプト変数を使用可能とします。ボディ部が終了すると、変数は開放されます。 <%-- 使用不可 --%> <s:sample> <%-- ボディ部内なので使用可能 --%> </s:sample> <%-- 使用不可 --%> AT_BEGINは、開始タグ以降でスクリプト変数を使用可能です。 <%-- 使用不可 --%> <s:sample> <%-- 開始タグ以降なので使用可能 --%> </s:sample> <%-- 開始タグ以降なので使用可能 --%> AT_ENDは、終了タグ以降でスクリプト変数を使用可能です。 <%-- 使用不可 --%> <s:sample> <%-- 使用不可 --%> </s:sample> <%-- 終了タグ以降なので使用可能 --%> |
|