java解析javascript_Java解析JavaScript數據
最近有一個小小的需求,就是在java中解析javascript腳本,JDK6就已經支持腳本語言了,針對JS有js引擎ScriptEngine。但是我在使用過程覺得用的不是很方便,比較別扭,經研究發現還有一個更強大的腳本引擎-mozilla提供的rhinoJava用ScriptEngine解析腳本javax.script,始於JDK1.6,不過現在只有sun實現的javascript的解析器,難道是
最近有一個小小的需求,就是在java中解析javascript腳本,JDK6就已經支持腳本語言了,針對JS有js引擎ScriptEngine。但是我在使用過程覺得用的不是很方便,比較別扭,經研究發現還有一個更強大的腳本引擎-mozilla提供的
rhino
Java用ScriptEngine解析腳本
javax.script,始於JDK1.6,不過現在只有sun實現的javascript的解析器,難道是因為主要用來解析js語法所以歸類到JEE的范疇?不過基本足夠了,一般的用途主要是能解析通用的表達式就好,比如X >= 1(X作為參數傳入)這樣的表達式,也能利用js的函數語法,創造一個就像java的函數一樣存在於內存中隨時可以被調用的函數,更可以將js中的對象直接轉換成java對象。
Script主要類及接口
ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4個類或接口
ScriptEngineManager是一個工廠的集合,可以通過name或tag的方式獲取某個腳本的工廠並生成一個此腳本的ScriptEngine,目前只有javascript的工廠。通過工廠函數得到了ScriptEngine之后,就可以用這個對象來解析腳本字符串了,直接調用Object obj = ScriptEngine.eval(String script)即可,返回的obj為表達式的值,比如true、false或int值。
CompiledScript可以將ScriptEngine解析一段腳本的結果存起來,方便多次調用。只要將ScriptEngine用Compilable接口強制轉換后,調用compile(String script)就返回了一個CompiledScript對象,要用的時候每次調用一下CompiledScript.eval()即可,一般適合用於js函數的使用。
Bindings的概念算稍微復雜點,我的理解Bindings是用來存放數據的容器。它有3個層級,為Global級、Engine級和Local級,前2者通過ScriptEngine.getBindings()獲得,是唯一的對象,而Local Binding由ScriptEngine.createBindings()獲得,很好理解,每次都產生一個新的。Global對應到工廠,Engine對應到ScriptEngine,向這2者里面加入任何數據或者編譯后的腳本執行對象,在每一份新生成的Local Binding里面都會存在。
ScriptEngine代碼示例
先來看一段JS
vararrclass=newArray();arrclass.push(newClass(20000,"計算機-軟件開發"));arrclass.push(newClass(30000,"計算機-網絡/通訊"));arrclass.push(newClass(10000,"計算機-硬件開發"));arrclass.push(newClass(40000,"計算機-管理"));arrclass.push(newClass(50000,"計算機-品質管理/技術支持"));arrclass.push(newClass(320000,"電子/電器/半導體/儀器儀表"));
java代碼實現解析
publicvoidparseJS(){//1、通過Http請求獲取js的String數據,格式如上StringjsData=getJsData("url");//2、觀察js結構,自定義Class,push到數組中,java中需要定義跟js中的Class的聲明Stringclazz="function Class(classId, className){ this.classId=classId;this.className=className};";//3、初始化ScriptEngineScriptEngineengine=newScriptEngineManager().getEngineByName("javascript");//4、js中未定義返回對象,這里需要將Class數據轉換成字符串的數組返回,個人覺得很別扭,不知道是理解錯誤還是確實如此?//如果不這樣做則直接在js后加上arrclass,cScript.evel()則返回NativeObject對象的數組Stringfun="var result = new Array() ;for(var i=0;i
java代碼中執行js計算
publicvoidjs(){// 創建腳本引擎管理器ScriptEngineManagersem=newScriptEngineManager();// 創建一個處理JavaScript的腳本引擎ScriptEngineengine=sem.getEngineByExtension("js");try{// 執行js公式engine.eval("if(6>5){flag=true;}else{flag =false;}");}catch(ScriptExceptionex){ex.printStackTrace();}//看看我們預期的反饋結果 trueSystem.out.println(engine.get("flag"));}
Java解析JS另一大引擎-Rhino
Rhino是完全用Java編寫的JavaScript的開放源代碼實現。它通常是嵌入到Java應用程序提供給最終用戶的腳本。它被鑲嵌在J2SE6作為默認的Java腳本引擎。
使用Rhino來解析,感覺一切都很清晰明朗.
publicvoidparseJS(){//1、通過Http請求獲取js的String數據,格式如上StringjsData=getJsData("url");//2、定義跟js中的Class的聲明Stringclazz="function Class(classId, className){ this.classId=classId;this.className=className};";//3、初始化ContextContextcx=Context.enter();Scriptablescope=cx.initStandardObjects();Objectresult=cx.evaluateString(scope,clazz+jsData+";arrclass","arrclass",1,null);System.out.println(NativeJSON.stringify(cx,scope,result,null,null));Context.exit();}
更多推荐

所有评论(0)