java swing调用H5_atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97...
atitit.js?javascript?調用c#?java?php后臺語言api?html5交互的原理與總結p97
1.實現html5化界面的要解決的策略
1.1.Js交互
Firefox與Chrome也提供了external對象,例如,他們都默認的實現了opensearch的兩個外部方法:AddSearchProvider?IsSearchProviderInstalledChrome下,可以在控制臺輸入window.external看到。Firefox默認提供的外部方法稍稍多一些,也可以可以通過firebug看到。
作者::?老哇的爪子?Attilax?艾龍,??EMAIL:1466519819@qq.com
轉載請注明來源:?http://blog.csdn.net/attilax
1.2.動態參數個數
Java的是obj[]對象數組了。默認支持動態參數個數
C#的使用obj[]就不行蘭..子能預保留
function?sendNSCommand()
{
//arguments
var?s=(arguments);
var?argsArray?=?Array.prototype.slice.call(arguments);
window.external.sendNSCommand(argsArray[0],argsArray[1],argsArray[2],argsArray[4],argsArray[5],argsArray[6],argsArray[7]);
alert(window.external);
}
//供JS調用
publicvoidsendNSCommand(Objectmessage,Objectmessage2,Objectmessage3,Objectmessage4,Objectmessage5,Objectmessage6,Objectmessage7)
{
//??Object[]?objs?=?(Object[])message;
Console.WriteLine(message);
}
1.3.事件監聽
本文提到的事件,可以分為三種類型,分別是表單提交、超鏈接跳轉、JavaScript直接調用BrowserFunction。其中JavaScript調用BrowserFunction由于無需刷新頁面,可以直接執行,因此無需對其進行特殊監聽。然而,Web上最為常見的表單提交和超鏈接跳轉,都需要刷新頁面,而刷新頁面時,則無法調用BrowserFunction。那么如何對這些事件進行監聽成為文章的一大難點。
Browser提供了一個事件監聽機制,可以為Browser添加地址變更監聽器,也就是LocationListener,這個接口有兩個方法
1.4.異常轉換
如果桌面模型下,一般可以自動異常轉換。
Web模型下,一般需要異常序列化傳遞,然后本地轉換。
2.dwrC.exec
2.1.支持?ajax?與browExt模式??支持反射,直接繼承調用后臺api
function?btn_click()
{
try{
var?mp=$("form").serialize();
mp=?"&$method=com.attilax.license.LicenseX.calcSn&$exSerialFmt=json..&$callback=callback&machi_code="+$("#machi_code").val();
dwrC.exec(mp);
}catch(e)
{
showErr(e);}
}
2.2.sendNSCommand(nativeswing的實現)
οnclick="sendNSCommand('play','百度一下');"/
Window.external.對象就是我們后臺的一個對象。。如果沒有定義,就是null
2.3.--------nativeswing的實現
sendNSCommand('play',video);
2.4.C#?swt都是自定義
3.(不通過反射)自定義方法的時候注冊js事件后臺函數
3.1.C#版本
ScriptEvent.ScriptEventDic.Add("play",delegate(IList?args)?{
MessageBox.Show((string)args[0]);
returnnull;
});
3.2.Java版
4.------------code
4.1.后臺c#
//????????修改webbrowser的屬性使c#可以調用js方法:
webbrowser.ObjectForScripting?=newScriptEvent();
namespaceClassLibrary1.com.attilax.ui
{
[System.Runtime.InteropServices.ComVisible(true)]
publicclassScriptEvent
{
publicstaticDictionary?ScriptEventDic?=newDictionary();
publicdelegateObjectjavaEventHandler(IList?args);//第一步:定義委托類型
//供JS調用
publicvoidsendNSCommand(Objectmessage,Objectmessage2,Objectmessage3,Objectmessage4,Objectmessage5,Objectmessage6,Objectmessage7)
{
//??Object[]?objs?=?(Object[])message;
Console.WriteLine(message);
Stringmeth?=(String)?message;
IList?li?=newList();
li.Add(message2);
li.Add(message3);?li.Add(message4);?li.Add(message5);?li.Add(message6);?li.Add(message7);
javaEventHandlerhdl?=?ScriptEventDic[meth];
hdl(li);
}
}
}
4.2.通過反射調用java
@Override
publicObject?function(Object[]arg0)?{
//?logger.debug("ImageSelect");
Stringmeth=arg0[0].toString();
Listli=newArrayList();
for(inti=?1;i
li.add(arg0[i]);
}
Objectobject=eventMap.get(meth);
//?p93refinvokso?..should?process?all?in?one?.include?callback
if(object==null)?{
Stringclassname=?refx.getClassName(meth);
Stringmeth_name=?refx.getMethodName(meth);
Objecto;
try{
o=?ConstructorUtils.invokeConstructor(
Class.forName(classname),null);
Object[]oa=?getParams(li);
Objectrzt=?MethodUtils.invokeMethod(o,meth_name,oa);
StringcallbackHandle=?(String)li.get(li.size()?-?1);
if(rztinstanceofString)?{//?simpleobjstr,num
Stringjs2=callbackHandle+"('"+rzt+"');";
booleanr=this.brow.execute(js2);
System.out.println(r);
}else{//plexobj
Stringjs2=callbackHandle+"('"+?core.toJsonStrO88(rzt)
+"');";
this.brow.execute(js2);
}
returnrzt;
}catch(Exceptione)?{
Stringparams_urlparams_fmt=?(String)li.get(0);
Mapmp=newParamX().urlParams2Map(params_urlparams_fmt);
StringexSerialFmt=?(String)mp.get("$exSerialFmt");
if(exSerialFmt.equals("json"))
returncore.toJsonStrO88(e);
throwExceptionUtil.convertToRuntimeEx4throwEx(e);
}
}
//def
Closureevet=?(Closure)object;
try{
returnevet.execute(li);
}catch(Exceptione)?{
//TODOAuto-generated?catch?block
e.printStackTrace();
}
returnsuper.function(arg0);
}
4.3.Dwrc
var?dwrC={};
dwrC.exec=function(param,callback,approot)
{
try{
param.rdmStr=Math.random();
}catch(e){
param=param+"&rdmStr2="+Math.random();
}
//p93
if(callback==undefined)
{
var?json=urlParams2json(param);
callback=json.$callback;
}
//
if(isExitsFunction("submit_befor_check"))
submit_befor_check();
//$iocx="aa";
$iocx_iner="";
if(isExitsVariable("$iocx"))
$iocx_iner=$iocx;
//jQuery.get("dwr.php?param="+param,?[data],?[callback])
if(window.location.host!="")??//web?envi
$.ajax(
{
type:?"get",
url:?approot+"/com.attilax/dwr.php?iocx="+$iocx_iner,
data:param,
dataType:?"text",
success:?function(data)?{
//??$("#divShow").html(data);
data=$.trim(data);
callback(data);
}
});
//-------------------
if(window.location.host=="")??//cs?envi
{
var?json=urlParams2json(param);
var?meth=json.method;
if(json.method==null)??//or??undefined????undefined?gengge?null?sh?yyeod?.
meth=json.$method;
//(meth,param1,,param2,param3,callback);
window.setTimeout(function(){
sendNSCommand(meth,param,callback);
},50);
}
}
5.參考
Winform控件WebBrowser與JS腳本交互-冰?魚-博客園
atitit.javascript調用java?in?swt?attilax總結-?attilax的專欄-博客頻道-?CSDN.NET.html
WPF的WebBrowser里面使用JavaScript調用外部方法的決解方法-?Lonely?Bandit?-博客園.html
[轉]JS調用WPF代碼執行了QueryInterface調用請求提供COM可見的托管類JavaScript調WinFrom_最黑de四季_新浪博客.html
Winform控件WebBrowser與JS腳本交互-冰?魚-博客園.html
atitit.js?與c#?java交互html5化的原理與總結.doc?-?attilax的專欄-博客頻道-?CSDN.NET.htm
總結
以上是生活随笔為你收集整理的java swing调用H5_atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java数组参考_Java数组
- 下一篇: c# char unsigned_dll