今天主要是想通過一個例子還說明怎樣用java代碼來調用javascript中的函數
我們首先的自己先建立一個文本文件,然後編寫一個javascript函數,並保存文件,可以改後綴名爲.js,例如我們的例子裏面就寫入一個這樣的函數:
function cal(var1,var2)
{
return var1+var2-factor;
}
然後我們開始寫java代碼,java代碼主要爲以下部分:
package suggestion16;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptText {
public static void main(String[] args) throws FileNotFoundException, ScriptException, Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
Bindings bind = engine.createBindings();
bind.put("factor", 2); //這裏綁定一個factor的值爲2.
engine.setBindings(bind,ScriptContext.ENGINE_SCOPE);
Scanner input = new Scanner(System.in);
while(input.hasNext())
{
int first = input.nextInt();
int sec = input.nextInt();
System.out.println("輸入的參數爲:"+ first+ " , " + sec);
engine.eval(new FileReader("E:/cal.js"));
if(engine instanceof Invocable)
{
Invocable in = (Invocable)engine;
Double result = (Double)in.invokeFunction("cal",first,sec);
System.out.println("運算結果爲:" + result.intValue());
}
}
}
}
其中的“E:/cal.js”就是我們js文件的保存路徑。並且這個主函數可以循環的輸入。
我們運行一下這個程序得到的結果如下:
1
2
輸入的參數爲:1 , 2
運算結果爲:1
上面也就是 調用了 1 + 2 - 2 = 1 ,所以結果爲1
我們將js文件中的function方法改變下,改編爲下面的函數:
function cal(var1,var2)
{
return var1+var2*factor;
}
我們保存js文件,然後再繼續在運行的程序中輸入我們要計算的數字,(注意:這裏不需要重新啓動程序,因爲輸入時循環輸入的)
我們再來看這個輸出的結果:
1
2
輸入的參數爲:1 , 2
運算結果爲:5
我們看到我們得到的結果爲5,我們發現程序調用了我們修改後的js文件中函數,也就是調用方式爲 1 + 2 * 2 = 5 所以我們得到的結果爲5。
這個結果我們是否覺得有點神奇呢,我們一般的java程序在運行後,它在這次的運行中輸入相同的值結果應該是不變的,但是這個程序在運行同一個程序的時候輸入相同值但是得到的結果變化了,這主要是javascript指解釋性語言,當程序需要用到js中的function的時候他纔去解釋執行這個函數,但是我們的function函數已經變化了,所以它就加載執行改變後的js代碼,所以得到的就是我們有點意外的結果。
這樣的優勢是我們在有的應用中不需要重新啓動程序就可以改變它的業務邏輯,這樣在實時系統中會有比較重要的應用。