属性の使用

属性を受け入れるタグハンドラをコーディングできます。属性はタグに代替値またはランタイム値を与えます。属性または属性を設定する式は、JSP で使用するときにタグに記述します。たとえば、<A> (アンカー) タグでは、次の行に示すように HREF が属性です。

<A HREF="http://www.hamsteak.com">ここをクリックしてください。</A>

このセクションでは、タグハンドラの属性を処理する方法と、TLD ファイルを使用して属性に追加機能を提供する方法について説明します。

JSP での属性のコーディング

カスタムタグの一部として属性をコーディングします。次の例は、page および flush 属性を持つ test:include タグの呼び出しを示しています。

<html>
  <body>
    <%@ taglib prefix="test" uri="test.tld" %>
    <h1>パラメータを持つカスタムタグのテスト</h1>
    <test:include page="/includedText.htm" flush="true" />
  </body>
</html>

属性の使用

属性の機能を有効にするには、タグハンドラで次のことを定義する必要があります。

必要であれば、TLD ファイルまたは TEI クラスを使用して、属性の使用方法と動作をカスタマイズできます。

TLD ファイルの指定と TEI クラスファイルには、強力な検証機能があります。ただし、属性に必要な機能は、bean に類似した setter メソッドで、タグハンドラクラスのクラススコープ変数と対話することだけです。

attribute 要素は必須ではありませんが、次のような場合に便利です。

簡単な属性の例

次のタグ属性の使用を有効にするには

...
<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 ファイルでの属性の定義

属性はタグクラスハンドラで定義します。ただし、TLD ファイルで attribute 要素を使用して、属性に追加の設定を行うことができます。TLD ファイルでの属性の設定はオプションですが、設定することによって属性の必要条件を指定でき、属性の値として実行時の式を使用できるようにすることも、できないようにすることもできます。

次の表で、attribute 要素のサブ要素について説明します。
サブ要素
説明
name
属性名です。
required
属性が必須かどうかを示します。このサブ要素は、true または false に設定します。true の場合、JSP プログラマは JSP で
タグを呼び出すときに属性を含める必要があります。
rtexprvalue
カスタムタグがこの属性の値として実行時の式を使用できるかどうかを示します。このサブ要素は、true または false に
設定します。

次の 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>