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タグ)を改良しなさい。
- オブジェクトが見つかった場合、どこのスコープから見つかったのか表示するようにする事。

