diff --git a/pom.xml b/pom.xml index ee9124a..aee3cad 100644 --- a/pom.xml +++ b/pom.xml @@ -16,9 +16,67 @@ javax.servlet - servlet-api - 2.3 + javax.servlet-api + 4.0.1 provided + + dom4j + dom4j + 1.6.1 + + + + org.apache.commons + commons-lang3 + 3.5 + + + + com.sun.xml.bind + jaxb-impl + 2.3.1 + + + com.sun.xml.messaging.saaj + saaj-impl + 1.5.1 + + + SpringMvc + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.3.0 + + + maven-compiler-plugin + 3.10.1 + + + maven-surefire-plugin + 2.22.2 + + + maven-war-plugin + 3.4.0 + + + maven-install-plugin + 3.0.1 + + + maven-deploy-plugin + 3.0.0 + + + + diff --git a/src/main/java/com/wtd/annotation/WtdAutowiredAnnotation.java b/src/main/java/com/enjoy/wtd/annotation/WtdAutowiredAnnotation.java similarity index 89% rename from src/main/java/com/wtd/annotation/WtdAutowiredAnnotation.java rename to src/main/java/com/enjoy/wtd/annotation/WtdAutowiredAnnotation.java index e36b24b..edb472d 100644 --- a/src/main/java/com/wtd/annotation/WtdAutowiredAnnotation.java +++ b/src/main/java/com/enjoy/wtd/annotation/WtdAutowiredAnnotation.java @@ -1,4 +1,4 @@ -package com.wtd.annotation; +package com.enjoy.wtd.annotation; import java.lang.annotation.*; diff --git a/src/main/java/com/wtd/annotation/WtdControllerAnnotation.java b/src/main/java/com/enjoy/wtd/annotation/WtdControllerAnnotation.java similarity index 89% rename from src/main/java/com/wtd/annotation/WtdControllerAnnotation.java rename to src/main/java/com/enjoy/wtd/annotation/WtdControllerAnnotation.java index d75a54f..b307f6f 100644 --- a/src/main/java/com/wtd/annotation/WtdControllerAnnotation.java +++ b/src/main/java/com/enjoy/wtd/annotation/WtdControllerAnnotation.java @@ -1,4 +1,4 @@ -package com.wtd.annotation; +package com.enjoy.wtd.annotation; import java.lang.annotation.*; diff --git a/src/main/java/com/wtd/annotation/WtdRequestMappingAnnotation.java b/src/main/java/com/enjoy/wtd/annotation/WtdRequestMappingAnnotation.java similarity index 89% rename from src/main/java/com/wtd/annotation/WtdRequestMappingAnnotation.java rename to src/main/java/com/enjoy/wtd/annotation/WtdRequestMappingAnnotation.java index 0e8c67a..7baad51 100644 --- a/src/main/java/com/wtd/annotation/WtdRequestMappingAnnotation.java +++ b/src/main/java/com/enjoy/wtd/annotation/WtdRequestMappingAnnotation.java @@ -1,4 +1,4 @@ -package com.wtd.annotation; +package com.enjoy.wtd.annotation; import java.lang.annotation.*; diff --git a/src/main/java/com/wtd/annotation/WtdRequestParamAnnotation.java b/src/main/java/com/enjoy/wtd/annotation/WtdRequestParamAnnotation.java similarity index 89% rename from src/main/java/com/wtd/annotation/WtdRequestParamAnnotation.java rename to src/main/java/com/enjoy/wtd/annotation/WtdRequestParamAnnotation.java index 6671d45..285a49d 100644 --- a/src/main/java/com/wtd/annotation/WtdRequestParamAnnotation.java +++ b/src/main/java/com/enjoy/wtd/annotation/WtdRequestParamAnnotation.java @@ -1,4 +1,4 @@ -package com.wtd.annotation; +package com.enjoy.wtd.annotation; import java.lang.annotation.*; diff --git a/src/main/java/com/wtd/annotation/WtdServiceAnnotation.java b/src/main/java/com/enjoy/wtd/annotation/WtdServiceAnnotation.java similarity index 89% rename from src/main/java/com/wtd/annotation/WtdServiceAnnotation.java rename to src/main/java/com/enjoy/wtd/annotation/WtdServiceAnnotation.java index b963de1..e0533e7 100644 --- a/src/main/java/com/wtd/annotation/WtdServiceAnnotation.java +++ b/src/main/java/com/enjoy/wtd/annotation/WtdServiceAnnotation.java @@ -1,4 +1,4 @@ -package com.wtd.annotation; +package com.enjoy.wtd.annotation; import java.lang.annotation.*; diff --git a/src/main/java/com/wtd/controller/WtdController.java b/src/main/java/com/enjoy/wtd/controller/WtdController.java similarity index 73% rename from src/main/java/com/wtd/controller/WtdController.java rename to src/main/java/com/enjoy/wtd/controller/WtdController.java index 8ae8478..b8716c5 100644 --- a/src/main/java/com/wtd/controller/WtdController.java +++ b/src/main/java/com/enjoy/wtd/controller/WtdController.java @@ -1,10 +1,10 @@ -package com.wtd.controller; +package com.enjoy.wtd.controller; -import com.wtd.annotation.WtdAutowiredAnnotation; -import com.wtd.annotation.WtdControllerAnnotation; -import com.wtd.annotation.WtdRequestMappingAnnotation; -import com.wtd.annotation.WtdRequestParamAnnotation; -import com.wtd.service.WtdService; +import com.enjoy.wtd.annotation.WtdControllerAnnotation; +import com.enjoy.wtd.annotation.WtdRequestMappingAnnotation; +import com.enjoy.wtd.annotation.WtdRequestParamAnnotation; +import com.enjoy.wtd.annotation.WtdAutowiredAnnotation; +import com.enjoy.wtd.service.WtdService; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; diff --git a/src/main/java/com/wtd/service/WtdService.java b/src/main/java/com/enjoy/wtd/service/WtdService.java similarity index 84% rename from src/main/java/com/wtd/service/WtdService.java rename to src/main/java/com/enjoy/wtd/service/WtdService.java index 59da77a..657317d 100644 --- a/src/main/java/com/wtd/service/WtdService.java +++ b/src/main/java/com/enjoy/wtd/service/WtdService.java @@ -1,4 +1,4 @@ -package com.wtd.service; +package com.enjoy.wtd.service; /** * @program: wtd-mvc diff --git a/src/main/java/com/wtd/service/impl/WtdServiceImpl.java b/src/main/java/com/enjoy/wtd/service/impl/WtdServiceImpl.java similarity index 60% rename from src/main/java/com/wtd/service/impl/WtdServiceImpl.java rename to src/main/java/com/enjoy/wtd/service/impl/WtdServiceImpl.java index df347f3..0af7e4f 100644 --- a/src/main/java/com/wtd/service/impl/WtdServiceImpl.java +++ b/src/main/java/com/enjoy/wtd/service/impl/WtdServiceImpl.java @@ -1,7 +1,7 @@ -package com.wtd.service.impl; +package com.enjoy.wtd.service.impl; -import com.wtd.annotation.WtdServiceAnnotation; -import com.wtd.service.WtdService; +import com.enjoy.wtd.annotation.WtdServiceAnnotation; +import com.enjoy.wtd.service.WtdService; /** * @program: wtd-mvc @@ -13,6 +13,6 @@ import com.wtd.service.WtdService; public class WtdServiceImpl implements WtdService { @Override public String query(String name, String age) { - return "name==="+name+"; age==="+age; + return "name="+name+"; age="+age; } } diff --git a/src/main/java/com/enjoy/wtd/servlet/DispatcherServlet.java b/src/main/java/com/enjoy/wtd/servlet/DispatcherServlet.java new file mode 100644 index 0000000..568af02 --- /dev/null +++ b/src/main/java/com/enjoy/wtd/servlet/DispatcherServlet.java @@ -0,0 +1,228 @@ +package com.enjoy.wtd.servlet; + +import com.enjoy.wtd.annotation.*; + +import com.enjoy.wtd.controller.WtdController; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @program: wtd-mvc + * @description: + * @author: Mr.Wang + * @create: 2023-10-28 17:02 + **/ +public class DispatcherServlet extends HttpServlet { + + List classNames = new ArrayList(); + + Map beans = new HashMap(); + Map handlerMap = new HashMap(); + + private static final long serialVersionUID = 1L; + + public void init(ServletConfig config){ + //把所有的bean扫描----扫描所有的class文件 + scanPackage("com.enjoy"); //写到properties + + doInstance(); //根据全类名创建bean + + doIco();//根据bean进行依赖注入 + + buildUrlMapping(); // 建立映射关系 + } + + //com.enjoy + private void scanPackage(String basePackage){ + URL url = this.getClass().getClassLoader().getResource("/"+basePackage.replaceAll("\\.","/")); + String fileStr = url.getFile(); + File file = new File(fileStr); + + String[] filesStr = file.list(); //spc + + for (String path : filesStr) { + File filePath = new File(fileStr+path); //com.enjoy.spc... + + if (filePath.isDirectory()){ + scanPackage(basePackage+"."+path); + }else { + //加入list + classNames.add(basePackage+"."+filePath.getName()); //com.enjoy...xxx.class + } + } + } + + //根据扫描的list全类名,进行实例化 + private void doInstance(){ + if (classNames.size() <= 0){ + System.out.println("报扫描失败......."); + return; + } + + //list的所有class类,对这些类进行 + for (String className : classNames) { + String cn = className.replace(".class",""); + try { + Class clazz = Class.forName(cn); //com.enjoy.SpcController + if (clazz.isAnnotationPresent(WtdControllerAnnotation.class)){ + Object instace = clazz.newInstance(); //创建控制类 + + WtdRequestMappingAnnotation requestMapping = clazz.getAnnotation(WtdRequestMappingAnnotation.class); + String rmvalue = requestMapping.value(); // /spc + beans.put(rmvalue,instace); + }else if (clazz.isAnnotationPresent(WtdServiceAnnotation.class)){ + WtdServiceAnnotation service = clazz.getAnnotation(WtdServiceAnnotation.class); + Object instance = clazz.newInstance(); + beans.put(service.value(),instance); + }else { + continue; + } + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + //把nacos注入到controller + public void doIco(){ + if (beans.entrySet().size() <= 0){ + System.out.println("没有一个实例化类"); + } + //把map里所有的实例化遍历出来 + for (Map.Entry entry : beans.entrySet()){ + Object instance = entry.getValue(); + Class clazz = instance.getClass(); + + if (clazz.isAnnotationPresent(WtdControllerAnnotation.class)){ + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + if (field.isAnnotationPresent(WtdAutowiredAnnotation.class)){ + WtdAutowiredAnnotation auto = field.getAnnotation(WtdAutowiredAnnotation.class); + String key = auto.value(); //spcServiceImpl + field.setAccessible(true); + try { + field.set(instance,beans.get(key)); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }else { + continue; + } + } + }else{ + continue; + } + } + } + + private void buildUrlMapping(){ + if (beans.entrySet().size() <= 0){ + System.out.println("没有类的实例化......"); + return; + } + + for (Map.Entry entry: beans.entrySet()){ + Object instance = entry.getValue(); + + Class clazz = instance.getClass(); + if (clazz.isAnnotationPresent(WtdControllerAnnotation.class)){ + WtdRequestMappingAnnotation requestMapping = clazz.getAnnotation(WtdRequestMappingAnnotation.class); + String classPath = requestMapping.value(); + + Method[] methods = clazz.getMethods(); + for (Method method : methods) { + if (method.isAnnotationPresent(WtdRequestMappingAnnotation.class)){ + WtdRequestMappingAnnotation methodMapping = method.getAnnotation(WtdRequestMappingAnnotation.class); + String methodPath = methodMapping.value(); + + handlerMap.put(classPath+methodPath, method); + }else { + continue; + } + } + }else { + continue; + } + } + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + this.doPost(req,resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + // 获取请求路径 /spc-mvc/spc/query v/spc/query->method + String uri = req.getRequestURI(); + String context = req.getContextPath(); //spc-mvc + String path = uri.replace(context, ""); //spc/query + Method method = (Method) handlerMap.get(path); + + //根据 key=/spc到map去拿 + WtdController instance = (WtdController) beans.get("/" + path.split("/")[1]);// /spc + + Object arg[] = hand(req, resp, method); + try { + method.invoke(instance,arg); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + private static Object[] hand(HttpServletRequest request,HttpServletResponse response,Method method){ + //拿到当前待执行的方法有哪些参数 + Class[] paramClazzs = method.getParameterTypes(); + //根据参数的个数,new 一个参数的数组,将方法里的所有参数值到args来 + Object[] args = new Object[paramClazzs.length]; + + int args_i = 0; + int index = 0; + for (Class paramClazz : paramClazzs) { + if (ServletRequest.class.isAssignableFrom(paramClazz)){ + args[args_i++] = request; + } + if (ServletResponse.class.isAssignableFrom(paramClazz)){ + args[args_i++] = response; + } + // 从0-3判断有没有RequestParam注解,很明显paramClazz为0和1时,不是, + // 当为2和3时为@RequestParam,需更解析 + // 当为2和3时为@RequestParam,需更解析 + java.lang.annotation.Annotation[] paramAns = method.getParameterAnnotations()[index]; + if (paramAns.length > 0 ){ + for (Annotation paramAn : paramAns) { + if (WtdRequestParamAnnotation.class.isAssignableFrom(paramAn.getClass())){ + WtdRequestParamAnnotation rp =(WtdRequestParamAnnotation) paramAn ; + //找到注解里的name和age + args[args_i++] = request.getParameter(rp.value()); + } + } + } + index++; + } + return args; + } + +} diff --git a/src/main/java/com/wtd/servlet/DispatcherServlet.java b/src/main/java/com/wtd/servlet/DispatcherServlet.java deleted file mode 100644 index 47429ae..0000000 --- a/src/main/java/com/wtd/servlet/DispatcherServlet.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.wtd.servlet; - -import com.wtd.annotation.*; -import com.wtd.controller.WtdController; - -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.text.Annotation; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @program: wtd-mvc - * @description: - * @author: Mr.Wang - * @create: 2023-10-28 17:02 - **/ -public class DispatcherServlet extends HttpServlet { - - List classNames=new ArrayList<>(); - - Map beans=new HashMap(); - Map handlerMap=new HashMap(); - - - public void init(ServletConfig config){ - scanPackage("com.wtd");//写到properties - doInstance();//根据全类名创建bean - doIoc();//根据bean进行依赖注入 - buildUrlMapping(); - } - - public void scanPackage(String basePackage){ - URL url=this.getClass().getClassLoader().getResource("/"+basePackage.replaceAll("\\.","/")); - String fileStr=url.getFile(); - File file=new File(fileStr); - - String[] filesStr = file.list(); - - for (String path : filesStr) { - File filePath=new File(fileStr+path); - if(filePath.isDirectory()){ - scanPackage(basePackage+"."+path); - }else{ - classNames.add(basePackage+"."+filePath.getName()); - } - } - } - //根据扫描出来的全类名 进行实例化 - private void doInstance(){ - if(classNames.size()<0){ - System.out.println("扫描失败"); - return; - } - //遍历list里面所有的class类 - for (String className : classNames) { - String cn = className.replace(".class", ""); - try { - Class clazz = Class.forName(cn); - if(clazz.isAnnotationPresent(WtdControllerAnnotation.class)){ - Object instance = clazz.newInstance(); - WtdRequestMappingAnnotation requestMappingAnnotation = clazz.getAnnotation(WtdRequestMappingAnnotation.class); - String rmValue=requestMappingAnnotation.value(); - beans.put(rmValue,instance); - }else if(clazz.isAnnotationPresent(WtdServiceAnnotation.class)){ - WtdServiceAnnotation service=clazz.getAnnotation(WtdServiceAnnotation.class); - Object instance=clazz.newInstance(); - beans.put(service.value(),instance); - }else { - continue; - } - } catch (ClassNotFoundException e) { - e.printStackTrace(); - }catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - //把service注入到controller - public void doIoc(){ - if(!(beans.entrySet().size() > 0)){ - System.out.println("没有一个实例类"); - } - for (Map.Entry entry:beans.entrySet()){ - Object instance=entry.getValue(); - Class clazz = instance.getClass(); - if(clazz.isAnnotationPresent(WtdControllerAnnotation.class)){ - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - if(field.isAnnotationPresent(WtdAutowiredAnnotation.class)){ - WtdAutowiredAnnotation auto=field.getAnnotation(WtdAutowiredAnnotation.class); - String key=auto.value(); - field.setAccessible(true); - try { - field.set(instance,beans.get(key)); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - }else { - continue; - } - } - }else { - continue; - } - - - } - } - private void buildUrlMapping(){ - if(!(beans.entrySet().size() > 0)){ - System.out.println("没有类的实例化"); - return; - } - for (Map.Entry entry:beans.entrySet()){ - Object instance=entry.getValue(); - Class clazz=instance.getClass(); - if(clazz.isAnnotationPresent(WtdControllerAnnotation.class)){ - WtdRequestMappingAnnotation requestMappingAnnotation=clazz.getAnnotation(WtdRequestMappingAnnotation.class); - String classPath = requestMappingAnnotation.value(); - Method[] methods = clazz.getMethods(); - for (Method method : methods) { - if(method.isAnnotationPresent(WtdRequestMappingAnnotation.class)){ - WtdRequestMappingAnnotation methodMapping=method.getAnnotation(WtdRequestMappingAnnotation.class); - String methodPath=methodMapping.value(); - handlerMap.put(classPath+methodPath,method); - }else { - continue; - } - } - }else { - continue; - } - } - } - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - this.doPost(req,resp); - } - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - String uri=req.getRequestURI(); - String context=req.getContextPath(); - String path=uri.replace(context,""); - Method method=(Method) handlerMap.get(path); - //根据key=/wtd到map去拿 - WtdController instance=(WtdController) beans.get("/"+path.split("/")[1]); - Object arg[]=hand(req,resp,method); - try { - method.invoke(instance,arg); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } - private static Object[] hand(HttpServletRequest request,HttpServletResponse response,Method method){ - Class[] paramClazzs = method.getParameterTypes(); - Object[] args=new Object[paramClazzs.length]; - int args_i=0; - int index=0; - for (Class paramClazz : paramClazzs) { - if(ServletRequest.class.isAssignableFrom(paramClazz)){ - args[args_i++]=request; - } - if(ServletResponse.class.isAssignableFrom(paramClazz)){ - args[args_i++]=response; - } - Annotation[] paramAns= (Annotation[]) method.getParameterAnnotations()[index]; - if(paramAns.length>0){ - for (Annotation paramAn : paramAns) { - if(WtdRequestParamAnnotation.class.isAssignableFrom(paramAn.getClass())){ - WtdRequestParamAnnotation rp=(WtdRequestParamAnnotation) paramAn; - args[args_i++]=request.getParameter(rp.value()); - } - } - } - index++; - } - return args; - } -} diff --git a/src/main/webapp/WEB-INF/lib/jsp-api.jar b/src/main/webapp/WEB-INF/lib/jsp-api.jar new file mode 100644 index 0000000..9a4226f Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/jsp-api.jar differ diff --git a/src/main/webapp/WEB-INF/lib/jstl-1.2.jar b/src/main/webapp/WEB-INF/lib/jstl-1.2.jar new file mode 100644 index 0000000..0fd275e Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/jstl-1.2.jar differ diff --git a/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar b/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar new file mode 100644 index 0000000..60bef5c Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar differ diff --git a/src/main/webapp/WEB-INF/lib/servlet-api.jar b/src/main/webapp/WEB-INF/lib/servlet-api.jar new file mode 100644 index 0000000..5dc2153 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/servlet-api.jar differ diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index c17f26f..3ab8a34 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -6,7 +6,7 @@ wtd-mvc DispatcherServlet - com.wtd.servlet.DispatcherServlet + com.enjoy.wtd.servlet.DispatcherServlet 0