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());
}
}
}
}
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
}
}
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();
}
}
}
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和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)該不是你想要的東西。
;?? 本例子使用了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)