11package com .vison .webmvc .framework ;
22
33import 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 ;
77import javax .servlet .ServletException ;
88import javax .servlet .annotation .WebServlet ;
99import javax .servlet .http .HttpServlet ;
1010import javax .servlet .http .HttpServletRequest ;
1111import 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 ;
1220
1321/**
1422 *
1725@ WebServlet (name = "DispatchServlet" , urlPatterns = {"/" })
1826public class DispatchServlet extends HttpServlet {
1927
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 ());
2329
2430 @ Override
2531 public void init () throws ServletException {
@@ -31,10 +37,81 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
3137 resp .setContentType ("text/html" );
3238 resp .setCharacterEncoding ("UTF-8" );
3339 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 );
3643 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 ;
39116 }
40117}
0 commit comments