javascript嵌入java_如何把java代码嵌入到javascript中

展开全部

随着java6.0的出现,向java嵌入javascript脚本变的特别32313133353236313431303231363533e4b893e5b19e31333332623966容易。java6引入了一个新的javax.script包,为脚本化语言提供了一个通用接口。

java中嵌入javascript脚本的思路:

1.取得脚本解释器的管理器Manager

2.从管理器中取得js的解释器实例ScriptEngine

3.取得存储javascript变量的Bindings实例

4.把一个java.io.Reader流及Bindings传递给ScriptEngine的eval()方法,从而运行存储在外部文件中的脚本。eval()方法返回脚本运行结果,如果执行中发生错误,会抛出ScriptException异常。

例:运行javascript脚本的一个java程序import java.io.*; import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class RunScript { public static void main(String[] args) throws IOException{ ScriptEngineManager scriptManager = new ScriptEngineManager();//得到解释器的管理器,里面有很多种脚本解释器 ScriptEngine js = scriptManager.getEngineByExtension("js");//从管理器中获取js的解释器 //定义我们要运行的脚本文件 String filename = null; //通过解释器来获得存储javascript变量的Bindings的实例,使它们提供给脚本。 Bindings bindings = js.createBindings(); //处理参数,参数是定义的脚本的变量。参数可能包括-Dname/value对。我们要进行处理,任何参数不能以‘-D’为文件名开始 for(int i = 0;i

例:一个解释JavaScript表达式的Java配置文件工具

import javax.script.*; import java.util.*; import java.io.*; //这个类像java.util.Properties ,但是允许属性值执行javascript表达式 public class Configuration { Map defaults = new HashMap(); //在map中获取和设置值的方法 public Object get(String key){ return defaults.get(key); } public void put(String key,Object value){ defaults.put(key, value); } //从map的name/value对中获取初始化内容。如果一个值在大括号内,表示是一个javascript脚本,计算它 public void load(String filename) throws IOException,ScriptException{ //获得javascript编译器 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByExtension("js"); //使用我们的name/value对(即javascript变量) Bindings bindings = new SimpleBindings(defaults); //创建一个变量,用于存放脚本执行的内容 ScriptContext context = new SimpleScriptContext(); //设置那些Bindings 在Context 中,使它们可读。但这样的变量定义的脚本不要放入我们的Map中 context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE); BufferedReader in = new BufferedReader(new FileReader(filename)); String line; while((line=in.readLine())!=null){ line = line.trim(); if(line.length()==0) continue;//跳过空行 if(line.charAt(0)=='#')continue;//跳过命令 int pos = line.indexOf(":"); if(pos == -1){ throw new IllegalArgumentException("syntax:"+line); } String name = line.substring(0,pos).trim(); String value= line.substring(pos+1).trim(); char firstchar = value.charAt(0); int len = value.length(); char lastchar = value.charAt(len-1); if(firstchar=='"'&&lastchar=='"'){ //双引号引用的值为字符串 defaults.put(name, value.substring(1,len-1)); }else if(Character.isDigit(firstchar)){ //如果开始是一个数字 try{ double d = Double.parseDouble(value); defaults.put(name, value); }catch (NumberFormatException e) { //没有数字,是一个string defaults.put(name, value); } }else if("true".equals(value)){//处理布尔值 defaults.put(name,Boolean.TRUE); }else if("false".equals(value)){ defaults.put(name, Boolean.FALSE); }else if("null".equals(value)){//处理null值 defaults.put(name, null); }else if(firstchar=='{'&&lastchar=='}'){ //如果值是在一对大括号之内,则执行javascript代码 String script = value.substring(1,len-1); Object result = engine.eval(script,context); defaults.put(name, result); }else{ //其它情况,刚好是一个字符串 defaults.put(name, value); } } } //一个简单的类的测试程序 public static void main(String[] args) throws IOException,ScriptException{ Configuration defaults = new Configuration(); defaults.load(args[0]); Set> entryset = defaults.defaults.entrySet(); for(Map.Entry entry:entryset){ System.out.printf("%s:%s%n",entry.getKey(),entry.getValue()); } } } 资料来源:javaeye,参考: http://www.javaeye.com/topic/348160

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值