目次へ

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タグ)を改良しなさい。

  • オブジェクトが見つかった場合、どこのスコープから見つかったのか表示するようにする事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp