目次へ

6.2. 属性の利用

カスタムタグにおける属性の利用方法について説明します。属性を利用するためには、

  • 属性の値を設定するために「setXXX」メソッドをハンドラクラスに実装する
  • 属性に関する情報をタグライブラリ・ディスクリプタに記述する

の2点が必要です。

1節の「HelloWorld」タグに、「Hello World」に続くメッセージを指定する属性を追加します。属性名は「message」とします。

import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.JspException
import javax.servlet.jsp.tagext.Tag;
import java.io.IOException;
  
public class HelloWorldTag implements Tag{
  private String msg="";
  ...
  public int doEndTag() throws JspException{
    try{
      pageContext.getOut().print("Hello World "+msg);
    }catch(IOException e){
      throw new JspException(e.getMessage());
    }
    return EVAL_PAGE;
  }
  
  public void setMessage(String msg){
    this.msg=msg;
  }
  ...
}

属性の値を設定する「setXXX」メソッドの名前は、必ず「set(属性名)」としなければなりません。ここでは「setMessage」となります。引数の型には「String」だけでなく、「int」などの基本データ型を指定する事も可能です。カスタムタグの属性で指定された値の型と、メソッドの引数の型が一致しなかった場合にはJSPのコンパイル時に例外が発生します。

ハンドラクラスの実装が終了したら、タグライブラリ・ディスクリプタの編集に取り掛かります。

...
<taglib>
  ...
  <tag>
    <name>HelloWorld</name>
    <tag-class>HelloWorldTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
      <name>message</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>
</taglib>

属性は<attribute>タグを用いて定義します。<attribute>タグの要素の意味は以下の通りです。

name 必須 属性の名前
required   属性が省略可能かどうか。デフォルトは「false」。必須の場合は「true」を指定。
rtexprvalue  

属性値として、スクリプトが使用できるかどうか指定。デフォルトは「false」。可能な場合は「true」を指定。「true」の場合は、

<example:HelloWorld message="<%=name %>" />

とした場合、属性のスクリプトで指定されている値が、setterメソッドの引数に渡される。「false」の場合は、「<%=name %>」という文字列がそのまま渡される。

スクリプトを利用すれば、カスタムタグに文字列や数字以外の値を渡す事も可能となります。最後にJSPページの「HelloWorld」タグで属性「message」を利用します。

<%@ page contentType="text/html; charset=EUC-JP" %>
<%@ taglib uri="http://www.techscore.com/tags/example" prefix="example" %>
...
<example:HelloWorld message="!!!">Everyone<br></example:HelloWorld>
...

(実習課題3)

実習課題1のカスタムタグを改良しなさい。

  • 現在時刻のフォーマットを指定する属性を追加しなさい。
  • またその属性にスクリプトでjava.text.SimpleDateFormatのインスタンスが指定された場合には、それを使用して現在時刻を表示するようにしなさい。
  • 文字列値が指定された場合には、その文字列のフォーマットに従って現在時刻を表示するようにしなさい。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp