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

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.rhkb.cn/news/662.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程(全61集) Element对象与Fiber对象 在 React 中,Element 对象 和 Fiber 对象 是核心概念,用于实现 React 的高效渲染和更新机制。以下是它们的详细解读: 1. Element 对象 定…

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句…

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题,可以利用Github Action将需要的镜像转存到阿里云私有仓库,然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址:使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…

数据结构-排序课后题

今天我们来简单的说说关于排序的一些课后练习题. 对应的知识点博客: LINK. 目录 1. 每一单趟都能确定一个数字的最终位置的排序2. 根据序列变化确定排序方式3. 排序顺序对哪些排序效率影响不大?4. 对有序序列排序最费力的排序方式是什么?5. 对接近有序序列排序最快的排序方式…

MySQL 架构

MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器的连接器。整体架构图如下所⽰: MySQL Connectors:为使⽤…

【数据结构】二叉搜索树

目录 1. 二叉搜索树的概念 2. 二叉搜索树的性能分析 3.二叉搜索树的实现 3. 1.二叉搜索树的插入 3.2. 二叉搜索树的查找 3.3. 二叉搜索树的删除 3.4. 二叉搜索树的实现代码 4. 二叉搜索树key和key/value两种使用场景 4.1 key搜索场景: 4.2 key/value搜索场…

【C++】string的关系运算与比较分析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯基础知识:C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 💯代码解析与扩展代码例一:相等比较代码解析输出 代码例二&a…

高性能网络模式:Reactor 和 Proactor

Reactor Reactor 采用I/O多路复用监听事件,收到事件后,根据事件类型分配给某个进程/线程。 实际应用中用到的模型: 单 Reactor 单进程 单 Reactor 多线程 优点:能充分利用多核CPU性能。 缺点:存在多线程竞争共享资源…

有限元分析学习——Anasys Workbanch第一阶段笔记(10)桌子载荷案例分析_实际载荷与均布载荷的对比

目录 0 序言 1 桌子案例 2 模型简化 3 方案A 前处理 1)分析类型选择 2)材料加载 3)约束、载荷及接触 4)控制网格(网格大小需要根据结果不断调整) 初始计算结果 加密后计算结果 4 方案B、C 前处理 1)分析…

用HTML + CSS实现太极图

目录 一、效果图 二、实现思路 三、完整代码 四、总结 一、效果图 如图所示,太极图一半为黑色(代表阴),另一半为白色(代表阳)。这两部分相互环绕,形成一种流动的、旋转的感觉。 二、实现思…

【Rust自学】11.7. 按测试的名称运行测试

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试,就将测试的名称(一个或多个)作为cargo test的…

标准应用 | 2025年网络安全服务成本度量实施参考

01 网络安全服务成本度量依据相关新变化 为了解决我国网络安全服务产业发展中面临的服务供需两方对于服务成本组成认知偏差较大、网络安全服务成本度量缺乏依据的问题,中国网络安全产业联盟(CCIA)组织北京赛西科技发展有限责任公司、北京安…

HAMi + prometheus-k8s + grafana实现vgpu虚拟化监控

最近长沙跑了半个多月,跟甲方客户对了下项目指标,许久没更新 回来后继续研究如何实现 grafana实现HAMi vgpu虚拟化监控,毕竟合同里写了需要体现gpu资源限制和算力共享以及体现算力卡资源共享监控 先说下为啥要用HAMi吧, 一个重要原…

某地武警海警总队建筑物自动化监测

1. 项目概述 该项目分布于三个不同的地级市,都是位于临海港口的码头,由中国武警海警总队驻扎,守卫人民安全。 1号建筑物自动化监测系统项目由一道伸缩缝划分为两个监测单元,建筑物为三层混合结构,采用350mm厚石墙、2…

负载均衡原理及算法

什么是负载均衡? 负载均衡 指的是将用户请求分摊到不同的服务器上处理,以提高系统整体的并发处理能力以及可靠性。负载均衡服务可以有由专门的软件或者硬件来完成,一般情况下,硬件的性能更好,软件的价格更便宜&#x…

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …

LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略

LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略 目录 LanceDB的简介 1、LanceDB的主要特性 2、为何选择 LanceDB? LanceDB的安装和使用方法 1、安装方法 Javascript/Typescript Python 2、使用方法 Javascript Python LanceDB…

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

Java面试核心知识4

公平锁与非公平锁 公平锁(Fair) 加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得 非公平锁(Nonfair) 加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾…

探索AGI:智能助手与自我赋能的新时代

目录 1 AGI1.1 DeepMind Levels(2023年11月)1.2 OpenAI Levels(2024年7月)1.3 对比与总结1.4 AGI可能诞生哪里 2 基于AI的智能自动化助手2.1 通用型大模型2.2 专业的Agent和模型工具开发框架2.3 编程与代码生成助手2.4 视频和多模态生成2.5 商…