JavaAdapter

rhimoo这个项目旨在用javascript来写服务器端,有点rhino on rails的意思。目前看来它还是一个刚初始的项目,但是已经可以正常运行demo了。demo包括用javascript配置并启动的jetty,和一个jjsp分析器。
我的兴趣只在研究它的源代码。

关于rhino的性能,我通过这几天研究把一部分动态配置部分用rhino实现,发现只要调整jvm参数Xmx=Xms,其整体性能约为纯java的75%,我没有拿N皇后问题来测试,那个并不客观。

我应用rhino的部分并不像rhimoo这样,让javascript来做所有事情,我只是让它做一些资源配置,让用户实现我的api,而api中你可以去写javascript的方法。就好像Facebook F8那样。

这样做的目的是减少javascript带来的性能损失,代价是我需要在javascript中创建很多种java对象。我的做法是这样:
Context cx = Context.enter();
Scriptable scope = new ImporterTopLevel(cx);
cx.evaluateReader(scope, getResource("mootools/mootools-server-1.2-1331.js"), "mootools-server", 1, null);
cx.evaluateReader(scope, getResource(context + ".js"), context, 1, null);
cx.evaluateReader(scope, getResource("bootstrap.js"), "bootstrap", 1, null);
...

用bootstrap来做一些翻译工作。

前几天因为这个不是主要矛盾,我就图省事把这些bean的getter,setter去掉,直接上public的字段。这样$extend(new klass(), options)就可以了。
后来,需要方法注入了,就把options遍历一下,从中map出$type=='function'的,然后再把class改成abstract的,最后用new klass({})就是了。
今天发现要这么乱改的类还真不少,而且这样做实在是丑陋哇

好吧,研究一下rhimoo,才发现它是用
new JavaAdapter(ServletHolder, {
    newInstance: function () {
        var servlet = new JavaAdapter(MooServletTemplate, methods);
        servlet.initialize();
        return servlet;
    }
});

来新建ServletHolder的,查了一下什么是JavaAdapter,好么,我后来做的遍历注入abstract就算白做了。一气做好了setter,把它们再改回正常面目。
最后发现c3p0的ComboPooledDataSource不能用JavaAdapter,原因嘛,它是final的。java可真是安全 咋办涅,计算它是不是final类有点过分了,干脆给一个参数得啦。
var $adapt = function(klass, options, f) {
    var instance = $chk(f) ? new klass() : new JavaAdapter(klass, options);
    for (var k in options) {
        var value = options[k];
        if ($type(value) == 'function') continue;
        try {
            instance[k] = value;
        } catch(e1) {
            try {
                var setter = 'set' + k.capitalize();
                instance[setter](value);
            } catch(e2) {
            }
        }
    }
    return instance;
}

你可能感兴趣的:(JavaScript,servlet,Rails,Facebook,mootools)