之前做了个Java项目MockSocks,要做UI,用Swing写实在是又low又费劲,跟前端同事聊起node-webkit,觉得很不错。但是我大部分业务都在Java上,于是就涉及到Java与js通信问题。
当然最常用的解决方案就是用Java写一个Web后端。但是这样解决太重,大部分时间都要花费在web的配置上,最终还要使用一个容器去启动它,程序流程也无法由我来控制了。
其实挺喜欢JMX的控制方式,只是用其他语言连接它成本有点高。于是就想仿照JMX的方式写一个Web Server,同时可嵌入到应用中。直接使用Jetty又太原生态了,URL路由/参数映射和转换总是要做的,于是参考了express的语法,就有了一个非常小的Web框架express.java。
本来开始雄心勃勃的要用netty自己写一个,但是后来遇到尴尬的地方:自己写一套HttpMessage类,设计API其实挺麻烦的,设计得好更是需要时间。如果要重用HttpServletRequest/Response呢,实现起来又太费劲。于是后来还是直接用Jetty写了,就不重复造轮子了。
Web框架已经到了汗牛充栋的地步,所以也没想跟谁谁比,完成的是自己的需求就够了。这东西不支持任何servlet规范(HttpServletRequest/Response两个对象基于servlet 3.0),要的就是简单。
这个WebServer可以在程序内启动,由UrlRouter
来完成路由,并路由到对应的Controller
上。比较大的特色就是支持动态增加Controller和映射,这样对于新增是非常方便的。例如我有个service里有个状态count
,那么我可以这么写:
<!-- lang: java -->
public class ServiceMonitor {
private int count;
private WebServer webServer;
public ServiceMonitor(WebServer webServer) {
this.webServer = webServer;
monitor();
}
private void monitor() {
webServer.get("/service/count", new AjaxController() {
@Override
public Object ajax(ParamMap params) {
return ResultMap.create().put("count", count);
}
});
}
public static void main(String[] args) throws Exception {
WebServer server = WebServer.jettyServer().port(8080);
ServiceMonitor serviceMonitor = new ServiceMonitor(server);
server.start();
for (int i = 0; i < 1000; i++) {
serviceMonitor.count = i;
Thread.sleep(1000);
}
}
}
当然这样分散式分配其实会带来一些url的管理问题,不过小项目呢,应该是更方便了。没有想过用这个写web应用,所以目前的定位就是这样子了。