2.4 在DispatcherServlet的service方法中,通過ServletPath獲取對應的Controller物件
阿新 • • 發佈:2022-04-18
@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.doint 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值違法"); }