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

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:[email protected]

转载请注明来源: 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

时间: 2024-08-05 06:42:24

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

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

Atitit.js javascript异常处理机制与java异常的转换.js exception processVoae 1. 1. javascript异常处理机制 1 2. 2. Web前后台异常的统一处理 1 3.  java异常转换为js异常 1 3. -------------详细代码 2 1. 1. javascript异常处理机制 Throw str Not throw error  ..cause ie,ff error obj is diff.. 2. 2. Web前后台异常

Atitit.js javascript的rpc框架选型

1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3.JavaScript客户端调用示例2 3.2. 2.4.直接GET请求进行调用2 4. atiri3 1. Dwr Dwr要自己一个method挑选了,麻烦的.. 2. 使用AJAXRPC 在调用RPC方法时,如果没有传递回调函数,则是同步调用:如果传递回调函数,则是异步调用. 2.1.1.1. 同步调用 2.1. 数据类型映射表 AJAXRPC支持基本

如何在android平台上使用js直接调用Java方法[转]

转载自:http://www.cocos.com/docs/html5/v3/reflection/zh.html #如何在android平台上使用js直接调用Java方法 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parame

【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回

cocos js js java互调 (如何在ANDROID平台上使用JS直接调用JAVA)

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回

Atitit.&#160;数据约束&#160;校验&#160;原理理论与&#160;架构设计&#160;理念模式java&#160;php&#160;c#.net&#160;js&#160;javascript&#160;mysql&#160;oracle

Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3. 检查约束 (Check Counstraint) 对该列数据的范围.格式的限制(如:年龄.性别等)2 4. 默认约束 (Default Counstraint) 该数据的默认值2 5. trigger2 6. 外键机制  参照完整性:2 7. 断言约束:不必与特定的列绑定,可以理解为能应用于多个表的

atitit.javascript调用java in swt attilax 总结

atitit.javascript调用java in swt attilax 总结 1. BrowserFunction 简介1 1.1. BrowserFunction 可以分为三类: 1 1.2. 事件监听2 2. ati的实现2 2.1. 页面调用2 2.1.1. --------nativeswing的实现2 2.2. java代码2 3. ---code4 4. 参考5 1. BrowserFunction 简介 为了让读者更好的理解后面的内容,在正式介绍之前,需要让读者简单了解一下 

Atitit.js跨域解决方案attilax大总结&#160;后台java&#160;php&#160;c#.net的CORS支持

Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1. 设置 document.domain为一致  推荐1 2. Apache 反向代理 推荐1 3. jsonp ,2 4. CORS ,2 5. iframe+post3 6. 回调解决方案>>服务端推送dwr 反向ajax3 7. 服务器中转 3 8. Js跨3 9. 从所有的浏览器都支持来看,CORS将成为未来跨域访问的标准解决方案3 10. 参考4 1. 设置 document.do

atitit.js&#160;与c#&#160;java交互html5化的原理与总结.doc

atitit.js 与c# java交互html5化的原理与总结.doc 1. 实现html5化界面的要解决的策略1 1.1. Js交互1 1.2. 动态参数个数1 1.3. 事件监听2 2. sendNSCommand2 2.1.1. --------nativeswing的实现2 3. 注册js 事件后台函数3 4. 后台c#3 5. 参考4 1. 实现html5化界面的要解决的策略 1.1. Js交互 Firefox与Chrome也提供了external对象,例如,他们都默认的实现了ope