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

2. dwrC.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. Java版4

4. ------------code4

4.1. 后台c#4

4.2. 通过反射调用java5

4.3. Dwrc7

5. 参考8

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

1.1. Js交互

Firefox与Chrome也提供了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<String, javaEventHandler> ScriptEventDic = new Dictionary<string, javaEventHandler>();

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.length; i++) {

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(o, meth_name, oa);

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 = (Closure) object;

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控件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

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

  1. Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7

    Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception processVob7 1. 1. javascript异常处理机制 ...

  2. Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae

    Atitit.js javascript异常处理机制与java异常的转换.js exception processVoae 1. 1. javascript异常处理机制 1 2. 2. Web前后台异 ...

  3. Atitit.js javascript的rpc框架选型

    Atitit.js javascript的rpc框架选型 1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3 ...

  4. 初识Node.js之Node与java作为后台服务器的对比

    > 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...

  5. 使用JavaScript调用手机平台上的原生API

    我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...

  6. JS(JavaScript)的初了解(更新中···)

    1.js介绍 Js全称叫javascript,但不是java,他不仅是是一门前台语言,经过发展,现在也是一门后台语言:而java是后台语言. Js作者是布兰登艾奇. 前台语言:运行在客户端的 后台语言 ...

  7. Atitit。Js调用后台语言 java c#  php swing android  swt的方法大总结

    Atitit.Js调用后台语言 java c#  php swing android  swt的方法大总结 1. Js调用后台语言有三种方法1 2. Swt  BrowserFunction 绑定方法 ...

  8. atitit.javascript调用java in swt attilax 总结

    atitit.javascript调用java in swt attilax 总结 1. BrowserFunction 简单介绍1 1.1. BrowserFunction 能够分为三类: 1 1. ...

  9. Atitit. servlet 与 IHttpHandler  ashx  listen 和HttpModule的区别与联系 原理理论 架构设计   实现机制    java php c#.net js javascript  c++ python

    Atitit. servlet 与 IHttpHandler  ashx  listen 和HttpModule的区别与联系 原理理论 架构设计   实现机制    java php c#.net j ...

随机推荐

  1. datatables .fnDraw is not a function

    Datatables中文网:http://dt.thxopen.com/manual/api.html API DataTables 提供的可以操作表格数据的API,有下面六个关键部分: 表格(tab ...

  2. 基于t-io的MI工具实现

    原文:https://my.oschina.net/u/2984386/blog/1630300 背景介绍 t-io是一款国产开源的网络编程框架,主要是特点:简单,易上手,AIP封装通俗易懂,适合一般 ...

  3. Java操作xml文件的jar包dom4j

    只能解析xml文件,不能解析普通的文件 https://www.cnblogs.com/sharpest/p/7877501.html

  4. nginx最大并发连接数的思考:worker_processes、worker_connections、worker_rlimit_nofile

    参考nginx官网:http://nginx.org/en/docs/ngx_core_module.html#worker_connections 从用户的角度,http 1.1协议下,由于浏览器默 ...

  5. IIS 服务器隐藏index.php 的方法

    在项目根目录下创建web.config文件  写入以下代码即可 <?xml version="1.0" encoding="UTF-8"?> < ...

  6. Strategy Pattern(策略模式)

    Head First定义: 策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式的设计原则主要有三个: 找出应用中可能需要变化的部分,把它们独 ...

  7. 不输入sudo使用docker

    系统是debian系 安装: sudo apt install docker.io 将当前用户加入‘docker’组: sudo gpasswd -a ${USER} docker  刷新权限: su ...

  8. 前端性能优化:使用Array.prototype.join代替字符串连接

    来源:GBin1.com 有一种非常简单的客户端优化方式,就是用Array.prototype.join代替原有的基本的字符连接的写法.在这个系列的第一篇中,我在代码中使用了基本字符连接: htmlS ...

  9. 一个.net Cookie组件的bug引发的题外话

    在.net里,做过Http模拟发送请求的朋友们应该遇到过,有个时候无论怎么努力,都没办法让Cookie跟网页用浏览器所收集的一样,其中原因除了有些Cookie大概是ReadOnly之外,似乎另有隐情: ...

  10. 应用LR监控Apache性能

    1)对Apache服务器中的http.conf进行如下配置修改Apache中Httpd.conf文件,添加如下代码(该文件中都有,只要取消注释就好了)<Location /server-stat ...