用java代碼運(yùn)行js的 如何運(yùn)行js代碼

如何在java中調(diào)用js方法

js代碼如下:

羅田網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),羅田網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為羅田成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的羅田做網(wǎng)站的公司定做!

[javascript] view plain copy

function formula(var1,var2){

return var1+var2-factor;

}

java代碼如下:

[java] view plain copy

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 AboutJavaScript {

public static void main(String[] args) throws Exception {

ScriptEngine engine=new ScriptEngineManager().getEngineByName("javascript");

Bindings bind = engine.createBindings();

bind.put("factor", 1);

engine.setBindings(bind, ScriptContext.ENGINE_SCOPE);

Scanner input=new Scanner(System.in);

while (input.hasNextInt()) {

int first= input.nextInt();

int sec=input.nextInt();

System.out.println("輸入?yún)?shù)是:"+first+","+sec);

engine.eval(new FileReader("F:/model.js"));

if(engine instanceof Invocable){

Invocable in =(Invocable) engine;

Double result=(Double) in.invokeFunction("formula", first,sec);

System.out.println("運(yùn)行結(jié)果:"+result.intValue());

}

}

}

}

java程序中運(yùn)行js腳本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

public class ExecJs {

/**

* 記錄日志類

*/

private Logger log = Logger.getLogger(ExecJs.class);

/**

* 后置處理,執(zhí)行js腳本

* @param js

* @throws Exception

*/

public void execJs(String js, MapString,Object map) throws Exception {

if (log.isDebugEnabled()) {

log.debug("execJs js : " + js);

IteratorEntryString, Object it = map.entrySet().iterator();

while (it.hasNext()) {

EntryString, Object entry = (EntryString, Object) it.next();

log.info("EXECJS MAP : " + entry.getKey() + "---" + entry.getValue());

}// end while

}// end if

if ("".equals(js) || js == null) {

log.info("EXECJS ERROR : JAVASCRIPT CONTENT IS NULL");

} else if(map == null || map.size()=0){

log.info("EXECJS ERROR : MAP CONTENT IS NULL");

} else {

// 獲取腳本引擎

ScriptEngineManager mgr = new ScriptEngineManager();

ScriptEngine engine = mgr.getEngineByName("javascript");

// 綁定數(shù)據(jù)

ScriptContext newContext = new SimpleScriptContext();

Bindings bind = newContext.getBindings(ScriptContext.ENGINE_SCOPE);

bind.putAll(map);

try {

engine.setBindings(bind, ScriptContext.ENGINE_SCOPE);

engine.eval(js);

} catch (Exception e) {

log.info("EXECJS EXCEPTION : EXECUTE JAVASCRIPT EXCEPTION", e);

throw (e);

}// end try

}// end if

}

}

如何通過(guò)java代碼調(diào)用js

JDK1.6版添加了新的ScriptEngine類,允許用戶直接執(zhí)行js代碼。

在Java中直接調(diào)用js代碼

不能調(diào)用瀏覽器中定義的js函數(shù),會(huì)拋出異常提示ReferenceError: “alert” is not defined。

package com.sinaapp.manjushri;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

import javax.script.ScriptException; /** * 直接調(diào)用js代碼 */

public class ScriptEngineTest {

public static void main(String[] args) {

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("javascript");

try{

engine.eval("var a=3; var b=4;print (a+b);");

// engine.eval("alert(\"js alert\");"); // 不能調(diào)用瀏覽器中定義的js函數(shù) // 錯(cuò)誤,會(huì)拋出alert引用不存在的異常

}catch(ScriptException e){

e.printStackTrace();

}

}

}

請(qǐng)問(wèn)怎么寫(xiě)java調(diào)用node環(huán)境運(yùn)行js代碼?

nodejs 運(yùn)行代碼可以在命令行中使用命令“ node /path/xxx.js ”來(lái)執(zhí)行

所以我們可以借助 java 的 Runtime 類,可以執(zhí)行系統(tǒng)本地的命令, 例如:

Linux系統(tǒng)下:Runtime.getRuntime().exec("node /path/xxx.js");

Window系統(tǒng)下:Runtime.getRuntime().exec("cmd /c node /path/xxx.js");

當(dāng)然推薦使用 Apache-Commons-Exec 工具類,可以屏蔽不同系統(tǒng)命令差異,并且獲取結(jié)果更簡(jiǎn)單

工具類使用可以參考此文:?網(wǎng)頁(yè)鏈接

java怎樣調(diào)用js

首先java和js是完全兩碼事

兩個(gè)的運(yùn)行是不相干的

java是后臺(tái)程序 運(yùn)行在服務(wù)器上 而js則是生存在客戶端瀏覽器(如ie)

只能是js間接調(diào)用java

過(guò)程是:js在客戶端瀏覽器上運(yùn)行,然后js讓瀏覽器發(fā)送請(qǐng)求到服務(wù)器,然后服務(wù)器上的中間件(如tomcat)來(lái)把瀏覽器的請(qǐng)求(httpRequest)轉(zhuǎn)交給java程序來(lái)處理。 典型的例子就是用js執(zhí)行submit()提交表單到服務(wù)器和js生成ajax對(duì)象然后通過(guò)ajax對(duì)象把信息發(fā)送給服務(wù)器。 即js借助瀏覽器來(lái)達(dá)到間接調(diào)用后臺(tái)java程序的功能。

反過(guò)來(lái)就不行了

由于http協(xié)議是無(wú)狀態(tài)的,不像java與數(shù)據(jù)庫(kù)那樣有保持著的連接,數(shù)據(jù)庫(kù)是知道當(dāng)前有誰(shuí)再連接著自己的,而java程序所在的服務(wù)器是無(wú)法直接溝通客戶端瀏覽器的,他壓根就不知道客戶端在哪,也因此無(wú)法去和運(yùn)行在客戶端的js聯(lián)系。

你如果想調(diào)用這個(gè)EncodePwd(uin,psw), 只能是在客戶端瀏覽器上觸發(fā)這個(gè)方法(例如提交按鈕)然后把信息發(fā)送到服務(wù)器端。

其實(shí)還有一種技術(shù),即“服務(wù)器推送”,這個(gè)大概可以實(shí)現(xiàn)你的想法,這是個(gè)新興技術(shù),用于由服務(wù)器直接把數(shù)據(jù)發(fā)送給客戶端,而不需要客戶端不停的用ajax來(lái)訪問(wèn)服務(wù)器。但是我想這個(gè)應(yīng)該不是你想要的東西。

Java調(diào)用JS腳本里的方法

;?? 本例子使用了JDK 以上的javax script包 通過(guò)Invocable接口實(shí)現(xiàn)JAVA調(diào)用JS腳本里的方法 本例中調(diào)用分為內(nèi)部執(zhí)行腳本和外部執(zhí)行腳本 外部執(zhí)行腳本分為不帶參數(shù)調(diào)用和帶參數(shù)調(diào)用 主要采用invokeFunction方法調(diào)用 ??? ??? ObjectinvokeFunction(String name Object… args)??? ??? 用于調(diào)用腳本中定義的頂層程序和函數(shù) ??? ??? ObjectinvokeMethod(Object thiz String name Object… args)??? ??? 對(duì)以前的腳本執(zhí)行中已經(jīng)編譯的腳本對(duì)象(以 ScriptEngine 的狀態(tài)保持)調(diào)用某一方法 ??? ??? package de javase;??? ??? import javax script Invocable;??? ??? import javax script ScriptEngineManager;??? ??? import javax script ScriptEngine;??? ??? import java io File;??? ??? import java io Reader;??? ??? import java io FileReader;??? ??? public class AjavaInvokingFunction {??? ??? public static void main(String[] args) {??? ??? // 獲得一個(gè)JavaScript腳本引擎 也可以是ECMAScript腳本引擎??? ??? ScriptEngineManager manager = new ScriptEngineManager() ??? ??? ScriptEngine engine = manager getEngineByName( JavaScript ) ??? ??? String titlescript = function sayTitle() { ??? ??? + ?? println( 源碼實(shí)例 使用javax script調(diào)用JS腳本里的方法 ) ??? ??? + ?? println( ) ??? ??? + } ;??? ??? try {???

// 調(diào)用內(nèi)部腳本執(zhí)行 ??? ??? engine eval(titlescript) ??? ??? // 轉(zhuǎn)換為Invocable??? ??? Invocable invocableEngine = (Invocable) engine;??? ??? // 不帶參數(shù)調(diào)用sayTitle方法??? ??? invocableEngine invokeFunction( sayTitle ) ??? ??? // 調(diào)用外部腳本執(zhí)行 ??? ??? // 創(chuàng)建JS文件的File對(duì)象 并讀入流??? ??? File functionscript = new File( ajava js ) ??? ??? Reader reader = new FileReader(functionscript) ??? ??? // 開(kāi)始執(zhí)行ajava js里的程序??? ??? engine eval(reader) ??? ??? // 不帶參數(shù)調(diào)用sayHello方法??? ??? invocableEngine invokeFunction( sayHello ) ??? ??? // 帶參數(shù)調(diào)用sayHello方法??? ??? invocableEngine invokeFunction( sayHello mark ) ??? ??? } catch (Exception e) {??? ??? e printStackTrace() ??? ??? }??? ??? }??? ??? }??? ??? ajava js文件 ??? ??? function sayHello(){??? ??? sayHello(null) ??? ??? }??? ??? function sayHello(name){??? ??? if(name==null){??? ??? println( 歡迎你!請(qǐng)注冊(cè)Ajava會(huì)員 ) ??? ??? }else{??? ??? println(name+ 獨(dú)立JAVA社區(qū)歡迎你 ) ??? ??? }??? ??? }??? ??? 運(yùn)行結(jié)果(控制臺(tái)) ??? ??? 源碼實(shí)例 使用javax script調(diào)用JS腳本里的方法 lishixinzhi/Article/program/Java/hx/201311/26436

本文題目:用java代碼運(yùn)行js的 如何運(yùn)行js代碼
URL網(wǎng)址:http://www.muchs.cn/article32/docsjpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站商城網(wǎng)站、電子商務(wù)網(wǎng)站導(dǎo)航、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)