六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 27|回复: 0

JavaScript在Java里执行?

[复制链接]

升级  7.33%

62

主题

62

主题

62

主题

举人

Rank: 3Rank: 3

积分
222
 楼主| 发表于 2013-1-23 02:56:09 | 显示全部楼层 |阅读模式
       好久没去IBM的developerworks了,今天去看了下,发现这么个新鲜的东东: Java6.0中支持JavaScript. 呵呵, 有意思, 试试,于是在eclipse里照着IBM里的教程小跑了下那个程序,出结果了. 其中Java程序如下:
 
public class ScriptDemo  { public static void main(String args[]) throws Exception {        // Get the JavaScript engine        ScriptEngineManager manager = new ScriptEngineManager();        ScriptEngine engine = manager.getEngineByName("JavaScript");        // Set JavaScript variables        Bindings vars = new SimpleBindings();        vars.put("demoVar", "value set in ScriptDemo.java");        vars.put("strBuf", new StringBuffer("string buffer"));                // Run DemoScript.js        Reader scriptReader = new InputStreamReader(          ScriptDemo .class.getResourceAsStream("DemoScript.js"));        try {            engine.eval(scriptReader, vars);        } finally {            scriptReader.close();        }                // Get JavaScript variables        Object demoVar = vars.get("demoVar");        System.out.println("[Java] demoVar: " + demoVar);        System.out.println("    Java object: " + demoVar.getClass().getName());        System.out.println();        Object strBuf = vars.get("strBuf");        System.out.println("[Java] strBuf: " + strBuf);        System.out.println("    Java object: " + strBuf.getClass().getName());        System.out.println();        Object newVar = vars.get("newVar");        System.out.println("[Java] newVar: " + newVar);        System.out.println("    Java object: " + newVar.getClass().getName());        System.out.println();    }} 要执行的javaScript如下:
 
println("Start script \r\n");// Output the type of an objectfunction printType(obj) {    if (obj.getClass)        println("    Java object: " + obj.getClass().name);    else        println("    JS object: " + obj.toSource());    println("");}// Print variableprintln("[JS] demoVar: " + demoVar);printType(demoVar);// Call method of Java objectstrBuf.append(" used in DemoScript.js");println("[JS] strBuf: " + strBuf);printType(strBuf);// Modify variabledemoVar = "value set in DemoScript.js";println("[JS] demoVar: " + demoVar);printType(demoVar);// Set a new variablevar newVar = { x: 1, y: { u: 2, v: 3 } }println("[JS] newVar: " + newVar);printType(newVar);println("End script \r\n"); 
   运行后是出结果了, 但发现一些问题,想了想也没解决,写在这里希望能有更多的人一起来讨论:
      1, javaScript里的println是谁的方法? Java的? 还是JavaScript里的? 好像是Java的, 是像在jsp里可能直接访问application等这些对象那样可以直接调用System.out的println方法? 都还有什么Java方法可以在JavaScript里直接调用? 这些方法在javaScript文件中怎么就不能再在浏览器直接运行javaScript方法那样了吧? 毕竟浏览器是不认识方法println的.另外看来也是完全像在Java里那样调用StringBuffer里append方法: strBuf.append(" used in DemoScript.js");  那能不能这样: 在一个辍名为js的文件里写的全是java语句,再在别的真正Java程序里eval这个貌为js的Java文件,这样岂不是达到了动态编译的目地?像在JavaScript里的eval那样.
     2, printType方法的obj.getClass看起来既熟悉又陌生: 熟悉的是在Java里我们可以调用一个对象的getClass()来获得它的类信息,陌生的是这个调用没有一个方法应有的明显特征括号.又是在javaScript里可以按javascript的语法特性来调用Java里的方法: 也就是把Object类的getClass方法当成JavaScript里的一个属性.接下来又有obj.getClass(),是不是说即可以以Java的语法来调用也可以模仿JavaScript里的语法特性来调用?
    3, 是不是在背后Java与JavaScript的过滤上有个类似于jsp里的pageContent这样的一个对象来作为一些临时变量的中转站?
    4, 这样的feature能有什么具体的用处?会像Java与groovy的结合那样来做到不启动服务器就可以直接来更改需求?IBM的教程里有这样一句话"If your script implements all the methods of a Java interface, you can also use getInterface() to obtain a Java object whose methods are coded in the scripting language. "是否就意味着可以用javaScript来实现Java里的一个接口? 那么这个接口的实现具体又有什么语法新特性? 不会在javaScript里出现关键字implements吧? getInterface()调用返回的接口怎么指定? 也就是说JVM怎么知道能有什么接口可以get?
    5, 是不是会有人根据这个特性写一个更加灵活的web开发框架?  
    6, JDK6.0中有了这个对JavaScript的支持,是否会像当初Ajax那样掀起JavaScript学习使用热潮?
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表