属性を受け入れるタグハンドラをコーディングできます。属性はタグに代替値またはランタイム値を与えます。属性または属性を設定する式は、JSP で使用するときにタグに記述します。たとえば、<A>
(アンカー) タグでは、次の行に示すように HREF
が属性です。
<A HREF="http://www.hamsteak.com">ここをクリックしてください。</A>
このセクションでは、タグハンドラの属性を処理する方法と、TLD ファイルを使用して属性に追加機能を提供する方法について説明します。
カスタムタグの一部として属性をコーディングします。次の例は、page
および flush
属性を持つ test:include
タグの呼び出しを示しています。
<html>
<body> <%@ taglib prefix="test" uri="test.tld" %> <h1>パラメータを持つカスタムタグのテスト</h1> <test:include page="/includedText.htm" flush="true" /> </body> </html>
属性の機能を有効にするには、タグハンドラで次のことを定義する必要があります。
set
で始まり、その後に先頭が大文字の変数名を付けます。たとえば、変数名が foo
であれば、setFoo
メソッドとなります。必要であれば、TLD ファイルまたは TEI クラスを使用して、属性の使用方法と動作をカスタマイズできます。
isValid
メソッドをオーバーライドして検証を有効にする場合は、TEI クラス内で属性を定義します。詳細については、 「TEI クラスのコーディング」 を参照してください。TLD ファイルの指定と TEI クラスファイルには、強力な検証機能があります。ただし、属性に必要な機能は、bean に類似した setter メソッドで、タグハンドラクラスのクラススコープ変数と対話することだけです。
attribute
要素は必須ではありませんが、次のような場合に便利です。
attribute
要素に次のコードを含めます。
<required>true</required>
attribute
要素に次のコードを含めます。<rtexprvalue>true</rtexprvalue>
...
<test:hello username="Joe"/> ...
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*; import java.io.IOException;
public class TestParms extends BodyTagSupport {
// 属性と同じ名前を持つオブジェクトスコープの変数 String username;
// JSP コンパイラによって呼び出される setVariablename メソッド
public void setUsername(String username) { this.username = username; }
// オプションの getter メソッド
public String getUsername() { return username; } ...
JSP でタグが呼び出されると、username
変数が開始タグに設定され、この変数を後続の他のタグハンドラのメソッドで使用できます。
サンプルのタグハンドラの次の完全な例では、属性を使用して、JSP の include
アクション要素によって提供される機能をエミュレートしています。
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*; import javax.servlet.*; import java.io.IOException;
public class TestInclude extends TagSupport {
// デフォルトがないので必須です。 String page; // デフォルトは true です。 String flush = "true"; // setter メソッドです。
public void setPage(String page) {
this.page = page; }
public void setFlush(String flush) {
// 小文字で保存します。 this.flush = flush.toLowerCase(); }
public int doStartTag() throws JspException {
// 本文テキストを無視します。 return SKIP_BODY; }
// doEndTag がすべての作業を行います。
public int doEndTag() throws JspException { try { ServletContext sc = pageContext.getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(page); if (rd !=null) { // アクセスのリクエストとレスポンス ServletRequest request = pageContext.getRequest(); ServletResponse response = pageContext.getResponse(); // 必要な場合は、バッファーを一括フラッシュします。 if (flush.equals("true")) { pageContext.getOut().flush(); } // ファイルをインクルードします。 rd.include(request, response); return EVAL_PAGE; } } catch(IOException ioe) { throw new JspException(ioe.getMessage()); } catch (Exception e) { pageContext.getServletContext().log("Error with " + page, e); } return EVAL_PAGE; } }
属性はタグクラスハンドラで定義します。ただし、TLD ファイルで attribute
要素を使用して、属性に追加の設定を行うことができます。TLD ファイルでの属性の設定はオプションですが、設定することによって属性の必要条件を指定でき、属性の値として実行時の式を使用できるようにすることも、できないようにすることもできます。
次の表で、attribute
要素のサブ要素について説明します。
次の TLD エントリの例では、必須属性とオプション属性を設定します。
<?xml version="1.0" ?>
<taglib> <tlibversion>0.0</tlibversion> <jspversion>1.0</jspversion> <shortname>test</shortname> <tag> <name>include</name> <tagclass>TestInclude</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>page</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>flush</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> <tag> <name>hello</name> <tagclass>HelloTag</tagclass> <teiclass>HelloTEI</teiclass> <bodycontent>JSP</bodycontent> </tag> </taglib>