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. [HTML/CSS]div显示在object、embed之上~

    引言 帮一个朋友弄前端布局,一切都正常,但是嵌入object之后,div总是在object的下面,就上网找了一下解决方案,这里记录一下,好像只对flash有效. 用embed插入一个flash(比如优 ...

  2. Arch linux

    这里将介绍Arch Linux使用问题的解决方法,在这里拿出来和大家分享一下Linux目前较适用于小型的网络,Arch Linux 是个针对 i686i686/x86-64 优化的 Linux 发行版 ...

  3. git log --oneline --graph的读法

    星号表明这个提交所在的分支: 最左边的直线表示当前分支的历史状态,从图看,当前分支HEAD是master分支 :提交历史是:8cfbb25<--d486463<--a88c595<- ...

  4. 阿里云ECS主机内核调优

    #阿里云内核调优 cat /etc/sysctl.conf vm.swappiness = 0net.ipv4.neigh.default.gc_stale_time=120 # see detail ...

  5. Gpu driven rendering pipelines & bindless texture

    http://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.p ...

  6. Android OpenGL加入光照和材料属性

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] 在上一篇文章[ Android OpenGL显示随意3D模型文件 ]中.我们学习了怎 ...

  7. python灰帽子学习感想

    Gray Hat Python Python Programming for hackers and reverse engineers Python灰帽子:黑客与逆向project师的Python编 ...

  8. vs2012升级到vs2013后,sql server 无法通过IP登录解决方案

    因项目需要,vs升级到2013,可是数据库通过IP却无法连接,一直报内存异常,困扰许久,原来是.net框架出了问题,可以通过用管理员身份运行:netsh winsock reset解决!

  9. 算法笔记_104:蓝桥杯练习 算法提高 新建Microsoft Word文档(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗? ...

  10. python——关于Python Profilers性能分析器

    1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和ps ...