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