JAvascript javaプログラムに埋め込む

6056 ワード

Java 6.0の出現に伴い、javaへのjavascriptスクリプトの埋め込みが特に容易になった.JAva 6は、スクリプト化言語に共通のインタフェースを提供する新しいjavax.scriptパッケージを導入しました.
JAvaにjavascriptスクリプトを埋め込む考え方:
1.スクリプト解釈器を取得するマネージャマネージャ
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 String arg = args[i];
if(arg.startsWith("-D")){// “-D” ,
int pos = arg.indexOf('=');
if(pos == -1) usage();
String name=arg.substring(2,pos);
String value= arg.substring(pos+1);
// : , , java.lang.Number , java.lang.Boolean, Java NULL, 。
bindings.put(name, value);// bindings
}else{
if(filename!=null)usage();
filename=arg;
}
}
// 。
if(filename==null){
usage();
}
// , 。
bindings.put(ScriptEngine.FILENAME, filename);
//
Reader in = new FileReader(filename);
try{
// 。 in js , bindings
Object result = js.eval(in,bindings);
System.out.println(result);
}catch(ScriptException ex){
//
System.out.println(ex);
}
}
static void usage(){
System.err.println("Usage: java RunScript[-Dname=value...] script.js");
System.exit(1);// 。 System.exit(0);
}
}
このコードで作成されたBindingsオブジェクトは静的ではなく、JavaScriptスクリプトで作成されたすべての変数がここに格納されます.以下に、Javaをスクリプト化するより実用的な例を示します.Bindingsオブジェクトは、その変数を読み取ることができるように、より高い役割ドメインを持つScriptContextオブジェクトに格納されますが、新しい変数はBinhdingsオブジェクトに格納されません.この例では、名前/値ペアを定義するための簡単なプロファイルツール、すなわちテキストファイルを実現します.ここで定義したコンフィギュレーションクラスでクエリーできます.値は文字列、数値、またはブール値であり、値がカッコに含まれている場合はJavaScript解釈器に渡されて計算されます.JAva.util.Mapオブジェクトは、SimpleBindingsオブジェクトにパッケージされた値を保存します.これにより、JavaScript解釈器は、同じファイルで定義されている他の変数の値にもアクセスできます.
例: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());
}
}
}