1. 程式人生 > 其它 >2.4 在DispatcherServlet的service方法中,通過ServletPath獲取對應的Controller物件

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值違法"); }