atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
2.1. 支持 ajax 与browExt模式 支持反射,直接继承调用后台api3
2.2. sendNSCommand (nativeswing的实现)3
3. (不通过反射)自定义方法的时候注册js 事件后台函数4
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的更多相关文章
- Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7
Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception processVob7 1. 1. javascript异常处理机制 ...
- Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae
Atitit.js javascript异常处理机制与java异常的转换.js exception processVoae 1. 1. javascript异常处理机制 1 2. 2. Web前后台异 ...
- Atitit.js javascript的rpc框架选型
Atitit.js javascript的rpc框架选型 1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3 ...
- 初识Node.js之Node与java作为后台服务器的对比
> 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 的初了解(更新中···)
1.js介绍 Js全称叫javascript,但不是java,他不仅是是一门前台语言,经过发展,现在也是一门后台语言:而java是后台语言. Js作者是布兰登艾奇. 前台语言:运行在客户端的 后台语言 ...
- Atitit。Js调用后台语言 java c# php swing android swt的方法大总结
Atitit.Js调用后台语言 java c# php swing android swt的方法大总结 1. Js调用后台语言有三种方法1 2. Swt BrowserFunction 绑定方法 ...
- atitit.javascript调用java in swt attilax 总结
atitit.javascript调用java in swt attilax 总结 1. BrowserFunction 简单介绍1 1.1. BrowserFunction 能够分为三类: 1 1. ...
- 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 ...
随机推荐
- 诡异的 "密码取回" 邮件问题
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 将具有特殊class名img标签替换成[img][/img]标签--javascript正则表达式实践
在项目中,可能有时候需要将一些特殊的东西加一个特别的属性,或者一个特殊的Class.如下: <!-- 第一种写法 --> <img src="abc.jpg" f ...
- Shell学习:read的选项及用法
转摘: http://kb.cnblogs.com/a/2255702/ 1. Read的一些选项 Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项. -a : ...
- uv计算
lightmap shadowmap heightmap 它们有一个自己的camera 对应cameraMatrix float3 TransfromToTextureCoord(float4 Pos ...
- Android-经常涉及到的权限
Android中配置权限的方法: 在AndroidMainFest.xml中加上以下代码 Android中一些经常涉及到的权限: 添加WiFi以及访问网络的权限: <uses-permissio ...
- PHP Warning exec() has been disabled for security reasons怎么办
如果是PHPNOW,还是找到php-apache2handler.ini这个文件,把禁用的函数去掉即可. 注意是这个文件夹
- Android图片下载以及缓存框架
实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生 ...
- TortoiseSVN版本管理软件使用简单说明
很多时候在写一个小的项目不想使用github等工具,只想简单在本地搭建一个版本管理器.那么TortoiseSVN就非常适合. 第一步:下载TortoiseSVN,http://tortoisesvn. ...
- Xshell5 破解
Xshell5激活码 Xshell5激活方式Xshell5破解版 Xshell是一个用于MS Windows平台的强大的SSH,TELNET,和RLOGIN终端仿真软件.它使得用户能轻松和安全地从Wi ...
- js 立即执行函数定义方法
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...