0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JSP

Last updated at Posted at 2021-07-22

JSPの作成~表示までの動きを確かめてみる。

前提条件

※Javaインストール済。Path、JAVA_HOMEにパスを通した。
※Tomcatインストール済。CATALINA_HOMEにパスを通した。

JSPの作成~表示

①JSPを配置。

下記JSPを作成し「app」フォルダ(Webアプリケーション名)を作成し配置した。

C:\tomcat\webapps\app\hello.jsp

hello.jsp
<%@ page contentType="text/html;charset=Shift_JIS" %>

<html>
<body>
<h1>Hello JSP!</h1>

<%
out.println(new java.util.Date());
%>

</body>
</html>

②Tomcat起動

C:\tomcat\bin\startup.bat を実行。

■結果
appフォルダが作成される。
C:\tomcat\work\Catalina\localhost\app

③URL開く

■結果その1
JSPがサーブレット変換&コンパイルされ、Java、Classファイルが作成される。

C:\tomcat\work\Catalina\localhost\app\org\apache\jsp\hello_jsp.java
C:\tomcat\work\Catalina\localhost\app\org\apache\jsp\hello_jsp.class

hello_jsp.java
/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/9.0.46
 * Generated at: 2021-05-22 02:16:07 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

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

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

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

    if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS");
        return;
      }
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=Shift_JIS");
      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("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<body>\r\n");
      out.write("<h1>Hello JSP!</h1>\r\n");
      out.write("\r\n");

out.println(new java.util.Date());

      out.write("\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

■結果その2
hello_jsp.classが実行され、以下がブラウザに表示される。
hello_jsp.png

処理の流れ

クライアント側:URLを開く(リクエストを送る) 
サーバ側:サーブレット変換&コンパイル
サーバ側:クラスファイル実行
クライアント側:ブラウザに結果が表示される(レスポンスを受け取る)

サーバ側をもう少し詳しく

①サーブレットへ変換される(hello.jsp → hello_jsp.java)
②コンパイルしクラスファイルが生成される(hello_jsp.java → hello_jsp.class)
③クラスファイルの実行
④インスタンス化(jspInit()実行)
⑤インスタンス実行(_jspService()実行。リクエストが渡される)※2回目以降のリクエストでは⑤から処理が始まる。インスタンス使い回すため
⑥レスポンスを返す(_jspService()実行結果)

※サーブレットに定義されているメソッドについて
public void jspInit() インスタンス化された時のみ
public void _jspService() リクエストがある度に
pubic void jspDestroy() オブジェクトが破棄される時のみ

まとめ

JSPの作成~表示までを見てみた。
「Javaのコード」が埋め込まれたHTMLファイルがJSP。なのでJavaを実行する必要がある。そのためにまずはJSP→Javaに変換し(サーブレット)、コンパイル及び実行する。
その結果、「JavaのコードではなくJavaの実行結果が」埋め込まれたHTMLが作成され、それが画面表示される。※HTMLは暗黙オブジェクト「out」に入ってる。これがそのままクライアント側への出力となる。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?