在 Java 中实现控制器和路由

Implementing Controller and Routes in Java

我正在实现一个 Web 应用程序,它使用路由器来验证传入请求并将其映射到控制器中的操作。

路由在这样的文件中定义:

"/users/all","UserController.all"
"/users/user_id","UserController.get"
"/posts/add","PostController.add"
"/posts/post_id","PostContoller.get"

路线class如下:

public class Routes {

    HashMap<String,String> routes;

    public Routes() {
        this.routes = new HashMap<String,String>();
        readRoutes();
    }

    public HttpResponse route(HttpRequest request) {
        String mapper[] = routes.get(request.getUri()).split(".");
        try {
            return (HttpResponse) Class.forName(mapper[0]).getMethod(mapper[1],HttpRequest.class).invoke(null, request);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    private void readRoutes() {
        // Reads the routes file and loads the routes hash map

    }
}

我目前有两个控制器,User 和 Post 如下:

public class UserController {

    public static Collection<String> all(HttpRequest request) {
        return DB.Users.all();
    }

    public static String get(HttpRequest request) {
        // Extract id from request
        return DB.Users.get(id);
    }
}

public class PostController {

    public static void add(HttpRequest request) {
        // Get the data from the request and do the processing
        return DB.Posts.add(data);
    }

    public static String get(HttpRequest request) {
        // Extract id from request
        return DB.Posts.get(id);
    }
}

以上示例只是为了让您了解我要实现的目标。对任何异常的明显检查都被忽略了。

我的问题是:路由 class 将路由哈希映射中的值(字符串)转换为控制器中的方法并调用它。这是一种有效的方法吗?我读到以这种方式调用方法是一种糟糕的编码方式,应该避免,但我不确定如何实现它。每次请求匹配时,路由都会进行此映射,这会减慢应用程序的速度吗?

关于如何以有效方式执行此操作的任何建议或示例都将非常有帮助。

我知道有很多我可以使用的 MVC 框架,但我真的很想澄清以上内容。

预先计算或缓存此信息,因为它是事先已知的:

Class.forName(mapper[0]).getMethod(mapper[1], HttpRequest.class)

所以

this.routes = new HashMap<String, Method>()

导致

routes.get(request.getUri()).invoke(null, request)

它会让你的实施速度更快。

除此之外,这是一个合理的方法。