1.取得腳本解釋器的管理器Manager
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供尼瀘西網(wǎng)站建設(shè)、尼瀘西做網(wǎng)站、尼瀘西網(wǎng)站設(shè)計(jì)、尼瀘西網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、尼瀘西企業(yè)網(wǎng)站模板建站服務(wù),十余年尼瀘西做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
2.從管理器中取得js的解釋器實(shí)例ScriptEngine
3.取得存儲(chǔ)javascript變量的Bindings實(shí)例
4.把一個(gè)java.io.Reader流及Bindings傳遞給ScriptEngine的eval方法返回腳本運(yùn)行結(jié)果,如果執(zhí)行中發(fā)生錯(cuò)誤,會(huì)拋出ScriptException異常。
例:運(yùn)行javascript腳本的一個(gè)java程序
throwsIOException{ScriptEngineManagerscriptManager=newScriptEngineManager;//從管理器中獲取js的解釋器//定義我們要運(yùn)行的腳本文件Stringfilename=null;//通過(guò)解釋器來(lái)獲得存儲(chǔ)javascript變量的Bindings的實(shí)例,使它們提供給腳本。Bindingsbindings=js.createBindings;//在map中獲取和設(shè)置值的方法publicObjectget;//使用我們的name/value對(duì)(即javascript變量)Bindingsbindings=newSimpleBindings(defaults);//創(chuàng)建一個(gè)變量,用于存放腳本執(zhí)行的內(nèi)容ScriptContextcontext=newSimpleScriptContext();//設(shè)置那些Bindings在Context中,使它們可讀。但這樣的變量定義的腳本不要放入我們的Map中context.setBindings(bindings,ScriptContext.GLOBAL_SCOPE);BufferedReaderin=newBufferedReader(newFileReader(filename));Stringline;while((line=in.readLine())!=null){line=line.trim();if(line.length()==0)continue;//跳過(guò)空行if(line.charAt(0)==‘#‘)continue;//跳過(guò)命令intpos=line.indexOf(":");if(pos==-1){thrownewIllegalArgumentException("syntax:"+line);}Stringname=line.substring(0,pos).trim();Stringvalue=line.substring(pos+1).trim();charfirstchar=value.charAt(0);intlen=value.length();charlastchar=value.charAt(len-1);if(firstchar==‘"‘lastchar==‘"‘){//雙引號(hào)引用的值為字符串defaults.put(name,value.substring(1,len-1));}elseif(Character.isDigit(firstchar)){//如果開(kāi)始是一個(gè)數(shù)字try{doubled=Double.parseDouble(value);defaults.put(name,value);}catch(NumberFormatExceptione){//沒(méi)有數(shù)字,是一個(gè)stringdefaults.put(name,value);}}elseif("true".equals(value)){//處理布爾值defaults.put(name,Boolean.TRUE);}elseif("false".equals(value)){defaults.put(name,Boolean.FALSE);}elseif("null".equals(value)){//處理null值defaults.put(name,null);}elseif(firstchar==‘{‘lastchar==‘}‘){//如果值是在一對(duì)大括號(hào)之內(nèi),則執(zhí)行javascript代碼Stringscript=value.substring(1,len-1);Objectresult=engine.eval(script,context);defaults.put(name,result);}else{//其它情況,剛好是一個(gè)字符串defaults.put(name,value);}}}//一個(gè)簡(jiǎn)單的類的測(cè)試程序publicstaticvoidmain(String[]args)throwsIOException,ScriptException{Configurationdefaults=newConfiguration();defaults.load(args[0]);Set
給你一個(gè)dwr框架實(shí)現(xiàn)Ajax調(diào)用DAO的簡(jiǎn)單程序。
script type='text/javascript' src='dwr/interface/testDAOVali.js'/script
script type='text/javascript' src='dwr/engine.js'/script
script type="text/javascript"
function abc(b) {
alert(b);
}
function checkRepeat(s) {
var o = getElement(s);
if (o) {
testDAOVali.valiUser(o.value,abc);
}
}
function getElement(name) {
var result = null;
var objs = document.getElementsByName(name);
if (objs) {
var o = objs[0];
result = o;
}
return result;
}
/script
body
input type="text" name="user"
input type="button" onclick="checkRepeat('user')" value="檢查是否重復(fù)"
/body
/html
首先是網(wǎng)頁(yè):
%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%??
!DOCTYPE?HTML??
html??
head??
meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"??
titlejs和android相互調(diào)用/title??
head??
script?type="text/javascript"?language="javascript"??
//調(diào)用java方法jsCallJava()??
function?showHtmlcallJava()?{??
var?str?=?window.android.jsCallJava();??
document.getElementById("info1").value?=?str;??
}??
//調(diào)用java方法jsCallJavaWithParams(String?var),帶參數(shù)??
function?showHtmlcallJava2()?{??
var?str?=?window.android.jsCallJavaWithParams("Devin?Chen");??
document.getElementById("info2").value?=?str;??
}??
//提供給java調(diào)用的方法??
function?show()?{??
document.getElementById("id_input").value?=?"Java調(diào)用Html中的方法";??
}??
//提供給java調(diào)用的方法,帶參數(shù)??
function?showWithParam(param)?{??
document.getElementById("id_input2").value?=?"Java調(diào)用Html中的方法:?"?+?param;??
}??
/script??
/head??
body??
input?id="info1"?style="width:?90%"?type="text"?value="null"?/br??
input?type="button"?value="Html調(diào)用Java方法"?onclick="showHtmlcallJava()"?/br??
input?id="info2"?style="width:?90%"?type="text"?value="null"?/br??
input?type="button"?value="Html調(diào)用帶參數(shù)的Java方法"?onclick="showHtmlcallJava2()"?/br??
input?id="id_input"?style="width:?90%"?type="text"?value="null"?/br??
input?type="button"?value="Java調(diào)用Html方法"?onclick="window.android.javaCallJavaScript()"?/br??
input?id="id_input2"?style="width:?90%"?type="text"?value="null"?/br??
input?type="button"?value="Java調(diào)用帶參數(shù)的Html方法"?onclick="window.android.javaCallJavaScriptWithParams()"?/??
/body??
/html
Android部分的布局就一個(gè)WebView,MainActivity源代碼:
/**?
*?java方法和javascript方法的相互調(diào)用?
*/??
public?class?MainActivity?extends?AppCompatActivity?{??
private?static?final?String?url?=?"";??
private?WebView?mWebView;??
@Override??
protected?void?onCreate(Bundle?savedInstanceState)?{??
super.onCreate(savedInstanceState);??
setContentView(R.layout.activity_main);??
initView();??
}??
private?void?initView()?{??
mWebView?=?(WebView)?findViewById(R.id.web_main);??
WebSettings?settings?=?mWebView.getSettings();??
settings.setJavaScriptEnabled(true);??
settings.setDefaultTextEncodingName("utf-8");??
mWebView.loadUrl(url);??
mWebView.setWebViewClient(new?WebViewClient());??
//這兩句是必須的,"android"就是jsp中調(diào)用方法時(shí)window后面的對(duì)象??
Object?obj?=?getObject();??
mWebView.addJavascriptInterface(obj,?"android");??
}??
private?Object?getObject()?{??
Object?obj?=?new?Object()?{??
/**?
*?html中的JavaScript調(diào)用Java方法?
*?注解是必須的?
*?@return?
*/??
@JavascriptInterface??
public?String?jsCallJava()?{??
return?"JavaScript調(diào)用Java方法";??
}??
/**?
*?html中的JavaScript調(diào)用帶參數(shù)的Java方法?
*?注解是必須的?
*?@return?
*/??
@JavascriptInterface??
public?String?jsCallJavaWithParams(String?var)?{??
return?"JavaScript調(diào)用帶參數(shù)的Java方法"?+?var;??
}??
/**?
*?java調(diào)用html中的方法,遺憾的是不知道有什么辦法可以拿到返回值?
*/??
@JavascriptInterface??
public?void?javaCallJavaScript()?{??
runOnUiThread(new?Runnable()?{??
@Override??
public?void?run()?{??
mWebView.loadUrl("javascript:show()");??
}??
});??
}??
/**?
*?java調(diào)用html中的方法,并且傳遞參數(shù),這個(gè)有大用?
*/??
@JavascriptInterface??
public?void?javaCallJavaScriptWithParams()?{??
runOnUiThread(new?Runnable()?{??
@Override??
public?void?run()?{??
mWebView.loadUrl("javascript:showWithParam('baoge')");??
}??
});??
}??
};??
return?obj;??
}??
}
參考這兩個(gè) webSettings.setJavaScriptEnabled(true); 是啟用js,mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo"); 是定義個(gè)對(duì)象demo,js中調(diào)用demo對(duì)象就可以調(diào)用剛剛定義的java方法 了。這兩個(gè)是關(guān)鍵
javascript的對(duì)象和java是不能互通的。如果js一定要訪問(wèn)java也不是不可以,要裝一個(gè)插件性質(zhì)的東西。
建議:
1,使用DWR做對(duì)象映射。
2,把對(duì)象變成一段json傳到后端解析。
onclick方法是屬于js的一個(gè)函數(shù),是可以將java代碼寫(xiě)在里面的,示例如下: html里的button按鈕是借助javascript用的,onclick是鼠標(biāo)單擊事件,單擊會(huì)觸發(fā)事件的執(zhí)行,給你個(gè)例子吧 function welcome(){alert("測(cè)試button按鈕");}屏幕上會(huì)出現(xiàn)