JSP 6章 カスタムタグの基本2
- 6.1. ボディ部を持つカスタムタグの作成
- 6.2. 属性の利用
- 6.3. Tagインタフェースを利用したカスタムタグのライフサイクル
- 6.4. PageContext
6.4. PageContext
これまでJSPページの出力を行う「JspWriter」を取得するために「PageContext」を使用してきましたが、他に以下のような機能を提供しています。
- 様々なスコープへのオブジェクトの登録および取得
- includeとforward
- ServletConfigおよびServletContextの取得
特にオブジェクトの登録・取得機能により、カスタムタグ外部とのデータのやり取りが可能になります。それについて説明します。
... public class AttributeExistTag implements Tag{ private String name=""; ... public int doEndTag() throws JspException{ JspWriter writer=pageContext.getOut(); try{ if(pageContext.findAttribute(name)==null){ writer.print(name+" attribute not found"); }else{ writer.print(name+" attribute found"); } }catch(IOException e){ throw JspException(e.getMessage()); } } public void setName(String name){ this.name=name; } }
上記は「name」属性で指定された名前のオブジェクトが「session」や「application」などのスコープに存在するかどうか調べるカスタムタグ・ハンドラクラスです。8行目がオブジェクトがあるかどうか調べている部分で、「PageContext」の「findAttribute」メソッドを使用しています。
「findAttribute」メソッドは「page」「request」「session」「application」の各スコープを順に調べ、指定された名前のオブジェクトが見つかればそれを返します。どこにも見つからなかった場合には、「null」を返します。
以下は上記のカスタムタグを利用したJSPページの例です。
<%@ page contentType="text/html; charset=EUC-JP" %> <%@ taglib uri="http://www.techscore.com/tags/example" prefix="example" %> ... <% pageContext.setAttribute("test",new Object()); %> <example:AttributeExist name="test" /><br> <example:AttributeExist name="test2" /><br> ...
特定のスコープからのみ検索を行う場合には、「getAttribute」メソッドを使用します。以下は「session」スコープから検索する例です。
Object obj=pageContext.getAttribute("test",PageContext.SESSION_SCOPE);
逆に値を設定する事も可能です。その場合は以下のようにします。「request」スコープに登録しています。
pageContext.setAttribute("test",new Object(),PageContext.REQUEST_SCOPE);
(実習課題4)
4節のサンプルタグ(AttributeExistタグ)を改良しなさい。
- オブジェクトが見つかった場合、どこのスコープから見つかったのか表示するようにする事。