一个网站用两个域名,西安小型网络公司,设计素材网站飘,做网站工作室名字文章目录 1、自定义MyWebServlet 注解2、创建HttpServlet文件3、加载项目中的所有以.java结尾的文件4、收集项目中带有MyWebServlet 的类对象 1、自定义MyWebServlet 注解
我们知道#xff0c;tomcat是依据WebServlet注解去收集所有servlet类的。
import java.lang.annotati… 文章目录 1、自定义MyWebServlet 注解2、创建HttpServlet文件3、加载项目中的所有以.java结尾的文件4、收集项目中带有MyWebServlet 的类对象 1、自定义MyWebServlet 注解
我们知道tomcat是依据WebServlet注解去收集所有servlet类的。
import java.lang.annotation.*;//该注解可以应用于类、接口包括注解类型、枚举
Target(ElementType.TYPE)//ElementType.TYPE
//该注解标记的元素可以被Javadoc 或类似的工具文档化
Documented
//该注解的生命周期由JVM 加载包含在类文件中在运行时可以被获取到
Retention(RetentionPolicy.RUNTIME)//RUNTIME/*** description:* author: YHZ* date: 2023/8/15 14:36**/
public interface MyWebServlet {String urlMapping()default ;
}
2、创建HttpServlet文件
用过Servlet写过项目的朋友都知道声明一个Servlet不仅要有WebServlet注解还要继承HttpServlet这个类。
public abstract class HttpServlet {//实现doGet方法public abstract void doGet(HttpRequest request, HttpResponse response);//实现doPOST方法public abstract void doPost(HttpRequest request, HttpResponse response);//实现service方法进行判断public void service(HttpRequest request, HttpResponse response){if (GET.equals(request.getMethod())){doGet(request,response);}else if(POST.equals(request.getMethod())){doPost(request,response);}}
}
3、加载项目中的所有以.java结尾的文件
public class FileChooseConfig {//存的是该项目文件夹中所有.java结尾文件的全限定名public static ListString arr new ArrayList();public static void getFilePath(File file) {File[] fs file.listFiles();for (File f : fs) {if (f.isDirectory()){getFilePath(f);}if (f.isFile()) {String filepath f.toString();filepath filepath.split(main)[1];filepath filepath.substring(6,filepath.length());if( filepath.endsWith(.java)) {//把是.java文件的全类名放到arr中arr.add(filepath.replace(\\, .).replace(.java, ));}}}}
}4、收集项目中带有MyWebServlet 的类对象
public class FileChooseConfig {//key为urlMapping路径value为通过全类名反射得到的servlet类对象public static MapString,Class webServletMap new ConcurrentHashMap();//查找所有controller并创建对象装入Map里“url”:Objectpublic static void chooseWebServlet() {for(String file: arr){try {Class? aClass Class.forName(file);//如果有WebServlet注解if(aClass.isAnnotationPresent(MyWebServlet.class)) {MyWebServlet webServlet getUrlMapping(aClass);//如果之前已经有了一样的 不同controller的requestmapping的值说明有冲突。if (webServletMap.containsKey(webServlet.urlMapping())) {throw new RuntimeException(类多注解值 webServlet.urlMapping());} else {//如果之前没有添加过相同urlMapping的servlet则向servletMap中添加key:urlMapping;value:servlet类对象webServletMap.put(webServlet.urlMapping(), aClass);}}}catch (ClassNotFoundException e) {e.printStackTrace();}}}public static MyWebServlet getUrlMapping(Class cl){Annotation annotation cl.getAnnotation(MyWebServlet.class);if(annotation instanceof MyWebServlet){return (MyWebServlet) annotation;}return null;}}