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