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

这篇具有很好参考价值的文章主要介绍了【仿写tomcat】二、扫描java文件,获取带有@WebServlet注解的类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目结构

扫描文件之前当然要确定一下项目结构了,我这里的方案是tomcat和项目同级
【仿写tomcat】二、扫描java文件,获取带有@WebServlet注解的类,源码仿写,java,tomcat,源码仿写,反射,手写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文件,初始化servlet
        List<String> allJavaFile = ScanUtil.getAllJavaFile(webAppPath);
        for (String s : allJavaFile) {
            if (MapUtil.isWebServlet(s)) {
                ServletUtil.initServlet(s);
            }
        }
        // 4.处理http请求
        
    }
}

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

【仿写tomcat】三、通过socket读取http请求信息文章来源地址https://www.toymoban.com/news/detail-655588.html

到了这里,关于【仿写tomcat】二、扫描java文件,获取带有@WebServlet注解的类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【仿写tomcat】一、tomcat工作流程

    简介 作者前不久刚仿写了一个简易的tomcat,在此分享给各位,此篇为对tomcat的简介和流程分析,具体仿写内容后续会贴在这里 扫描java文件,获取带有@WebServlet注解的类 tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和

    2024年02月12日
    浏览(30)
  • 【仿写框架之仿写Tomact】一、Tomcat的工作流程

    当涉及到Java Web应用程序的部署和运行,Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器,扮演着连接用户和应用程序的重要角色。本篇文将向大家阐述Tomcat的执行流程,从启动到请求处理再到关闭,帮助您更好地

    2024年02月12日
    浏览(37)
  • 【仿写框架之仿写Tomact】一、详解Tomcat的工作流程

    当涉及到Java Web应用程序的部署和运行,Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器,扮演着连接用户和应用程序的重要角色。本篇文将向大家阐述Tomcat的执行流程,从启动到请求处理再到关闭,帮助您更好地

    2024年02月12日
    浏览(40)
  • 【仿写tomcat】三、通过socket读取http请求信息

    这里我们也是创建一个专门管理socket的类 随后在主方法中调用他,让serverSocket监听8080端口,并且一直尝试获取连接信息 接下来在SocketStore中添加处理请求的方法,这里面的主要逻辑就是读取流数据,而且我们知道HTTP协议是一行一行的(看f12就知道了),所以给数据拼上换行

    2024年02月12日
    浏览(42)
  • 如何仿写简易tomcat 实现思路+代码详细讲解

    仿写之前,我们要搞清楚都要用到哪些技术 自定义注解,比如Tomcat使用的是@Servlet,我们可以定义一个自己的@MyServlet 构造请求体和返回体,比如tomcat使用HttpRequest,我们可以自己定义myHttpRequest java去遍历一个指定目录,然后获取到.java文件,再获取到带有@MyServlet注解的类 然

    2024年02月12日
    浏览(39)
  • 【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进

    如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可,下面我们对HttpResponseServlet这个类做一些改造 writeHtml这个方法将会读取webApp下面的html文件,注意只读取下面一级文件中的html文件,然后将这个文件以二进制流的形式转换成字符串拼接到上面定义的

    2024年02月12日
    浏览(45)
  • 【仿写tomcat】四、解析http请求信息,响应给前端,HttpServletRequest、HttpServletResponse的简单实现

    在解析请求之前我们要思考一个问题,我们解析的是其中的哪些内容? 对于最基本的实现,当然是 请求类型 , 请求的url 以及 请求参数 ,我们可以根据请求的类型作出对应的处理,通过url在我们的mapstore中找到servlet, 那么请求的参数我们是不是还没有储存的地方呢? 所以

    2024年02月12日
    浏览(40)
  • Python3: 扫描库文件并获取版本号信息

    在 C/C++ 开发中使用了第三方库,具体说是 .a , .lib , .dll 等文件,想通过 Python 查询出这些文件中的版本号信息。 有人可能好奇,这里简单消除可能得疑虑: 为什么不用源代码,而用库? 因为库文件提供了良好的 隔离性 ,避免了繁杂的编译选项指定, 避免了潜在的不小心改

    2024年02月05日
    浏览(85)
  • @ConfigurationProperties注解获取yml配置文件信息

    ConfigurationProperties注解主要用于将外部配置文件配置的属性填充到这个** Spring Bean实例 **中。 需要注意:它自己单独使用无效,需要配合其它注解一起使用。且对于Spring Bean才生效,普通的new 对象不生效。 ConfigurationProperties的使用方式: @ConfigurationProperties + @Component(或其它实

    2024年02月16日
    浏览(44)
  • Java注解源码分析,实现自定义注解通过反射获取

    JDK5.0 引入,可以通过反射机制动态获取,大量应用于java框架中 内置注解 @Override 重写父类方法时 @Deprecated 使用它存在风险,可能导致错误 可能在未来版本中不兼容 可能在未来版本中删除 一个更好和更高效的方案已经取代它 @SuppressWarnings 告诉编译器忽略指定的警告,不用在

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包