当前位置: 首页 > news >正文

【仿写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.lryc.cn/news/133201.html

相关文章:

  • pytorch2.0.1 安装部署(cpu+gpu) linux+windows
  • Java数据结构学习和源码阅读(线性数据结构)
  • 华为网络篇 多区域OSPF-32
  • 【HCIP】03.VLAN高级技术
  • WebSocket服务端数据推送及心跳机制(Spring Boot + VUE)
  • 根据Dockerfile创建容器案例讲解
  • CF 1328 D Carousel(环构造)
  • 什么是SaaS、PaaS、aPaaS、iPaaS、IaaS,一文讲透
  • Mac nvm 切换为淘宝镜像
  • aardio简单网站css或js下载练习
  • “维度削减+逻辑回归”:如何使用PCA大幅提升乳腺癌的预测成功率?
  • Python程序设计基础:random库的使用
  • webpack 打包全流程
  • 如何准备软件开发项目成本估算?
  • 音视频FAQ(三):音画不同步
  • MFC为控件添加背景图片
  • 1047:判断能否被3,5,7整除
  • 十七、DoIP诊断通信 2 (专栏:从零开始搭建一个UDS诊断自动化测试CANoe工程)
  • 【2023】LeetCode HOT 100——哈希
  • TCP/IP---网络层
  • 解决访问Github出现的Couldn‘t connect to server错误
  • 善于打仗的人,没有特别大的名气和勇功
  • 虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)
  • 微服务中间件--微服务保护
  • Excel VBA 复制除指定工作表外所有的工作表的内容到一张工作表中
  • 电脑上安装,多版本node
  • 「网页开发|环境安装」Windows系统下安装node.js
  • 【腾讯云Cloud Studio实战训练营】用Vue+Vite快速构建完成交互式3D小故事
  • MySQL和Java中的货币字段类型选择
  • 第6步---MySQL的控制流语句和窗口函数