溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java里面怎么運(yùn)行JS

發(fā)布時(shí)間:2021-12-29 09:55:09 來源:億速云 閱讀:173 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“Java里面怎么運(yùn)行JS”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java里面怎么運(yùn)行JS”吧!

1、開始環(huán)境構(gòu)建

Java自JDK1.6以來,就支持JS的腳本執(zhí)行,首先通過初始化腳本引擎管理器,通過這個管理器獲取對應(yīng)腳本的執(zhí)行引擎,如下:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");

到這個地方,這個engine對象我們就可以隨時(shí)隨地的使用,下面開始幻化吧

2、Hello World

先從一個基本的程序開始,輸出我們熟悉的Hello World

    String script = "function hello(name) { return 'Hello,' + name;}";
        engine.eval(script);
        Invocable inv = (Invocable) engine;
        String res = (String) inv.invokeFunction("hello", "World");
        System.out.println("res:" + res);

第一行就是一個標(biāo)準(zhǔn)的JS函數(shù),入?yún)ame,返回Hello+name這樣一個形式
第二行就是把這個函數(shù)置入到引擎環(huán)境中
第四行調(diào)用hello方法,傳入?yún)?shù)World,并且將返回值強(qiáng)制為String類型

3、變量

在引擎中設(shè)置一個變量有兩種,第一是從java語言調(diào)用engine的put方法

engin.put("name","zhangsan")

第二種是在腳本里面var一個變量,再在engine里面進(jìn)行配置

engin.eval("var name=lisi;");

在和Java打交道的時(shí)候,更多從Java方面獲取對象參數(shù),然后到JS里面去運(yùn)算;所以在JAVA里面把變量準(zhǔn)備好,包括入?yún)⒑统鰠⒍歼M(jìn)行設(shè)定,然后在JS使用這些變量,當(dāng)然也可以傳入?yún)?shù),輸出復(fù)雜對象最好是設(shè)定一個變量。舉個例子:

    //對上面的方法進(jìn)行擴(kuò)展
    Map<String, Object> map = new HashMap<String, Object>();//一個哈希表
        map.put("a", "abc");//向哈希表增加一個元素
        engine.put("map", map);//把這個哈希表丟到JS引擎中去
        //執(zhí)行一段JS腳本,作用是把一個鍵值對為currentTime和當(dāng)前時(shí)間丟到哈希表
        engine.eval("map.put('currentTime','20161022');");
        Student student=new Student();//這是一個普通的POJO
        student.setAge(12);
        student.setName("張三");
        engine.put("student", student);

        String script = "function hello(name) { return 'Hello,' + map.get('currentTime')+map.get('a')+student.getName();}";

        engine.eval(script);
        Invocable inv = (Invocable) engine;
        String res = (String) inv.invokeFunction("hello", "World");

        System.out.println(res);

4、JS里面使用JDK

在JS腳本里面使用JDK的方法需要增加Packages后面包名、類和類的方法

    String js = "function getUUID(){var f=Packages.java.util.UUID.randomUUID();print(f)}";
        engine.eval(js);
        Invocable inv = (Invocable) engine;
        inv.invokeFunction("getUUID");

很多時(shí)候,JS的功能不如Java強(qiáng)大,而這種JS中使用JAVA方法顯得非常重要

5、JSON

JSON 作為對象的組織者介于JAva和JavaScript之間都能比較好的傳輸數(shù)據(jù)、組裝數(shù)據(jù),我們使用第三方JSON處理包來做一個例子

    String jsonStr="{'key':'value','SubSets':[{'x':'abc'},{'y':'edf'}],'random':Math.random()},{'other':'info'}";
        JSONObject json=new JSONObject(jsonStr);    //        engine.put("json", json);
        String script = "function hello(json) { return 'Hello,' 
        + json.getJSONArray(\"SubSets\").getJSONObject(0).get(\"x\").toString();}";
        engine.eval(script);
        Invocable inv = (Invocable) engine;
        String res = (String) inv.invokeFunction("hello", json);
        System.out.println(res);

首先是一個比較復(fù)雜的JSON對象,使用org.json.JSONObject進(jìn)行封裝,作為入?yún)鬟f進(jìn)入JS引擎的hello方法,該方法對JSON對象進(jìn)行解析也是利用org.json.JSONObject的方法。

6、實(shí)現(xiàn)Java接口

JS實(shí)現(xiàn)java的接口,來完成具體業(yè)務(wù)

    String script = "var obj = new Object();obj.run = function() { println('執(zhí)行具體方法==='+name);}";
        engine.put("name", "全局參數(shù)");
        engine.eval(script);
        Object obj = engine.get("obj");
        Invocable inv = (Invocable) engine;
        Runnable r = inv.getInterface(obj, Runnable.class);
        Thread th = new Thread(r);
        th.start();

此處使用Runnable接口開啟一個新的線程,具體的業(yè)務(wù)邏輯封裝在JS里面,業(yè)務(wù)需要返回值可以自定義一個接口,比如
public ReturnObj execute();,那么JS里面的obj.execute方法就是具體干活的地方。

7、其他

JS里面手動清除一個變量,或者對象使用delete方法

var a=10;
a;//出現(xiàn)10delete(a);
a;//出現(xiàn)Uncaught ReferenceError: a is not defined

感謝各位的閱讀,以上就是“Java里面怎么運(yùn)行JS”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java里面怎么運(yùn)行JS這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI