1
1
package com .vison .webmvc .framework ;
2
2
3
3
import java .io .IOException ;
4
- import java .io . PrintWriter ;
5
- import java .util . HashMap ;
6
- import java .util .Map ;
4
+ import java .lang . reflect . Method ;
5
+ import java .lang . reflect . Parameter ;
6
+ import java .util .Set ;
7
7
import javax .servlet .ServletException ;
8
8
import javax .servlet .annotation .WebServlet ;
9
9
import javax .servlet .http .HttpServlet ;
10
10
import javax .servlet .http .HttpServletRequest ;
11
11
import javax .servlet .http .HttpServletResponse ;
12
+ import javax .servlet .http .HttpSession ;
13
+ import org .reflections .Reflections ;
14
+ import org .reflections .scanners .MethodAnnotationsScanner ;
15
+ import org .reflections .util .ClasspathHelper ;
16
+ import org .reflections .util .ConfigurationBuilder ;
17
+ import org .reflections .util .FilterBuilder ;
18
+ import org .apache .logging .log4j .Logger ;
19
+ import org .apache .logging .log4j .LogManager ;
12
20
13
21
/**
14
22
*
17
25
@ WebServlet (name = "DispatchServlet" , urlPatterns = {"/" })
18
26
public class DispatchServlet extends HttpServlet {
19
27
20
- private Map <String , GetDispatcher > getMappings = new HashMap <>();
21
- private Map <String , PostDispatcher > postMappings = new HashMap <>();
22
- private ViewEngine viewEngine ;
28
+ private static final Logger log = LogManager .getLogger (DispatchServlet .class .getName ());
23
29
24
30
@ Override
25
31
public void init () throws ServletException {
@@ -31,10 +37,81 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
31
37
resp .setContentType ("text/html" );
32
38
resp .setCharacterEncoding ("UTF-8" );
33
39
String path = req .getRequestURI ().substring (req .getContextPath ().length ());
34
- log (path );
35
- resp .getWriter ().write (path );
40
+ Object res = dispatch (path , req , resp );
41
+ String responseBody = this .handInvokeRes (res );
42
+ resp .getWriter ().write (responseBody );
36
43
resp .getWriter ().flush ();
37
- // 根据路径查找GetDispatcher:
38
- // 调用Controller方法获得返回值:
44
+ }
45
+
46
+ private Object dispatch (String path , HttpServletRequest request , HttpServletResponse response ) {
47
+ Method method = this .getMaps (path );
48
+ log .info (method );
49
+ Object res = null ;
50
+ if (method != null );
51
+ {
52
+ Parameter [] parameters = method .getParameters ();
53
+ Object [] arguments = new Object [parameters .length ];
54
+ for (int i = 0 ; i < parameters .length ; i ++) {
55
+ Parameter parameter = parameters [i ];
56
+ log .info (parameter .getType ());
57
+ Class <?> parameterClass = parameter .getType ();
58
+ String parameterName = parameter .getName ();
59
+ if (parameterClass == HttpServletRequest .class ) {
60
+ arguments [i ] = request ;
61
+ } else if (parameterClass == HttpServletResponse .class ) {
62
+ arguments [i ] = response ;
63
+ } else if (parameterClass == HttpSession .class ) {
64
+ arguments [i ] = request .getSession ();
65
+ } else if (parameterClass == int .class ) {
66
+ arguments [i ] = Integer .valueOf (getOrDefault (request , parameterName , "0" ));
67
+ } else if (parameterClass == long .class ) {
68
+ arguments [i ] = Long .valueOf (getOrDefault (request , parameterName , "0" ));
69
+ } else if (parameterClass == boolean .class ) {
70
+ arguments [i ] = Boolean .valueOf (getOrDefault (request , parameterName , "false" ));
71
+ } else if (parameterClass == String .class ) {
72
+ arguments [i ] = getOrDefault (request , parameterName , "" );
73
+ } else {
74
+ throw new RuntimeException ("Missing handler for type: " + parameterClass );
75
+ }
76
+ }
77
+ Object obj ;
78
+ try {
79
+ obj = method .getDeclaringClass ().getDeclaredConstructor ().newInstance ();
80
+ res = method .invoke (obj , arguments );
81
+ } catch (Exception e ) {
82
+ log .error ("方法invoke失败" , e );
83
+ }
84
+ }
85
+ return res ;
86
+ }
87
+
88
+ private String getOrDefault (HttpServletRequest request , String name , String defaultValue ) {
89
+ String s = request .getParameter (name );
90
+ return s == null ? defaultValue : s ;
91
+ }
92
+
93
+ private String handInvokeRes (Object obj ) {
94
+ if (obj instanceof String ) {
95
+ return (String ) obj ;
96
+ }
97
+ return "" ;
98
+ }
99
+
100
+ private Method getMaps (String path ) {
101
+ String packageName = "com.vison.webmvc.controller" ;
102
+ ConfigurationBuilder config = new ConfigurationBuilder ();
103
+ config .filterInputsBy (new FilterBuilder ().includePackage (packageName ));
104
+ config .addUrls (ClasspathHelper .forPackage (packageName ));
105
+ config .setScanners (new MethodAnnotationsScanner ());
106
+ Reflections f = new Reflections (config );
107
+ Set <Method > resources = f .getMethodsAnnotatedWith (GetMapping .class );
108
+
109
+ for (Method method : resources ) {
110
+ GetMapping annotation = method .getAnnotation (GetMapping .class );
111
+ if (path .equals (annotation .path ())) {
112
+ return method ;
113
+ }
114
+ }
115
+ return null ;
39
116
}
40
117
}
0 commit comments