zoukankan      html  css  js  c++  java
  • atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97

    atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97

     

     

    1实现html5化界面的要解决的策略1

    1.1. Js交互1

    1.2. 动态参数个数2

    1.3. 事件监听2

    1.4. 异常转换2

    2dwrC.exec3

    2.1. 支持 ajax browExt模式  支持反射,直接继承调用后台api3

    2.2. sendNSCommand (nativeswing的实现)3

    2.3. --------nativeswing的实现3

    2.4. C# swt都是自定义3

    3(不通过反射)自定义方法的时候注册js 事件后台函数4

    3.1. C#版本4

    3.2. Java4

    4------------code4

    4.1. 后台c#4

    4.2. 通过反射调用java5

    4.3. Dwrc7

    5参考8

     

    1. 实现html5化界面的要解决的策略

    1.1. Js交互

    FirefoxChrome也提供了external对象,例如,他们都默认的实现了opensearch的两个外部方法:
    AddSearchProvider IsSearchProviderInstalled
    Chrome下,可以在控制台输入window.external看到。
    Firefox默认提供的外部方法稍稍多一些,也可以可以通过firebug看到。

     

    作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://www.cnblogs.com/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可见的托管类 JavaScriptWinFrom_最黑de四季_新浪博客.html

    Winform控件WebBrowserJS脚本交互 冰 鱼 博客园.html

    atitit.js c# java交互html5化的原理与总结.doc - attilax的专栏 博客频道 - CSDN.NET.htm

  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/attilax/p/4789546.html
Copyright © 2011-2022 走看看