Nashorn VS GWT

原创
2014/03/31 21:59
阅读数 655

    在JavaScript风靡的时代,很多语言都想和它发生点关系,以便可以让自己看的更加的简单和高效。然而并不是所有的JavaScript引擎都设计地很合理和简单。这里将介绍两款将Java转化为JavaScript的工具。他们一个是新星,一个是业界老大哥。

    GWT的出现是为了解决JavaScript无法编译,不易调试的问题,开发人员通过编译运行Java代码,就可以轻松地生成复杂高效的JS代码,并不需要再通过浏览器的调试而是编译调试Java来替代。同时,GWT的RPC性能也十分优越,可以调用远程方法完成本地AJAX客户端的开发。在本地JNI代码中直接使用JavaScript对象也是他的一大特色。看下面的代码:

1  GWT通过jsni调用内部js

Button button = new Button("java调用内部jsni的js方法");  
        button.addClickHandler(new ClickHandler() {  
              
            @Override  
            public void onClick(ClickEvent event) {  
                //gwt中java调用js方法  
                execute("js方法被调用");  
                  
            }  
        });  
/** 
     * JSNI方法 
     * @param id 
     */  
    public static native void execute(String str) /*-{ 
        alert(str); 
    }-*/;

2  内部js通过jsni调用java方法

Button button1 = new Button("内部jsni的js调用java方法");  
        button1.addClickHandler(new ClickHandler() {  
              
            @Override  
            public void onClick(ClickEvent event) {  
                //gwt中java调用js方法  
                executeJs("java方法被调用");  
                  
            }  
        });  
    /** 
     * JSNI方法,  里面调用java方法 javaAlert 
     * @param id 
     */  
    public static native void executeJs(String str) /*-{ 
        @com.hw.client.TestCall::javaAlert(Ljava/lang/String;)(str); 
    }-*/;

    这两段代码演示了GWT中Java与JS语言之间的相互调用,通过jsni--gwt的js本地接口。说白了,就是在Java中写JS代码,很酷吧。

    现在看下Nashorn的表现。Nashorn是运行在JVM上的Javascript引擎。主要用于实现服务器端的js,这一点和node.js很像(顺便说一句,oracle已经有了它自己的Node.js实现,叫Node.jar)。他可以实现js与java对象和方法的互相调用,真正实现了java与js的互通有无的功能。

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
 
String js;
 
js = "var map = Array.prototype.map \n";
js += "var names = [\"john\", \"jerry\", \"bob\"]\n";
js += "var a = map.call(names, function(name) { return name.length() })\n";
js += "print(a)";
 
engine.eval(js);

js += "var a = map.call(names, function(name) {
return Java.type("LambdaTest”).wrap(name.length())
})";

    上面两段代码展示了Nashorn的使用方法。工厂方法模式设计的引擎管理器从堆中找出名为Nashorn的引擎。然后就可以通过eval函数输出js代码。并且在lambda表达式中返回他的类型。

    综上所述,两者都是实现了java对象与js对象的共享。实现了后台向前端的技术迁移,也告诉了我们今后的领域发展方向:一切皆为JavaScript~



展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部