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

 

posted @ 2022-04-18 08:49  费凡  阅读(104)  评论(0编辑  收藏  举报