学技术步骤,(tomcat举例)jar包api手写tomcat静态资源基础服务器

server/2025/1/16 22:33:01/

1.看有哪些包,能用本地离线的包就使用离线包

2.尽量不要使用配置文件(先不用),能用api就用api,

因为配置文件只是文本,其实要的只是配置文件里的参数,

这些参数最后肯定还是要给到这些api去处理的,

肯定是先有api,才有的配置文件,

3.最重要的是搞清楚这个技术解决了什么问题

线程分配,并发管理,路径匹配,其实我们都能用socket和srervle自己实现,

但是我们选择用技术。。。。

因为好用

当时的tomcat搭配模板引擎技术jsp一起用,现在不用了

前后端分离,后端只关心数据,前段是数据显示和界面

jsp是数据和界面绑在一块变成html的字符串通过socket给浏览器发过去,什么前端,没有前端

4.这个技术实现了什么规范

比如Tomcat实现了javaEE的规范,那规范了点什么,我们也就要搞清楚

比如Tomcat要对接servlet,直接把request对象给到对应的servlet

而不是在servlet调Tomcat的api去取请求对象

这就是JavaEE规范的,但是tomcat也要使用者配合

这就是下面的tomcat的使用要求了

5.tomcat的使用要求

使用tomcat的,要继承java的servlet包提供的HTTPserlet这个类,并重写doservice方法

6.这个技术的主要对象,api,属性 是什么,这几个主要对像之间的包含关系,一对一,一对多,多对多的关系

这很重要,也很有效:读代码和写代码也要紧盯对象和api和对象之间的关系,会让你写代码快,理解也快

其实idea可以看反编译的.class文件,想看什么对象,直接点进去看,其实比api文档方便,api文档看属性很麻烦,看源码可以直接看属性,类比前端,属性更重要,方法只是对属性的操作,当然不是完全正确的比喻,但是源码看属性,api看事件和插槽和数据看啥都行。。。。

可以分析出几个主要对象和对象的主要的api,和主要属性

7.对象一般都是包含关系,画个业务模型图就都有了

注意:这个一般叫架构,可以看架构概述,一般在写给开发人员的模块里找,是为了留口让你改源码用的,可以把jar翻译成代码,改一下想改的地方,编译之后再把jar包扔回去

这个结论是写前端的组件写出来的感觉

用在后端也没有错

业务模型上来说

对象之间的关系基本一对一,一对多,多对多,

一对一:对象的属性一个对象

一对多:对象的属性一个对象集合

要是哪天混了,就想一想封装组件时留的口,也就是props

组件里,props都是给方法或界面用的,或者给子组件,

Java里,这些定义的属性都是给对象的api用的,或者是给对象里的对象属性用的

8.为什么Server里的属性搜都搜不出来,标准实现类也搜不到,比如

    • 在这个StandardServer类中,确实没有名为className的属性。从代码结构来看,这个类主要管理服务器相关的资源和操作。
    • 它包含了如globalNamingResources(用于管理命名资源)、port服务器监听的端口号)、address服务器监听的地址)、services(与服务器关联的服务数组)等属性。
  1. 可能的原因
    • 功能定位:这个类的功能主要是围绕服务器的运行时状态、资源管理、生命周期等方面,不需要一个名为className的属性。例如,它通过portaddress属性来确定服务器的监听位置,通过services来管理与服务器相关的服务。
    • 设计模式:从类的继承关系(extends LifecycleMBeanBase implements Server)来看,它遵循特定的设计模式,在这种模式下,没有必要引入className这样的属性。例如,它继承LifecycleMBeanBase来遵循生命周期管理的模式,实现Server接口来满足服务器相关的功能规范。

如果在其他地方有对className的需求,可能需要从外部传入或者通过其他相关类来管理,而不是在这个StandardServer类中直接定义。

9.主要对象的架构和代码上的联系

1.只new一个Tomcat对象,里面基本为空

2.根据架构,我们发现Connector和Tomcat对象中间有好几层

且我们看到tomcat基本为空

tomcat.getConnector()我们仍然能获取到,看上图

这个在我之前理解,这是与架构不符的,应该在service里获取呀

但是打开上面的tomcat对象,发现tomcat对象的内容改变了,多了好多东西

发现得到的对象就是tomcat里的

这可太符合架构了。。。。

3.再看一下host呢

又被我猜到了,就是这个host,这个是Host的标准实现类

这个跟架构简直一摸一样

4.从tomcat对象上获取对象就只能到这了,这是tomact方法的极限了,但是根据架构,如果我们想用api去配servlet的路径和姓名,在次之前还要配Context的路径,但是不知道用哪个api呀,这个时候就去debugge的host的对象里看,看里面有什么

发现并不是很明显,但是我们要清楚我们在做的是让tomca能认识我们的

看一下官网的api,看不懂,但是通过架构猜,Context是在Host的孩子数组里,

那就找api吧,要看api是不是为两个对象建立了联系,一般就是把一个对象放到另一个对象里,一般从对象的api里判断

比如

host提供了对这个数组的增删改查,又和我们猜的架构(业务模型)差不多,

更重要的一点是Containner是所有容器组件的父类,

哈哈哈,被我懂完了

高兴太早了,居然空指针,好羞耻,

看一下,

应该是没有设置应用(上下文对象)的路径,深一层degugge看出来的

配一下,就好了

接下来配我们的url,也就是我们真正的资源定位

猜测应该在这两个属性上

servlet对象放孩子数组里,然后去配mapping映射

结果

根据上图,直接获取host会导致没有连接器的创建,根据架构,连接器是和engine平级的

手动加了连接器之后,还需要配连接器的监听端口,不然监听端口的默认值是-1

这是tomcat调用添加context的语句的源码,

这个才算进了servlet

其它的都差不多,就是为什么要加一个生命周期监听器呢

10.进了servlet之后响应(搞错了,别看)

6.在重写的方法里加东西,也就是响应回去,直接200

响应什么,什么就是页面源码,这就好办了,为什么这样说呢,忘了就去看一下xml那一部分,涉及到浏览器打开文件。。。。根据浏览器会个根据格式解析他认识的文件格式,所以现在尝试相应一个图片回去,因为文本格式的太简单了

1.静态资源响应:

1.在请求里请求静态资源,文件等

执行getRealPath操作之前,Tomcat的相关资源已经启动才行

String rootPath = context.getRealPath("/");

public class MyTomcatStart {public static void main(String[] args) throws LifecycleException {Tomcat tomcat = new Tomcat();Host host = tomcat.getHost();//连接器获取与配置Connector connector = new Connector();connector.setPort(8888);tomcat.setConnector(connector);
//        Context context = tomcat.addContext(host, "/myapp", "C://");//应用路径配置,Context context = new StandardContext();context.setPath("/myapp");//Web应用根目录的实际路径,指定静态资源的根目录context.setDocBase("D:/学习资料/图片");context.setName("/myapp");context.addLifecycleListener(new Tomcat.FixContextListener());host.addChild(context);//动态资源请求的servlettomcat.addServlet(context, "myServlet", "org.example.servlet.MyServlet" );//静态资源请求的servlet ,把所有未被其他Servlet处理的请求映射到DefaultServlet,从而处理静态资源DefaultServlet defaultServlet = new DefaultServlet();tomcat.addServlet(context, "DefaultServlet", "org.apache.catalina.servlets.DefaultServlet" );context.addServletMappingDecoded("/myServlet", "myServlet");context.addServletMappingDecoded("/*", "DefaultServlet");tomcat.start();tomcat.getServer().await();}
}
http://localhost:8888/myapp/1_overview.png

有点难史,但是总的思路是

1.配置上下文的根目录,也就是告诉tomacat,请求myapp的静态资源,要到哪里找然后吐出去

2.将tomcat提供的处理静态资源请求的org.apache.catalina.servlets.DefaultServlet放到context的孩子数组
 
3.给处理静态资源请求的servlet配上请求的url
//静态资源请求的servlet ,把所有未被其他Servlet处理的请求映射到DefaultServlet,从而处理静态资源

4..先进到处理静态资源请求的servlet里,然后再调请求的文件路径
5.请求的静态资源的路径的处理,

没什么好处理的,反正很难调,记住就完了。。。

但是myapp后面的一部分,基本上就是请求的文件内容了,你只要加,就找不到,除非你的根目录那有相同的目录对应,

静态资源服务配置时,只要能进servlet,就直接在DefaultServlet源码里debuge去看要找的文件的路径是什么就好了,然在调,要么在你本地加目录,要么在浏览器台调url,没什么其它好办法。


http://www.ppmy.cn/server/158931.html

相关文章

2_CSS3 背景 --[CSS3 进阶之路]

CSS3 中的背景属性提供了许多强大的功能来增强网页设计,包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…

第三章:HTML的字符实体,meta标签以及全局属性

目录 一、字符实体 二、meta元信息 三、全局属性 四、总结 一、字符实体 在 HTML 中&#xff0c;某些字符是预留的&#xff0c;不能直接使用。例如&#xff0c;小于号&#xff08;<&#xff09;和大于号&#xff08;>&#xff09;会被浏览器误认为是标签&#xff0c…

MYSQL的第一次作业

目录 前情提要 题目解析 连接并使用数据库 创建employees表 创建orders表 创建invoices表 ​查看建立的表 前情提要 需要下载mysql并进行配置&#xff0c;建议下载8.0.37&#xff0c;详情可见MySQL超详细安装配置教程(亲测有效)_mysql安装教程-CSDN博客 题目解析 …

简识MySQL中ReadView、RC、RR的关系

一、背景 在MySQL中&#xff0c;ReadView是事务进行快照读操作时生成的读视图&#xff0c;它用于确定哪些数据对当前事务是可见的。ReadView的生成和属性受MySQL事务隔离级别的影响&#xff0c;特别是RC&#xff08;Read Committed&#xff0c;读已提交&#xff09;和RR&#x…

Elasticsearch实战应用:从基础到高级

引言 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够快速地存储、搜索和分析大量数据。它广泛应用于日志分析、全文搜索、实时数据分析等场景。本文将深入探讨 Elasticsearch 的实战应用&#xff0c;涵盖从基础概念到高级应用的各个方面。 1…

mysql 等保处理,设置wait_timeout引发的问题

&#x1f468;‍⚕ 主页&#xff1a; gis分享者 &#x1f468;‍⚕ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕ 收录于专栏&#xff1a;运维工程师 文章目录 前言问题处理 前言 系统部署完成后&#xff0c;客户需要做二级等保&…

【Unity-Game4Automation PRO 插件】

Game4Automation PRO 插件 是一个用于 Unity 引擎 的工业自动化仿真工具&#xff0c;它提供了对工业自动化领域的仿真和虚拟调试支持&#xff0c;特别是在与工业机器人、生产线、PLC 系统的集成方面。该插件旨在将工业自动化的实时仿真与游戏开发的高质量 3D 可视化能力结合起来…

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…