JSP ページの Java への展開

  最も単純なページ



tomcat.5.0 のインストール場所は、「C:\Tomcat5.0」 です
.jsp の置かれている場所は、「D:\tomcat\simple」 であり、ドキュメントベースは、「D:\tomcat」 です

Java への展開を目的に以下のようなページを tomcat5.0 で表示します。

  
<%@ page
	language="java"
	contentType="text/html;charset=Shift_JIS"
%>
<HTML>
<% out.print("<BODY></BODY>"); %>
</HTML>
  



  展開場所と展開結果



「C:\Tomcat5.0\work\Catalina\localhost\tomcat\org\apache\jsp\simple」 に作成されており、展開結果は以下のようになっています

  
package org.apache.jsp.simple;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class out_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static java.util.Vector _jspx_dependants;

  public java.util.List getDependants() {
    return _jspx_dependants;
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;
    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;


    try {
      _jspxFactory = JspFactory.getDefaultFactory();
      response.setContentType("text/html;charset=Shift_JIS");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n<HTML>\r\n");
 out.print("<BODY></BODY>"); 
      out.write("\r\n</HTML>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (pageContext != null) pageContext.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
    }
  }
}
  

この結果から、JSP の中で書かれるコードが Java のどの場所で書かれるかは明らかです。

まず、public void _jspService(HttpServletRequest request, HttpServletResponse response) の引数の 「request」「response」が使用できる事が想像できます。事実、以下の場所で response は使用されています

response.setContentType("text/html;charset=Shift_JIS");

その他にも使用可能なオブジェクトがそれ以降でセットされています

1) pageContext
2) application
3) config
4) session
5) out

特に out は、HTTP 出力に使用されています

また、Object page = this; によって page も使用できますが、page そのものは JSP としては意味を持ちません。getServletInfo() が使用できるのは this のほうです。

この仕様は逆ではないか・・・とも思うのですが、使用する事は無いと思われるのでまあ、事実として認識しておけば良いと思います



  気になる JspFactory

とりあえず、「JSPページの制作者が使用すべきではありません」とあります。

最初に実行されている _jspxFactory = JspFactory.getDefaultFactory(); によってセットされた_jspxFactory が pageContext を作成しているのでやっぱり気になります

JspFactory.getDefaultFactory() は、抽象クラスからデフォルトのファクトリーを用意するとありますが実装のおおもとだと思えば良いと思います。

その結果、_jspxFactory が デフォルトのファクトリーという事になります。

pageContext は _jspxFactory.getPageContext(this,request,response,null,true,8192,true); によって作成されます。パラメータの意味は以下のようになります

this リクエストするサーブレット
request Servlet がペンディングしている現在のリクエスト
response Servlet がペンディングしている現在のレスポンス
null JSPリクエストに対するエラーページのURL、もしくはnull
true JSPセッションを必要とする時に真
8192 バッファのバイトサイズ。バッファがない場合 PageContext.NO_BUFFER、実装しない場合はPageContext.DEFAULT_BUFFER
true バッファオーバーフローの際にバッファをアウトプットストリームに自動的にフラッシュするか、もしくはIOException をスローするかを選択する



  pageContext

  • 様々な範囲の名前空間を管理する単一のAPI
  • 様々なパブリックオブジェクトにアクセスするための幾つかの便利なAPI
  • 出力のためのJspWriterを取得するための機構
  • ページでセッションの使用を管理するための機構
  • ページの指示子属性をスクリプト環境で操作するための機構
  • 現在のリクエストを、アプリケーション内の他のアクティブなコンポーネント にフォワードもしくはインクルードするための機構
  • エラーページの例外処理を操作するための機構

・・・といろいろありますが、この後セットされるオブジェクトを作成しているのは間違い無く、それぞれは上記説明と一致するものがあります

特に重要な JspWriter は、out = pageContext.getOut(); で実装される事になります( JspWriter は クライアントレスポンスのための現在のJspWriterストリームです )




  JspWriter クラスのメソッド

基本的には、各データ型に対して print と println が使用できます

newLine は改行のみを出力します

その他は、バッファ系のメソッドが存在しますが、必要な時にマニュアルを紐解けば良いでしょう



  HttpServletResponse クラス

それぞれのクラスのメソッドを吟味していく事によって、Java である事の特別性は若干薄れて行くと思います。

確かに記述方法は、Java ですが、Web アプリケーションの特性を示すメソッドばかりを知る事ができます。つまり、機能の実装のみにおいては、Java も 他の言語もあまり変わらないと言う事です

試しに、HttpServletResponse クラスを見てみますと、最初に 以下のようなメソッドがあります

  
public void addCookie(Cookie cookie)
  

まさにそれらしいメソッドですが、引数としてあらわれる Cookie が クラスであるところが Java らしいところでしょうか。他のスクリプト言語であればこの手の処理には文字列を渡すものですが、Cookie クラスを作成しなければなりません。

この場合目的がはっきりしているのであまり問題はありませんが、この「クラス」に振り回されてプログラマ初心者が困惑するのも間違いの無い事実でしょう

  
Cookie UserName = new Cookie( "UserName", "lightbox" );
response.addCookie( UserName );
  

と、慣れたプログラマならば Java に詳しくなくてもこの記述にたどり着くのはマニュアルを読む時間のみで事足ります。これによって HTTP ヘッダには以下のエントリがきちんと生成されています

Set-Cookie: UserName=lightbox

結論から言えば、、HttpServletResponse クラスである response は、HTTPヘッダ用のオプジェクトであると言えます。クッキーがクライアントでサポートされない場合のセッションのサポートの為の encodeURL というメソッドもここに所属しています

以下は、現時点でのヘッダの状態です

  
HTTP/1.1 200 OK
Set-Cookie: UserName=lightbox
Content-Type: text/html;charset=Shift_JIS
Content-Length: 36
Date: Fri, 30 Jan 2004 01:36:08 GMT
Server: Apache-Coyote/1.1
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
  











  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ