1

我正在编写一个非常简单的 Web 框架,使用 Java servlet 进行学习。我以前在 PHP 中做过这个,它通过查询请求 URI,然后实例化适当的类和方法来工作。

这在 PHP 中运行良好,因为可以执行类似$c = new $x; $x->$y;. 但是,我不确定如何将其转换为 Java,或者即使这是一种合适的方法。

到目前为止,我已经尝试过:

Router router = new Router(request.getPathInfo());
String className = router.route(); //returns com.example.controller.Foo

Class c = Class.forName(className);
Object x = c.newInstance();

Foo y = (Foo) x;
y.doSomething();

这对于一些路由来说似乎很好,但它似乎不能很好地扩展,也不允许从配置文件中获取路由。

我应该如何使它工作?

4

4 回答 4

2

在key 代表请求方法和请求路径信息的组合的Map<String, Action>地方获取操作。String我之前在这里发布过类似的答案:Java Front Controller

您可以静态(硬编码所有操作)或动态(约定优于配置,在特定包中查找类,或扫描整个类路径以查找具有特定注释或实现特定接口的类)填充这样的映射。

并且坚持使用 Servlet。过滤器不在那里。最高使用它将请求转发到控制器 Servlet。在 Servlet 中,只需实现HttpServlet#service().

于 2010-02-10T11:40:04.570 回答
2

我会使用 Servlet 过滤器作为前端控制器。路由器会将路径与请求调度程序连接起来。在 doFilter 方法中,您将 ServletRequest 转换为 HttpServletRequest,提取请求路径并将其与注册的映射进行匹配。此映射的结果是一个请求调度器,您将使用它来调度请求。

在伪代码中:

doFilter(ServletRequest request, ServletResponse response) {
  httpServletRequest = (HttpServletRequest) request;
  path = httpServletRequest.getRequestURI();
  dispatcher = router.getTarget(path);
  dispatcher.dispatch(request, response);
}

根据您的需要,Servlet API 的默认路由机制可能就足够了。

于 2010-02-10T09:12:15.410 回答
0

Not quite sure what you're after but you might want to take a look at Java servlets. Granted many web frameworks are abstracted above plain servlets, but it's a jolly good place to start learning about Java web apps if you ask me (which indirectly you did ;) )

Download the Java servlet specification here: Java Servlet Spec - it's quite interesting.

于 2010-02-10T08:59:38.783 回答
0

你应该如何让它发挥作用?但是你想要它。如果您只是为了学习目的而这样做,那么无论您做什么都可以。

我建议您的所有操作都实现相同的接口(也许扩展 Servlet),这样您就不必在所有不同的类中进行编译。

然后你基本上可以做你正在做的事情,除了你的演员表Foo变成了演员表Servlet,然后你不必为所有不同的课程设置特殊情况。

然后,您还可以从配置(可能是 XML 文件)加载路由。

本质上,您正在做的事情是由Struts 1 框架实现的,因此可能值得一读(它是开源的,因此您也可以根据需要查看源代码)。

于 2010-02-10T09:03:28.963 回答