首页 > 编程语言 >Tomcat源码解析(一)

Tomcat源码解析(一)

时间:2024-03-21 17:57:01浏览次数:23  
标签:解析 String Tomcat 源码 str context apache null log

一、Apache Tomcat源码环境构建

官网:https://tomcat.apache.org/

二、Maven环境搭建

1、打开IEDA导入项目,然后在项目中创建一个新的pom.xml文件,里面的内容为:

<?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>apache-tomcat</artifactId>
  <version>8.5.99</version>
  <build>
    <finalName>apache-tomcat</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>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

2、然后设置项目为Maven项目,选中pom.xml文件,鼠标右点。选择 Add as Maven Project .

3.导入项目需要的依赖jar包
依赖包下载链接:https://download.csdn.net/download/m0_37928279/89005924

 三、项目启动异常项

1.输出日志中文乱码

1.修改org.apache.jasper.compiler.Localizer#getMessage(java.lang.String)方法,添加标红部分。

  public static String getMessage(String errCode) {
        String errMsg = errCode;
        try {
            if (bundle != null) {
                errMsg = bundle.getString(errCode);
            }
        } catch (MissingResourceException e) {
        }
        try{
            errMsg = new String(errMsg.getBytes("ISO-8859-1"),"UTF-8");
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }
        return errMsg;
    }
2.修改org.apache.tomcat.util.res.StringManager#getString(java.lang.String),添加标红部分

public String getString(String key) {
        if (key == null) {
            String msg = "key may not have a null value";
            throw new IllegalArgumentException(msg);
        }

        String str = null;

        try {
            // Avoid NPE if bundle is null and treat it like an MRE
            if (bundle != null) {
                str = bundle.getString(key);
                str = new String(str.getBytes("ISO-8859-1"),"UTF-8");
            }
        } catch (MissingResourceException mre) {
            // bad: shouldn't mask an exception the following way:
            // str = "[cannot find message associated with key '" + key +
            // "' due to " + mre + "]";
            // because it hides the fact that the String was missing
            // from the calling code.
            // good: could just throw the exception (or wrap it in another)
            // but that would probably cause much havoc on existing
            // code.
            // better: consistent with container pattern to
            // simply return null. Calling code can then do
            // a null check.
            str = null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return str;
    }

2.不支持JSP问题

 1 修改org.apache.catalina.startup.ContextConfig类中的configureStart方法,添加第17行代码。
 2 
 3 protected synchronized void configureStart() {
 4         // Called from StandardContext.start()
 5 
 6         if (log.isTraceEnabled()) {
 7             log.trace(sm.getString("contextConfig.start"));
 8         }
 9 
10         if (log.isTraceEnabled()) {
11             log.trace(sm.getString("contextConfig.xmlSettings", context.getName(),
12                     Boolean.valueOf(context.getXmlValidation()), Boolean.valueOf(context.getXmlNamespaceAware())));
13         }
14 
15         webConfig();
16         //添加JSP解析器
17         context.addServletContainerInitializer(new JasperInitializer(),null);
18         if (!context.getIgnoreAnnotations()) {
19             applicationAnnotationsConfig();
20         }
21         if (ok) {
22             validateSecurityRoles();
23         }
24 
25         // Configure an authenticator if we need one
26         if (ok) {
27             authenticatorConfig();
28         }
29 
30         // Dump the contents of this pipeline if requested
31         if (log.isTraceEnabled()) {
32             log.trace("Pipeline Configuration:");
33             Pipeline pipeline = context.getPipeline();
34             Valve valves[] = null;
35             if (pipeline != null) {
36                 valves = pipeline.getValves();
37             }
38             if (valves != null) {
39                 for (Valve valve : valves) {
40                     log.trace("  " + valve.getClass().getName());
41                 }
42             }
43             log.trace("======================");
44         }
45 
46         // Make our application available if no problems were encountered
47         if (ok) {
48             context.setConfigured(true);
49         } else {
50             log.error(sm.getString("contextConfig.unavailable"));
51             context.setConfigured(false);
52         }
53 
54     }

 3.删除target目录,重启服务

 

标签:解析,String,Tomcat,源码,str,context,apache,null,log
From: https://www.cnblogs.com/double-efficiency/p/18087852

相关文章

  • 骨传导耳机哪个品牌质量比较好?精选五大热销机型全方位解析!
    近年来,随着越来越多的人认识到骨传导耳机,骨传导耳机也逐步增加,但由于消费者对其了解有限,在选择骨传导耳机的时候也是非常犹豫纠结,市场上的品牌虽然很多,但真正专业、性能卓越的却并不多见。许多中小网红品牌它们生产的产品存在都音质不佳、穿戴不舒适等问题,不仅影响了用户体验感......
  • H12-811题库(带解析,亲测高分可以通过)
    大家可以直接点赞+关注后,加作者微信(备注“CSDN”)就可以获取,微信在文章最后!808、[单选题]某公司网管要进行网络规划的时候,能够要让PC1访问PC2的数据包从G0/0/0口走(图上G0/0/2)。PC2访问PC1的数据包从G0/0/4口走(图上G0/0/0)。()A10.0.12.5255.255.255.25511.0.12.610.0......
  • windows11编译php源码
    1、下载php-sdk-binary-tools并解压gitclonehttps://github.com/Microsoft/php-sdk-binary-tools 2、下载VisualStudio2019并安装https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/history 3、下载php源代码https://windows.php.net/......
  • 关于tomcat打不开 跳出弹窗显示指定服务未安装解决方法详细流程
    关于tomcat打不开跳出弹窗显示指定服务未安装解决方法详细流程:https://blog.csdn.net/ttwxd/article/details/126771143?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171098615116777224466432%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&re......
  • Tomcat 9.0 conf server.xml sample
    C:\ProgramFiles\ApacheSoftwareFoundation\Tomcat9.0\conf\server.xml <Connectorprotocol="HTTP/1.1"port="8080"maxThreads="200"connectionTimeout="20000"......
  • Java 8 内存管理原理解析及内存故障排查实践
    作者:vivo互联网服务器团队- ZengZhibin介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,介绍各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时有一个明确的思路和方向。一、背景Java是一种流行的编程语言,可......
  • 基于java+springboot+vue实现的电影院选票系统(文末源码+Lw+ppt)23-467
    摘要时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,电影院选票系统当然不能排除在外。电影院选票系统是在实际应用和软件工程的开发原理之上,运用java语言,前台Vue框架以及后台SpringBoot框架进行开发。首先要进行需求分析,分析出电......
  • 基于java+springboot+vue实现的智慧养老院管理系统(文末源码+Lw+ppt)23-490
    摘 要智慧养老院管理系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从三个对象:由管理员和家属、护工来对系统进行设计构建。主要功能包括:个人信息修改,对家属信息、护工信息、老人入住、外出报备、退房登记、每月餐饮......
  • 基于java+springboot+vue实现的学生管理系统(文末源码+Lw+ppt)23-486
    摘  要学生管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。与安卓,iOS相比较起来,学生管理系统在流畅性,续航能力,等方方面面都有......
  • 毕业设计——基于facenet实时人脸识别系统的设计与实现+源码+综述
    如需完整源码,可以联系博主获取技术路径:opencv+mtcnn+facenet+python+tensorflow,实现局域网连接手机摄像头,对目标人员进行实时人脸识别一、引言随着信息技术的飞速发展,人脸识别技术已成为身份验证、安全监控等领域的核心技术之一。实时人脸识别系统,以其高效、准确的特点,......