Java如何与JavaScript脚本交互

勇往直前的胖子 2009-01-14 02:50:11
由于项目需要,要求Java代码操作JavaScript脚本,据我所知,JDK6开始有个什么功能支持这个的,请说明并给出一个例子,谢谢,急
...全文
1331 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pizza1985823 2010-09-06
  • 打赏
  • 举报
回复
都抄袭抢分
lihan6415151528 2009-01-14
  • 打赏
  • 举报
回复
郁闷,这么快就结贴了??
lihan6415151528 2009-01-14
  • 打赏
  • 举报
回复
下面是定义在test.js里面的内容

  function doSth(){

  jf.setSize(500,300);

  jf.setVisible(true);

  jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);

  }

  function getNames(){

  list.add("doSth");

  list.add("getNames");

  return list;

  }

  function testJS(){

  print('Hello world!');

  }



Test.java代码

/*

  * Test.java

  *

  * Created on 2007-9-19, 15:28:49

  *

  * To change this template, choose Tools | Templates

  * and open the template in the editor.

  */

  package lbf.script;

  import java.io.FileReader;

  import java.util.ArrayList;

  import java.util.List;

  import javax.script.Bindings;

  import javax.script.Invocable;

  import javax.script.ScriptContext;

  import javax.script.ScriptEngine;

  import javax.script.ScriptEngineManager;

  import javax.swing.JFrame;

  /**

  *

  * @author hadeslee

  */

  public class Test {

  public static void main(String[] args)throws Exception {

  //根据js的后缀名生成一个解析JS的脚本解析引擎

  ScriptEngine engin=new ScriptEngineManager().getEngineByExtension("js");

  //查询一下这个引擎是否实现了下面很实用的接口

  System.out.println(engin instanceof Invocable);

  //声明两个对象,传入到JS里面去

  JFrame jf=new JFrame("test");

  List list=new ArrayList ();

  //得到挷定的键值对象,把当前的两个JAVA对象放进去

  Bindings bind=engin.createBindings();

  bind.put("jf",jf);

  bind.put("list",list);

  //把挷下的键值对象放进去,作用域是当前引擎的范围

  engin.setBindings(bind, ScriptContext.ENGINE_SCOPE);

  //用引擎执行一段写在JS文件里面的代码

  Object obj=engin.eval(new FileReader("test.js"));

  //这个时候返回值当然 是null了

  System.out.println(obj);

  //把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了

  Invocable in=(Invocable)engin;

  //得到了从JS里面返回来的对象

  List l=(List )in.invokeFunction("getNames");

  System.out.println(l);

  //调用一下定义在JS里面的另一个函数

  in.invokeFunction("testJS");

  //最后调用一个函数,该函数可以使我们前面定义的窗体显示出来

  in.invokeFunction("doSth");

  }

  }



  • 打赏
  • 举报
回复
谢谢两位,1楼的回答正是我要找的,我不是为了ajax的,也谢谢2楼
imasmallbird 2009-01-14
  • 打赏
  • 举报
回复
可以用DWR
能够让浏览器上的javascript方法调用运行在web服务器上java方法
并实现AJAX的效果
liuhua19841201 2009-01-14
  • 打赏
  • 举报
回复
 JDK6.0里面加了一个很实用的包,javax.script,它是JAVA新增的操作脚本的包,利用它我们可以对脚本语言进行操作,比如修改,或者调用,并且可以和JAVA语言交互,如果我们利用好的话,我们利用它来实现一些经常要改的部份,这样我们就可以把一些算法写到js文件里面,然后再在运行的时候读取出来并执行,这样就省去了更改一些东西需要重新编译的过程了.

  下面我们就来看一个例子吧,看看如何在JAVA代码里面操作脚本并调用里面的方法.

  /*

  * Test.java

  *

  * Created on 2007-9-19, 15:28:49

  *

  * To change this template, choose Tools   Templates

  * and open the template in the editor.

  */

  package lbf.script;

  import java.io.FileReader;

  import java.util.ArrayList;

  import java.util.List;

  import javax.script.Bindings;

  import javax.script.Invocable;

  import javax.script.ScriptContext;

  import javax.script.ScriptEngine;

  import javax.script.ScriptEngineManager;

  import javax.swing.JFrame;

  /**

  *

  * @author hadeslee

  */

  public class Test {

  public static void main(String[] args)throws Exception {

  //根据js的后缀名生成一个解析JS的脚本解析引擎

  ScriptEngine engin=new ScriptEngineManager().getEngineByExtension("js");

  //查询一下这个引擎是否实现了下面很实用的接口

  System.out.println(engin instanceof Invocable);

  //声明两个对象,传入到JS里面去

  JFrame jf=new JFrame("test");

  List<String> list=new ArrayList<String>();

  //得到挷定的键值对象,把当前的两个JAVA对象放进去

  Bindings bind=engin.createBindings();

  bind.put("jf",jf);

  bind.put("list",list);

  //把挷下的键值对象放进去,作用域是当前引擎的范围

  engin.setBindings(bind, ScriptContext.ENGINE_SCOPE);

  //用引擎执行一段写在JS文件里面的代码

  Object obj=engin.eval(new FileReader("test.js"));

  //这个时候返回值当然 是null了

  System.out.println(obj);

  //把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了

  Invocable in=(Invocable)engin;

  //得到了从JS里面返回来的对象

  List<String> l=(List<String>)in.invokeFunction("getNames");

  System.out.println(l);

  //调用一下定义在JS里面的另一个函数

  in.invokeFunction("testJS");

  //最后调用一个函数,该函数可以使我们前面定义的窗体显示出来

  in.invokeFunction("doSth");

  }

  }

  下面是定义在test.js里面的内容

  function doSth(){

  jf.setSize(500,300);

  jf.setVisible(true);

  jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);

  }

  function getNames(){

  list.add("doSth");

  list.add("getNames");

  return list;

  }

  function testJS(){

  print('Hello world!');

  }

  我们可以看到,在JAVA运行了以后,窗体会显示出来,并且我们可以接收到从JS解析引擎里面传回的数据,当然我们也可以调用一个很普通的JS函数,想象一下,如果我们把我们程序运行时的一些对象都设到Bindings里面去,那么我们JS岂不是有很大的自由度了吗?因为JS里面也可以操作我们的JAVA对象了,并且我们可以像JAVA编程一样的对JS编程了,还不用再编译,马上就可以运行.灵活性岂不是变得更高了吗?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧