我正在编写一个非常简单的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();
对于几条路线来说这看起来很好,但似乎不能很好地扩展,也不允许从配置文件中获取路由。
我应该如何运作?
答案 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实现的,因此可能值得阅读(它是开源的,所以你也可以查看源代码)。