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
  





yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[jsp]
claudebot
24/03/28 19:24:31
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube