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作为后台服务器的对比
> 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...
- 使用JavaScript调用手机平台上的原生API
我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...
- JS(JavaScript)的初了解(更新中···)
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 ...
随机推荐
- Ubuntu下Wine使用教程
转自:http://blog.csdn.net/wangchangshuai0010/article/details/12057251 用了段时间的Ubuntu,感觉很好!可是工作的时候还是要用到 w ...
- 基于Nginx的开墙方案
Kubernetes集群内部通过服务名能进行相互调用,但如果Kubernetes中的pod需要调用外部服务,而且这些外部服务是属于不同的安全区域,就面临开墙的问题,因为Kubernetes Pod能够 ...
- Android OpenGL加入光照和材料属性
转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] 在上一篇文章[ Android OpenGL显示随意3D模型文件 ]中.我们学习了怎 ...
- PLSQL Developer连接远程Oracle方法(非安装client)
远程连接Oracle比較麻烦,通常须要安装oracle的客户端才干实现. 通过instantclient能够比較简单的连接远程的Oracle. 1.新建文件夹D:\Oracle_Cleint用于存放相 ...
- 将EC2的Sql Server 计划任务的方式备份到s3上
编写个powershell脚本 $server = '.' $database = 'databaseName' $s3Bucket = 's3bucket' $backupPath = 'D:\Ba ...
- OO软件设计说明书结构
1 概述 系统简述.软件设计目标.参考资料.修订版本记录 这部分论述整个系统的设计目标,明确地说明哪些功能是系统决定实现而哪些时不准备实现的.同时,对于非功能性的需求例如性能.可用性等,亦需提 ...
- Java小案例(行星移动)
Java小案例 行星移动:参考:三百集 使用软件:idea2017,java 1,图片集:这里 (idea图片源放在target目录下,才能访问到),建议从小往上看... 2,定义MyFrame p ...
- ubuntu16.04彻底卸载mysql并且重新安装mysql
首先删除mysql: sudo apt-get remove mysql-* dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 清理完毕: ...
- Swing JTable 具体解释
改变列头 flightTable.getTableHeader().setDefaultRenderer(new TableCellRenderer() { public Component getT ...
- 在表单里面检查用户名是否存javascript
function CheckUser(fn) { $.get("/Pages/Handler/CheckExistHander.ashx", { "txt_UserNo& ...