• 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.exec 3

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

    2.2. sendNSCommand (nativeswing的实现) 3

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

    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的实现)

     

     ο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<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

    
  • 相关阅读:
    HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化
    HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化
    HDU1540 Tunnel Warfare —— 线段树 区间合并
    HDU3974 Assign the task —— dfs时间戳 + 线段树
    HDU4027 Can you answer these queries? —— 线段树 区间修改
    POJ3264 Balanced Lineup —— 线段树单点更新 区间最大最小值
    ZOJ1610 Count the Colors —— 线段树 区间染色
    HDU1698 Just a Hook —— 线段树 区间染色
    POJ2528 Mayor's posters —— 线段树染色 + 离散化
    POJ3468 A Simple Problem with Integers —— 线段树 区间修改
  • 原文地址:https://www.cnblogs.com/attilax/p/15198838.html
Copyright © 2020-2023  润新知