在 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)
它会让你的实施速度更快。
除此之外,这是一个合理的方法。
我正在实现一个 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)
它会让你的实施速度更快。
除此之外,这是一个合理的方法。