如何在Java中实现前端控制器?

时间:2010-02-10 08:55:33

标签: java servlets java-ee front-controller

我正在编写一个非常简单的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 个答案:

答案 0 :(得分: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的默认路由机制就足够了。

答案 1 :(得分:2)

获取Map<String, Action>中的String行动,其中HttpServlet#service()键代表的请求方法和请求路径信息的组合更少或更多。我在此之前发布了类似的答案:Java Front Controller

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

坚持使用Servlet。过滤器不适合。最高使用时,转发请求到控制器Servlet。在Servlet中,只需实现{{1}}。

答案 2 :(得分:0)

不太清楚你在追求什么,但你可能想看看Java servlet。许多Web框架都是在普通servlet之上抽象的,但是如果你问我(你间接地做了什么,那么)它是开始学习Java web应用程序的一个快乐的好地方。)

在此处下载Java servlet规范:Java Servlet Spec - 非常有趣。

答案 3 :(得分:0)

你应该如何运作?但是你想要它。如果你只是为了学习目的而做,无论你做什么都没关系。

我建议让你的所有动作实现相同的接口(可能扩展Servlet),这样你就不必在所有不同的类中编译。

然后你可以基本上做你正在做的事情,除了你对Foo的演员成为Servlet的演员,然后你不必为所有不同的班级都有特殊情况

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

基本上你正在做的是由Struts 1 framework实现的,因此可能值得阅读(它是开源的,所以你也可以查看源代码)。