atitit.js javascript 調用c# java php後臺語言api html5交互的原理與總結p97

atitit.js javascript 調用c# java php後臺語言api html5交互的原理與總結p97javascript

 

 

1實現html5化界面的要解決的策略 1php

1.1. Js交互 1html

1.2. 動態參數個數 2html5

1.3. 事件監聽 2java

1.4. 異常轉換 2web

2dwrC.exec 3ajax

2.1. 支持 ajax browExt模式  支持反射,直接繼承調用後臺api 3json

2.2. sendNSCommand (nativeswing的實現) 3c#

2.3. --------nativeswing的實現 3api

2.4. C# swt都是自定義 3

3(不經過反射)自定義方法的時候註冊js 事件後臺函數 4

3.1. C#版本 4

3.2. Java 4

4------------code 4

4.1. 後臺c# 4

4.2. 經過反射調用java 5

4.3. Dwrc 7

5參考 8

 

1. 實現html5化界面的要解決的策略

1.1. Js交互

FirefoxChrome也提供了external對象,例如,他們都默認的實現了opensearch的兩個外部方法:
AddSearchProvider IsSearchProviderInstalled
Chrome下,能夠在控制檯輸入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調用

        public void sendNSCommand(Object message, Object message2, Object message3, Object message4, Object message5, Object message6, Object message7)

        {

          //  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的實現)

 

 onclick="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<object> args) {

 

              MessageBox.Show((string)args[0]);

              return null;

          

          });

3.2. Java版

4. ------------code

4.1. 後臺c#

    //        修改webbrowser的屬性使c#能夠調用js方法: 

            webbrowser.ObjectForScripting = new ScriptEvent();

 

 

 

 

namespace ClassLibrary1.com.attilax.ui

{

    [System.Runtime.InteropServices.ComVisible(true)]

    public class ScriptEvent

    {

 

        public static Dictionary<StringjavaEventHandler> ScriptEventDic = new Dictionary<stringjavaEventHandler>();

 

          public delegate Object javaEventHandler(IList<Object> args);//第一步:定義委託類型

 

        //供JS調用

        public void sendNSCommand(Object message, Object message2, Object message3, Object message4, Object message5, Object message6, Object message7)

        {

          //  Object[] objs = (Object[])message;

            Console.WriteLine(message);

 

            String meth =(String) message;

 

            IList<Object> li = new List<Object>();

            li.Add(message2);

            li.Add(message3); li.Add(message4); li.Add(message5); li.Add(message6); li.Add(message7);

            javaEventHandler hdl = ScriptEventDic[meth];

            hdl(li);

 

        }

    }

}

 

4.2. 經過反射調用java

@Override

public Object function(Object[] arg0) {

// logger.debug("ImageSelect");

String meth = arg0[0].toString();

List li = new ArrayList();

for (int i = 1; i < arg0.lengthi++) {

li.add(arg0[i]);

}

 

Object object = eventMap.get(meth);

// p93 ref invok so ..should process all in one .include callback

if (object == null) {

String classname = refx.getClassName(meth);

String meth_name = refx.getMethodName(meth);

Object o;

try {

o = ConstructorUtils.invokeConstructor(

Class.forName(classname), null);

Object[] oa = getParams(li);

 

Object rzt = MethodUtils.invokeMethod(ometh_nameoa);

String callbackHandle = (String) li.get(li.size() - 1);

 

if (rzt instanceof String) { // simple obj str,num

String js2 = callbackHandle + "('" + rzt + "');";

boolean r = this.brow.execute(js2);

System.out.println(r);

 

else { // plex obj

String js2 = callbackHandle + "('" + core.toJsonStrO88(rzt)

"');";

this.brow.execute(js2);

}

 

return rzt;

catch (Exception e) {

String params_urlparams_fmt = (String) li.get(0);

Map mp = new ParamX().urlParams2Map(params_urlparams_fmt);

String exSerialFmt = (String) mp.get("$exSerialFmt");

if (exSerialFmt.equals("json"))

return core.toJsonStrO88(e);

 

throw ExceptionUtil.convertToRuntimeEx4throwEx(e);

}

}

 

// def

Closure evet = (Closureobject;

try {

return evet.execute(li);

catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return super.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控件WebBrowserJS腳本交互 冰 魚 博客園

atitit.javascript調用java in swt attilax 總結 - attilax的專欄 博客頻道 - CSDN.NET.html

 

WPFWebBrowser 裏面使用JavaScript調用外部方法的決解方法 - Lonely Bandit - 博客園.html

[]JS調用WPF代碼 執行了QueryInterface調用 請求提供COM可見的託管類 JavaScript調WinFrom_最黑de四季_新浪博客.html

Winform控件WebBrowserJS腳本交互 冰 魚 博客園.html

atitit.js c# java交互html5化的原理與總結.doc - attilax的專欄 博客頻道 - CSDN.NET.htm


相關文章
相關標籤/搜索