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. 虚拟PDF打印机

    doPDF虚拟打印机 doPDF 是一个免费的PDF转换器,可同时运用于商业和个人,它把自己安装为一个打印机驱动,允许从任意一个有打印输出的Windows程序中打印,还包含缩放,质量定义和页面大小定义 ...

  2. 基本C库函数

    当编写驱动程序时,一般情况下不能使用C标准库的函数.Linux内核也提供了与标准库函数功能相同的一些函数,但二者还是稍有差别. 类别 函数名 功能 函数形成 参数 描述 字符串转换 simple_st ...

  3. openfire自定义发送消息

    加入以下类: 这个是xml格式的,解析时可以将xml转成map,参数可自由定义 import org.jivesoftware.smack.packet.PacketExtension; /** * ...

  4. Android Json的使用(2) 使用Jackson解析和生成json

    使用Jackson的三种方式 数据绑定模式:使用最方便 流模式:性能最佳 树模式:最灵活 以最常用的数据绑定模式为例 Json数据如下 { "name" : { "fir ...

  5. xmodmap使用指南

    什么是 xmodmap 改变按键的行为 修改修饰键的行为 修改鼠标按键行为 Fvwm中的修辞键使用 1. 什么是 xmodmap xmodmap 是一个在 X 图形环境下用于修改键盘和鼠标按钮映射的工 ...

  6. 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录

    在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...

  7. scikit-learn入门学习记录

    一加载示例数据集 from sklearn import datasets iris = datasets.load_iris() digits = datasets.load_digits() 数据 ...

  8. java调用机器上的shell脚本

    java调用机器上的shell脚本,可以这样方便的通过shell脚本调用本机的C.C++等程序 Process process = null; Runtime runTime = Runtime.ge ...

  9. windows下进程管理常用命令

    1.查看当前正在运行的进程 tasklist 注: /im 后为映像名称参数:/f  为强行终止,可以通过 taskkill /? 查看更多帮助 2.强制杀死映像名称为imagename的进程,映像名 ...

  10. MySQL的GRANT命令(创建用户)

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 (删除用户与删除权限:drop user '用户名 ...