• 实现在普通JavaWeb项目启动时对所有URL进行扫描


    想对项目URL进行扫描自然离不开对应的注解。

    说起注解,自然而然的就会想到Annotation,也就是java.lang.annotation.Annotation,通过观察类关系树状图
    在这里插入图片描述
    我们不难发现Annotation下有个WebServlet接口,再通过输出语句我们可以看到里面包含了我们想要的url信息,如下图
    在这里插入图片描述
    接下来为了得到WebServlet接口里面的value值也就是url,我们可以将Annotation这个接口强制转化成WebServlet

    WebServlet webServlet= (WebServlet) annotation;

    然后通过

    String[] urls=webServlet.value();

    可获得urls数组遍历一下就可以得到我们想要的url

    那么如何在项目启动时获取URL呢?

    步骤如下
    1、声明要扫描URL的包路径

    String packageName = "com.servlet.";

    2、用this.getClass().getResource("/").getPath()获取类工作路径也就是classes文件路径,然后用File类获取类加载的根路径

    File f = new File(this.getClass().getResource("/").getPath());

    3、用创建好的File类递归获取路径下的所有类名

        public void findFile(File folder, String packageName){
            File[] files = folder.listFiles();
            for (File file:files) {
                if (file.isDirectory()) {
                    findFile(file, packageName + file.getName() + ".");
                } else {
                    getUrl(file.getName(), packageName);
                }
            }
        }

    4、用上面获取到的文件名(file.getName())去除.class后缀获得类名,然后用Class.forName加载第一步的包名拼接上类名
    获得类对象

    Class clazz = Class.forName(packageName + name);

    5、然后用clazz .getAnnotations()可以获得当前类的Annotation对象

    Annotation[] annotations=clazz.getAnnotations();

    6、强转为WebServlet接口

    WebServlet webServlet= (WebServlet) a;

    7、用webServlet.value()获取URL

    总的代码如下:

    package com.servlet;
    
    import com.domain.Permission;
    
    import javax.servlet.annotation.WebServlet;
    import java.io.File;
    import java.lang.annotation.Annotation;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    public class ScanningUrl {
        private List<Permission> permissions=new ArrayList<Permission>();
    
        public ScanningUrl() {
            scanningUrl();
        }
    
        public void scanningUrl() {
            String packageName = "com.servlet.";
            //System.getProperty("user.dir")获取用户当前工作目录
            File f = new File(this.getClass().getResource("/").getPath());// 获取类加载的根路径
            File file = new File(f+ "\com\servlet");
            findFile(file, packageName);
        }
        public void findFile(File folder, String packageName){
            File[] files = folder.listFiles();
            for (File file:files) {
                if (file.isDirectory()) {
                    findFile(file, packageName + file.getName() + ".");
                } else {
                    getUrl(file.getName(), packageName);
                }
            }
        }
        public void getUrl(String filename, String packageName) {
            try {
                String name = filename.substring(0, filename.length() - 6);
                Class clazz = Class.forName(packageName + name);
                Annotation[] annotations=clazz.getAnnotations();
                for (Annotation a:annotations) {
                    WebServlet webServlet= (WebServlet) a;
                    String[] myurls=webServlet.value();
                    for (String url:myurls) {
                        Permission permission=new Permission();
                        permission.setId(String.valueOf(UUID.randomUUID()));
                        permission.setUrl(url);
                        permission.setPermissionName(url);
                        permissions.add(permission);
                    }
                }
            } catch (Exception e) {
                System.out.println("exception = " + e.getLocalizedMessage());
            }
        }
    
        public List<Permission> getPermissions() {
            return permissions;
        }
    
        public void setPermissions(List<Permission> permissions) {
            this.permissions = permissions;
        }
    }

    最后在web.xml配置项目启动时初始化存储类调用该类的getPermissions()就可以了。

  • 相关阅读:
    火狐(firefox)浏览器插件开发简明教程
    linux查看硬件信息
    【MySQL】MySQL批量KILL线程
    【MySQL】MySQL8动态调整redo日志的大小
    【SQLServer】使用sp_whoisactive记录sqlserver数据库活动
    【PostgreSQL】连接到PostgreSQL Server
    【MySQL】MySQL 5.6多线程复制和GTIDs的补充
    Performance Schema: Measure MultiThreaded Slave Activity
    【MySQL】MySQL估算redo日志的容量
    【SQLSERVER】查询Job作业基本信息及执行情况
  • 原文地址:https://www.cnblogs.com/mogong/p/12465509.html
Copyright © 2020-2023  润新知