实现在普通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()就可以了。

 

posted @ 2020-02-22 22:38  陌攻  阅读(517)  评论(0编辑  收藏  举报