2.4 在DispatcherServlet的service方法中,通过ServletPath获取对应的Controller对象
@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 假设url是: http://localhost:8080/mymvc2/hello.do // ServletPath是Servlet的访问路径: /hello.do // 思路是: // 第1步: /hello.do -> hello 或者 /book.do -> book // 第2步: hello -> HelloController 或者 book -> BookController String servletPath = request.getServletPath(); // /hello.do int lastDotIndex = servletPath.lastIndexOf(".do"); servletPath = servletPath.substring(1, lastDotIndex); // hello //通过ServletPath获取对应的Controller对象 Object xxxController = map.get(servletPath); String ac = request.getParameter("ac"); System.out.println("=======" + ac + "======"); if (StringUtil.isEmpty(ac)) ac = "index"; // 获取当前类的所有方法 Method[] methods = xxxController.getClass().getDeclaredMethods(); for (Method m : methods) { // 获取方法名称 String methodName = m.getName(); if (ac.equals(methodName)) { // 找到和ac同名的方法,那么通过反射技术调用它 try { m.invoke(this, request, response); return; } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } } throw new RuntimeException("ac值违法"); }