JSP 6章 カスタムタグの基本2
- 6.1. ボディ部を持つカスタムタグの作成
- 6.2. 属性の利用
- 6.3. Tagインタフェースを利用したカスタムタグのライフサイクル
- 6.4. PageContext
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のインスタンスが指定された場合には、それを使用して現在時刻を表示するようにしなさい。
- 文字列値が指定された場合には、その文字列のフォーマットに従って現在時刻を表示するようにしなさい。