Le code source débogage tomcat9.0.19

L'utilisation de cet environnement:

  • IntelliJ IDEA
  • Apache Maven 3.3.9
  • jdk1.8

1. Vérifiez la version de Tomcat

TOMCAT_HOME $ s bin \ Version.bat

D:\Program_Files\apache-tomcat-9.0.19\bin>version.bat
Using CATALINA_BASE:   "D:\Program_Files\apache-tomcat-9.0.19"
Using CATALINA_HOME:   "D:\Program_Files\apache-tomcat-9.0.19"
Using CATALINA_TMPDIR: "D:\Program_Files\apache-tomcat-9.0.19\temp"
Using JRE_HOME:        "D:\Program Files\Java\jdk1.8.0_77"
Using CLASSPATH:       "D:\Program_Files\apache-tomcat-9.0.19\bin\bootstrap.jar;D:\Program_Files\apache-tomcat-9.0.19\bin\tomcat-juli.jar"
Server version: Apache Tomcat/9.0.19
Server built:   Apr 12 2019 14:22:48 UTC
Server number:  9.0.19.0
OS Name:        Windows 10
OS Version:     10.0
Architecture:   amd64
JVM Version:    1.8.0_77-b03
JVM Vendor:     Oracle Corporation
D:\Program_Files\apache-tomcat-9.0.19\bin>

Tel qu'il est utilisé ici, il est JDK1.8, sinon JDK1.8, vous devez voir tomcat compatible, et choisir leurs propres versions

2. Télécharger Source

Selon leur version de Tomcat, télécharger le correspondant code source

Sélectionnez l'option J'utilise ici tomcat9, sélectionnez Archives version correspondante de tomcat,

Une fois le téléchargement de décompression complète, apache-tomcat-9.0.19-src

3. Créer une structure de projet

  • Créé dans le lecteur D « D: \ tomcat9.0.19 dossier », puis copiez les fichiers décompressés dans le répertoire, la création de répertoire « catalina-home »

  • Copier "apache-tomcat-9.0.19-src \ conf", le répertoire suivant "catalina-home"

  • Créer un "D: \ tomcat9.0.19 \ pom.xml fichier"

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>Tomcat9.0.19</artifactId>
        <name>Tomcat 9.0 Study</name>
        <version>1.0</version>
        <packaging>pom</packaging>
     
        <modules>
            <module>apache-tomcat-9.0.19-src</module>
        </modules>
    </project>
    
  • Créer un "D: \ tomcat9.0.19 \ apache-tomcat9.0.19-src \ pom.xml fichier"

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>Tomcat9.0</artifactId>
        <name>Tomcat9</name>
        <version>9.0</version>
    
        <build>
            <finalName>Tomcat9</finalName>
            <sourceDirectory>java</sourceDirectory>
            <resources>
                <resource>
                    <directory>java</directory>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3</version>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.ant</groupId>
                <artifactId>ant</artifactId>
                <version>1.9.5</version>
            </dependency>
            <dependency>
                <groupId>org.apache.ant</groupId>
                <artifactId>ant-apache-log4j</artifactId>
                <version>1.9.5</version>
            </dependency>
            <dependency>
                <groupId>org.apache.ant</groupId>
                <artifactId>ant-commons-logging</artifactId>
                <version>1.9.5</version>
            </dependency>
            <dependency>
                <groupId>javax.xml.rpc</groupId>
                <artifactId>javax.xml.rpc-api</artifactId>
                <version>1.1</version>
            </dependency>
            <dependency>
                <groupId>wsdl4j</groupId>
                <artifactId>wsdl4j</artifactId>
                <version>1.6.2</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.jdt.core.compiler</groupId>
                <artifactId>ecj</artifactId>
                <version>4.4</version>
            </dependency>
        </dependencies>
    </project>
    

La structure du répertoire final:

Administrator@git MINGW64 /d/tomcat9.0.19
$ ls -l                                                                                                                 total 6
drwxr-xr-x 1 Administrator 197121   0 3月  30 17:50 apache-tomcat-9.0.19-src
drwxr-xr-x 1 Administrator 197121   0 3月  30 17:41 catalina-home
-rw-r--r-- 1 Administrator 197121 533 3月  30 17:27 pom.xml

Administrator@git MINGW64 /d/tomcat9.0.19
$ ls -l catalina-home/                                                                                                  total 8
drwxr-xr-x 1 Administrator 197121 0 3月  30 17:38 conf

4. Le projet dans l'IDEA

5. Compile

Car ici est l'utilisation de JDK1.8, vous devez commenter le code, ou une erreur facile:

compilation:

6. Run

1) Création d'application

options de configuration: vm

-Dfile.encoding=UTF-8 -Dcatalina.home=catalina-home -Dcatalina.base=catalina-home -Djava.endorsed.dirs=catalina-home/endorsed -Djava.io.tmpdir=catalina-home/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=catalina-home/conf/logging.properties

Le procédé d'addition du code de test pour l'essentiel entre le Bootstrap:

 System.out.println("======================Tomcat Study======================");

Voici quelques journal de démarrage:

======================Tomcat Study======================
30-Mar-2020 17:38:32.009 警告 [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [D:\tomcat9.0.19\catalina-home\lib], exists: [false], isDirectory: [false], canRead: [false]
30-Mar-2020 17:38:32.017 警告 [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [D:\tomcat9.0.19\catalina-home\lib], exists: [false], isDirectory: [false], canRead: [false]
30-Mar-2020 17:38:32.017 警告 [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [D:\tomcat9.0.19\catalina-home\lib], exists: [false], isDirectory: [false], canRead: [false]
30-Mar-2020 17:38:32.017 警告 [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [D:\tomcat9.0.19\catalina-home\lib], exists: [false], isDirectory: [false], canRead: [false]

Mais commencer le journal sera brouillée, la solution:

Pourquoi est - il brouillé:
raison: les causes de non - concordance de codage général chinois, par le suivi, trouvé ResourceBundle lire org \ apache \ catalina \ aucun résultat de l' utilisation de décodage UTF8 pour le démarrage \ fichier LocalStrings_zh_CN.properties;
Solution: Modifier org.apache.tomcat .util.res.StringManager fonction getString classe;
la

if (bundle != null) {
str = bundle.getString(key);
}

modifié

if (bundle != null) {
str = new String(bundle.getString(key).getBytes(“ISO-8859-1”), “UTF-8”);
}

Exécutez à nouveau, tout est normal

Les liens de référence: http://www.itgather.com/archives/54

2) Expérience

  1. Créez un fichier "demo \ index.html" dans le "catalina-home \ webapps" Répertoire:
<html>
<head><title>Tomcat9.0.19_Test</title></head>
<body>
    
  <h1>Hello World!!!</h1> 
  
</body>
</html>

Accès: http://127.0.0.1:8080/demo/

  1. Créez un fichier "demo \ index.jsp" dans le "catalina-home \ webapps" Répertoire:
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<html>
<head><title>Test-title</title></head>
<body>
<%
    request.setCharacterEncoding("utf-8");
    String method = request.getMethod() ;   // 取得提交方式
    String ip = request.getRemoteAddr() ;   // 取得客户端的IP地址
    String path = request.getServletPath() ;    // 取得访问路径
    String contextPath1= request.getContextPath() ; // 取得上下文资源名称
    String contextPath2 = getServletContext().getContextPath() ;// 取得上下文资源名称
    String realPath=getServletContext().getRealPath("/");//取得虚拟目录所对应的真实路径
%>
<h3>请求方式:<%=method%></h3>
<h3>IP地址:<%=ip%></h3>
<h3>访问路径:<%=path%></h3>
<h3>上下文名称1:<%=contextPath1%></h3>
<h3>上下文名称2:<%=contextPath2%></h3>
<h3>真实路径:<%=realPath%></h3>
</body>
</html>

Accès: http://127.0.0.1:8080/demo/index.jsp

Debugger

Après avoir été compilé génère index.jsp « index_jsp.java » et fichier « index_jsp.class », et ce qui suit:

Administrator@git MINGW64 /d/tomcat9.0.19/catalina-home/work/Catalina/localhost/demo/org/apache/jsp
$ pwd
/d/tomcat9.0.19/catalina-home/work/Catalina/localhost/demo/org/apache/jsp

Administrator@git MINGW64 /d/tomcat9.0.19/catalina-home/work/Catalina/localhost/demo/org/apache/jsp
$ ls index_jsp.java
index_jsp.java

Administrator@git MINGW64 /d/tomcat9.0.19/catalina-home/work/Catalina/localhost/demo/org/apache/jsp
$ ls index_jsp.class
index_jsp.class

Voici ce fichier « index_jsp.java »:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/9.0.x-dev
 * Generated at: 2020-03-30 10:23:23 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 index_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, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 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=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("\r\n");
      out.write("<html>\r\n");
      out.write("<head><title>Test-title</title></head>\r\n");
      out.write("<body>\r\n");

    request.setCharacterEncoding("utf-8");
    String method = request.getMethod() ;   // 取得提交方式
    String ip = request.getRemoteAddr() ;   // 取得客户端的IP地址
    String path = request.getServletPath() ;    // 取得访问路径
    String contextPath1= request.getContextPath() ; // 取得上下文资源名称
    String contextPath2 = getServletContext().getContextPath() ;// 取得上下文资源名称
    String realPath=getServletContext().getRealPath("/");//取得虚拟目录所对应的真实路径

      out.write("\r\n");
      out.write("<h3>请求方式:");
      out.print(method);
      out.write("</h3>\r\n");
      out.write("<h3>IP地址:");
      out.print(ip);
      out.write("</h3>\r\n");
      out.write("<h3>访问路径:");
      out.print(path);
      out.write("</h3>\r\n");
      out.write("<h3>上下文名称1:");
      out.print(contextPath1);
      out.write("</h3>\r\n");
      out.write("<h3>上下文名称2:");
      out.print(contextPath2);
      out.write("</h3>\r\n");
      out.write("<h3>真实路径:");
      out.print(realPath);
      out.write("</h3>\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);
    }
  }
}

Ces objets intégrés est une page JSP, en plus intégrées dans les objets de requête et de réponse, des paramètres du processus

    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;

Voici leur affectation:

      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;

On voit que les deux sont affectés à la pageContext par un procédé correspondant.

En fait, nous pouvons imprimer ces objets intégrés sur l'écran:

test.jsp

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>	<!-- 导入java.util包 -->
<html>
<head><title>PageScope</title></head>
    <body>
            <h4>request:<%=request%></h4>
            <h4>session:<%=session%></h4>
            <h4>application:<%=application%></h4>
            <h4>response:<%=response%></h4>
            <h4>out:<%=out%></h4>
            <h4>config:<%=config%></h4>
            <h4>page:<%=page%></h4>

            <h4>pageContext:<%=pageContext%></h4>
            <h4>getException:<%=pageContext.getException()%></h4>
            <h4>getPage:<%=(pageContext.getPage()==page)%></h4>
            <h4>getRequest:<%=(pageContext.getRequest()==request)%></h4>
            <h4>getResponse:<%=(pageContext.getResponse()==response)%></h4>
            <h4>getSession:<%=(pageContext.getSession()==session)%></h4>
            <h4>getServletConfig:<%=(pageContext.getServletConfig()==config) %></h4>
            <h4>getServletContext:<%=(pageContext.getServletContext()==application)%></h4>
    </body>
</html>

Le résultat:

Revenez à déboguer le problème, vous voulez debug « index_jsp.java », vous devez créer un dossier « org / apache / jsp », puis déplacez le fichier dans le dossier, les points d'arrêt marqués peuvent commencer le débogage:

3) Note

JSP résoudra l'erreur par défaut

  1. Phenomenon:
Type Exception Report

Message java.lang.NullPointerException

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: java.lang.NullPointerException
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:638)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:514)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
Root Cause

java.lang.NullPointerException
	org.apache.jsp.index_jsp._jspService(index_jsp.java:165)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
Note The full stack trace of the root cause is available in the server logs.

  1. L'analyse des problèmes et des solutions

    La raison est que nous avons commencé directement org.apache.catalina.startup.Bootstrap quand il n'y a pas de charge org.apache.jasper.servlet.JasperInitializer, afin de ne pas compiler JSP. La solution est dans la source de tomcat org.apache.catalina.startup.ContextConfig initialiser manuellement le JSP
    analyseur: ----------------
    Avertissement: Cet article est le yehong1225 de blogueurs RPSC « l'article original, suivez le CC 4.0 accord du droit d'auteur BY-SA, reproduite, s'il vous plaît joindre le lien source d' origine et cette déclaration.
    Lien original: https://blog.csdn.net/yekong1225/article/details/81000446

  2. Les tests sont à nouveau normaux

4) Passer au répertoire Tomcat, les options VM peuvent être modifiés comme suit

-Dcatalina.home=apache-tomcat-9.0.19-src -Dcatalina.base=apache-tomcat-9.0.19-src
-Djava.endorsed.dirs=apache-tomcat-9.0.19-src/endorsed -Djava.io.tmpdir=apache-tomcat-9.0.19-src/temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=apache-tomcat-9.0.19-src/conf/logging.properties

Les liens de référence:

Je suppose que tu aimes

Origine www.cnblogs.com/cosmos-wong/p/12608165.html
conseillé
Classement