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;
laif (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
- 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/
- 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
- 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.
-
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 -
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: