« Vistaにしようにも・・・ブログのアクセス解析 »

JSPの実体ファイル

JSPの実体ファイル

パーマリンク 2008/09/08 22:28:10 著者: kumaold メール
カテゴリ: 仕事, プログラミング, Javascript/Java

PHPと違ってJSPはJavaが原型のコンパイラ言語なので、コンパイル後の実行ファイル?としてファイルが存在するわけです。

*.jspファイルを書き換えた場合、初回アクセス時に再コンパイルされるようです。

例えば、webapps/jsp/index.jsp にこんなファイルを作ったとします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=utf-8">
    <title>Untitled</title>
</head>
<body>

<% out.println("Hello, JSP!"); %>

</body>
</html>


すると、かな~り奥深い階層のこの場所に*.javaと*.classがあります。
拡張子的に想像がつくと思いますが、Javaのソースと実行ファイルです。

/usr/local/tomcat/work/Catalina/localhost/jsp/org/apache/jsp/

・index_jsp.java
・index_jsp.class

開いてみると、完全なJavaのソースファイルで、<% %>の外に記述されたhtmlなども1行1行out.write();で書き出していることが分かります。

Javaでこれは効率悪そうとか思いつつ、何か問題が起きたらこれを見れば分かりそうな気がします。
(そもそもJavaを先にやるべきだったか?)

package org.apache.jsp;

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

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

  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }

  public void _jspDestroy() {
  }

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

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


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

      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("\t<meta http-equiv=content-type content=\"text/html; charset=utf-8\">\n");
      out.write("\t<title>Untitled</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("\n");
 out.println("Hello, JSP!"); 
      out.write("\n");
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}


これで何となくJSPに実行原理が分かった気がします。

コンパイラ言語でありながらインタプリタ言語のような感覚で扱えるのも内部的にこんな処理を入れているからですかね。



一番やさしいJSP & サーブレット入門塾 第2版 (DB Magazine SELECTION)一番やさしいJSP & サーブレット入門塾 第2版 (DB Magazine SELECTION)
山本 隆之

翔泳社 2008-03-19
売り上げランキング : 122492
おすすめ平均

Amazonで詳しく見る
type="text/javascript" src="http://www.ad16.jp/socailmedia.php?a=CCBot%2F2.0+%28http%3A%2F%2Fcommoncrawl.org%2Ffaq%2F%29&u=http%3A%2F%2Fkuroutoshikou.blog16.jp%2Findex.php%2F2008%2F09%2F08%2Fjspa_rar_af_a_a_ia_ca_l" charset="EUC-JP">

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年5月
 << <   > >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

検索

XMLフィード

16ブログ     free blog tool