【仿写tomcat】二、扫描java文件,获取带有@WebServlet注解的类

tomcat仿写

    • 项目结构
    • 扫描文件
    • servlet注解
    • map容器
    • servlet工具类
    • 启动类调用

项目结构

扫描文件之前当然要确定一下项目结构了,我这里的方案是tomcat和项目同级
在这里插入图片描述

项目的话就仿照我们平时使用的结构就好了,我们规定所有的静态资源文件都在webApp目录下存放。

扫描文件

这部分工作我们在仿写spring中已经做过了,我就直接沿用之前的方案了,与之前不同的是我们添加了定位webApp的方法,并且存储在这个工具类里面了,代码如下:

package com.tomcatServer.utils;import java.io.File;
import java.util.ArrayList;
import java.util.List;/*** 扫描工具类** @author tomcatProject.ez4sterben* @date 2023/08/15*/
public class ScanUtil {public static List<String> javaFiles = new ArrayList<>();public static String JAVA = ".java";public static String WEB_APP_PATH;public static String PROJECT_PATH;/*** 得到所有java文件** @param path 路径* @return {@link List}<{@link String}>*/public static List<String> getAllJavaFile(String path){getAllFile(new File(path));return javaFiles;}/*** 让web应用程序路径** @param root 根* @return {@link String}*/public static String getWebAppPath(String root){File directory = new File(root);if (directory.exists() && directory.isDirectory()) {findWebAppFolder(directory, "webApp");} else {System.out.println("Directory does not exist or is not a directory.");}return PROJECT_PATH;}/*** 找到web应用程序文件夹** @param directory        目录* @param targetFolderName 目标文件夹名称*/private static void findWebAppFolder(File directory, String targetFolderName) {File[] files = directory.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory() && file.getName().equals(targetFolderName)) {PROJECT_PATH = file.getParentFile().getAbsolutePath();WEB_APP_PATH = PROJECT_PATH + "\\webApp";} else if (file.isDirectory()) {findWebAppFolder(file, targetFolderName);}}}}/*** 获取所有文件** @param file 文件*/public static void getAllFile(File file){if (file.isFile()){if (file.toString().endsWith(JAVA)) {String javaPath = getJavaPath(file);javaFiles.add(javaPath);}}if (file.exists() && file.isDirectory()) {File[] files = file.listFiles();if (files != null) {for (File file1 : files) {getAllFile(file1);}}}}/*** 获取java路径** @param file 文件* @return {@link String}*/private static String getJavaPath(File file) {return file.toString().replace("\\",".").split("src.main.java.")[1].replace(".java","");}}

servlet注解

注解这里没什么好说的,自定义一个就行了

package com.tomcatServer.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** web servlet** @author tomcatProject.ez4sterben* @date 2023/08/15*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface WebServlet {String value() default "";
}

map容器

map容器就是存储servlet实例的地方

package com.tomcatServer.servlet;import java.util.HashMap;
import java.util.Map;/*** map存储** @author tomcatProject.ez4sterben* @date 2023/08/15*/
public class MapStore {public static Map<String,Class<?>> servletMap = new HashMap<>();
}

servlet工具类

目前工具类主要是两个方法,一个是判断java类是否有webservlet注解,另一个是初始化map容器的,将是servlet的类都丢进去,代码逻辑应该很好懂,不需要多说什么。

package com.tomcatServer.utils;import com.tomcatServer.annotation.WebServlet;
import com.tomcatServer.servlet.MapStore;import java.lang.reflect.InvocationTargetException;/*** servlet工具类** @author tomcatProject.ez4sterben* @date 2023/08/15*/
public class ServletUtil {/*** 是web servlet** @param className 类名* @return {@link Boolean}*/public static Boolean isWebServlet(String className){try {Class<?> aClass = Class.forName(className);WebServlet annotation = aClass.getAnnotation(WebServlet.class);if (annotation == null){return Boolean.FALSE;}} catch (ClassNotFoundException e) {throw new RuntimeException(e);}return Boolean.TRUE;}/*** 初始化servlet** @param className 类名*/public static void initServlet(String className){try {Class<?> aClass = Class.forName(className);String url = aClass.getAnnotation(WebServlet.class).value();if (url.startsWith("/")) {MapStore.servletMap.put(url,aClass);}else {MapStore.servletMap.put("/" + url,aClass);}} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}
}

启动类调用

package com.tomcatServer;import com.tomcatServer.utils.MapUtil;
import com.tomcatServer.utils.ScanUtil;import java.io.IOException;
import java.util.List;import static com.tomcatServer.utils.ScanUtil.getWebAppPath;/*** tomcat server启动类** @author tomcatProject.ez4sterben* @date 2023/08/15*/
public class Main {public static String ROOT;public static void main(String[] args) throws IOException {// 1.初始化根目录ROOT = System.getProperty("user.dir");// 2.获取webApp的位置String webAppPath = getWebAppPath(ROOT);// 3.获取所有带有@WebServlet注解的java文件,初始化servletList<String> allJavaFile = ScanUtil.getAllJavaFile(webAppPath);for (String s : allJavaFile) {if (MapUtil.isWebServlet(s)) {ServletUtil.initServlet(s);}}// 4.处理http请求}
}

到这里基本工作就做完了,下一篇将会带大家完成对http请求的处理

【仿写tomcat】三、通过socket读取http请求信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/99225.html

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

相关文章

qiiuzhiji4

本篇是从慧与离职后到2023年8月21日这段时间的经历 2023/7/31至2023/8/21 本篇初次写于2023年8月21日 从慧与离职后基本上就是在专心找工作了&#xff0c;但是有在这段时间找工作经历的人都明白&#xff0c;IT行业不复以往了。尤其是对于我这样的普通二本学历的人来说&#xff…

Ubuntu系统下搭建QtCreator开发环境详细过程(Qt简介;Linux下安装QtCreator)

关于Qt的相关介绍&#xff0c;可以参考QT从入门到实战x篇&#xff0c;Qt 5.9 C开发指南&#xff0c;对于重复部分&#xff0c;本栏目不做详细介绍。关于Linux的基础&#xff0c;本人将重新整理一个栏目&#xff0c;就叫Linux基础吧&#xff0c;有需要的可以后期关注下。 文章目…

发布python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api,以及安卓接入案例代码

python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api&#xff0c;以及原生安卓接入案例代码案例 源码地址:keyxh/newsapi: python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api&#xff0c;以及安卓接入案例代码 (github.com) 目录 1.环境配…

Fast DDS (2)

1、结构&#xff1a; Fast DDS的架构如下图所示&#xff0c;可以看到以下不同环境的层模型&#xff1a; 应用层&#xff1a;利用Fast DDS API 在分布式系统中实现通信的用户应用程序。Fast DDS层&#xff1a;DDS 通信中间件的稳健实现。它允许部署一个或多个 DDS 域&#xff…

leetcode303. 区域和检索 - 数组不可变(java)

前缀和数组的应用 区域和检索 - 数组不可变题目描述前缀和数组代码演示 区域和检索 - 数组不可变 难度 - 简单 原题链接 - 区域和检索 - 数组不可变 题目描述 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 righ…

Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术教程

详情点击公众号链接&#xff1a;Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术教程 Noah-MP 5.0模型&模型所需环境的搭建 陆面过程的主要研究内容&#xff08;陆表能量平衡、水循环、碳循环等&#xff09;&#xff0c;陆面过程研究的重要性。 图 1 陆面…

MySQL语法及常用数据类型

一、SQL语言概述 对数据库进行查询和修改操作的语言叫做SQL。SQL的含义就是结构化查询语言&#xff08;Structured Query Language&#xff09;。SQL包含以下4个部分&#xff1a; 1、数据定义语言&#xff08;DDL&#xff09;&#xff1a;DROP、CREATE、ALTER等语句&#xff…

jenkins 日志输出显示时间戳的方式

网上很多方式比较片面&#xff0c;最新版插件直接使用即可无需更多操作。 使用方式如下&#xff1a; 1.安装插件 Timestamper 2.更新全局设置 系统设置-找到 Timestamper 勾选 Enabled for all Pipeline builds 也可修改时间戳格式。 帮助信息中显示 When checked, timesta…

ARM--day5(C语言点灯实验、总线、串口通信信息、串口通讯协议)

函数分装实现点灯 gpio.c: #include "gpio.h" //函数功能&#xff1a;GPIO引脚初始化操作 //参数1&#xff1a;GPIO组号 //参数2&#xff1a;引脚编号 //参数3&#xff1a;初始化内容 void hal_gpio_init(volatile gpio_t*gpiox,unsigned int pin,gpio_init_t* ini…

rabbitmq的死信队列

目录 成为死信的条件 消息TTL过期 队列达到最大长度 消息被拒 延迟队列 延迟队列使用场景 消息设置 TTL 队列设置 TTL 两者区别 producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c; consumer 从 queue 取出消息 进行消费&#xff0c;但某些时候由…

最新Win10离线安装.NET Framework 3.5的方法(附离线包2022/3/22)

win10系统安装软件时&#xff0c;可能需要.net framework3.5的运行环境&#xff0c;当我们安装某些软件的时候会提示“你的电脑上的应用需要使用以下Windows功能:.NET Framework 3.5(包括.NET 2.0和3.0)。如果系统默认的是4.0以上的版本&#xff0c;当软件需要.net framework3.…

LVS+Keepalived集群

keepalived Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务…

提升管班小诀窍

在传统教育中&#xff0c;将考试结果告知家长一直是一项相对麻烦的任务。老师们不得不一个一个的打电话或发短信&#xff0c;耗费大量时间和精力。然而&#xff0c;现在有了易查分&#xff0c;老师们可以轻松地创建自己的成绩查询系统&#xff0c;大大简化了这项任务。 好消息&…

【STM32】高效开发工具CubeMonitor快速上手

工欲善其事必先利其器。拥有一个辅助测试工具&#xff0c;能极大提高开发项目的效率。STM32CubeMonitor系列工具能够实时读取和呈现其变量&#xff0c;从而在运行时帮助微调和诊断STM32应用&#xff0c;类似于一个简单的示波器。它是一款基于流程的图形化编程工具&#xff0c;类…

LeetCode--HOT100题(35)

目录 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合…

视频汇聚/视频云存储/视频监控管理平台EasyCVR提升网络稳定小tips来啦!

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

HummingBird 基于 Go 开源超轻量级 IoT 物联网平台

蜂鸟&#xff08;HummingBird&#xff09; 是 Go 语言实现的超轻量级物联网开发平台&#xff0c;包含设备接入、产品管理、物模型、告警中心、规则引擎等丰富功能模块。系统采用GoLang编写&#xff0c;占用内存极低&#xff0c; 单物理机可实现百设备的连接。 在数据存储上&…

系统架构师---软件重用、基于架构的软件设计、软件模型

目录 软件重用 构件技术 基于架构的软件设计 ABSD方法与生命周期 抽象功能需求 用例 抽象的质量和业务需求 架构选项 质量场景 约束 基于架构的软件开发模型 架构需求 需求获取 标识构件 需求评审 架构设计 架构文档 架构复审 架构实现 架构演化 前言&…

Spring项目使用Redis限制用户登录失败的次数以及暂时锁定用户登录权限

文章目录 背景环境代码实现0. 项目结构图&#xff08;供参考&#xff09;1. 数据库中的表&#xff08;供参考&#xff09;2. 依赖&#xff08;pom.xml&#xff09;3. 配置文件&#xff08;application.yml&#xff09;4. 配置文件&#xff08;application-dev.yml&#xff09;5…

ChatGPT和Claude的能力全测评

创造性思维/语言 提示&#xff1a;“写一首 4 行诗&#xff0c;每行只有 3 个词&#xff0c;描写重庆” ChatGPT写诗&#x1f447; Claude写诗&#x1f447; 仁者见仁&#xff0c;您怎么看谁更强&#xff1f; 提示&#xff1a; "如果你随机选择这个问题的答案&#xff0c;…