阅读更多

5顶
0踩

Web前端

原创新闻 轻量级 js2java RPC 框架发布

2011-08-19 10:04 by 见习记者 jxpath 评论(8) 有13429人浏览
1. 相关介绍:

1.1 是什么

是一个基于flash、java、js架构设计的超轻量级RPC框架。

1.2 特点是什么

1、JS2Java RPC:能够在javascript的web浏览器环境中指定java类,获取该类实例的属性,调用该实例的方法

2、支持复杂js对象作为入参:能够传递复杂的JavaScript Object对象作为调用参数,在java中得到对应的Map对象

3、自动压缩、解压传递的数据:调用过程中传递的数据自动进行压缩传输,后台自动解压,然后转换为Map给开发人员;因此从一定层面上保护、加密了传输的数据

4、JS回调函数中能够接收java返回的复杂对象:java中可以返回复杂的对象,比如Map、List,在javascript中对应为Object和Array

5、友好逐行数据输出并回调:java中可以将List逐行输出到浏览器中,框架每接收到一条数据,能够自动回调给定的javascript方法,从而实现数据流的逐行输出;该接口继承与“com.ibatis.sqlmap.client.event.RowHandler”因此很容易将ibatis的数据流逐行输出给浏览器,从而实现非常友好的数据加载方式

6、支持回调全异步(观察者模式):所有的过程调用都采用异步方式,可以指定回调函数,用来接收返回的对象,并进行其他处理

7、日志回调:L异步过程可以设置日志回调函数,让你掌控全过程

1.3 包含什么

包含:
XtZPStream.swf:V1.0:25KB,flash文件
XtZPStream_1.0.jar:655 KB,java服务端jar
XtZPStream.js:3.69 KB,
jsp中使用的代码片段:未压缩,大约2.61 KB

1.4 应该注意什么

XtZPStream和json-rpc-for-java都要求UTF-8字符集---js代码

1.5 下载地址是什么

http://code.google.com/p/json-rpc-for-java/downloads/list

1.6 依赖什么

依赖的jar【2.36 MB】:
backport-util-concurrent.jar
commons-httpclient-3.0.1.jar
jgroups.jar

2 web.xml配置

仅仅需要在Web.xml中配置,http://code.google.com/p/json-rpc-for-java/上的两个RPC框架都是,只需要简单的配置.
XtZPStream 在web.xml中的配置:

    <servlet>
        <servlet- name>CommonHttpServlet</servlet- name>
        <servlet-class>
    com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.CommonHttpServlet
        </servlet-class>
        <load-on-startup>3</load-on- startup>
    </servlet>


    <servlet-mapping>
        <servlet- name>CommonHttpServlet</servlet- name>
        <url-pattern>/CMHS</url-pattern>
    </servlet-mapping>


3 如何使用

3.1 Java

package com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class Test {

   /**
    * 一般对象
    * @param m
    * @return
    */
   public Object myCbkTest(Map m)
   {
     List lst = new ArrayList();
     lst.add(new String[]{"牧仁", "之", "数据压缩传输", "创新"});
     lst.add(new int[]{1,1,6,0,2,0,1,1});
     return lst;
   }
   
   /**
    * 行流方式
    * @param m
    * @param cbk
    * @throws Exception
    */
   public void myCbkTestRow(Map m, IRowHandler cbk) throws Exception
   {
     List lst = new ArrayList();
     lst.add(new String[]{"牧仁2", "之", "数据压缩传输", "创新"});
     lst.add(new int[]{1,1,6,0,2,0,1,1});
     if(null != cbk)
     for(int i = 0; i < lst.size(); i++)
        cbk.handleRow(lst.get(i));
   }
   /**
    * @param args
    */
   public static void main(String[] args) {
     System.out.println(new ObjectToJSON(new Test()).toJSON());
   }

}


3.2 JSP

<%@ page  pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%><!DOCTYPE html><html><head><base href="<%=basePath%>">
<title>XtZPStream框架使用演示(demo)</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"></head><body>
<script charset=UFF-8 src=XtZPStream.js></script>
<script>
        // 指定上下文路径,必须的,没有的上下文的时候就是空串""
        var contextPath = "<%=path%>";
        var XtZPS = XtZPStream(contextPath);
        var k, cbk = function(o)
        {
            o || (o = {});
            var k;
            for(k in o)
               alert(k + " = " + o[k]);
        }, log = function(s)
        {
            var oT = document.getElementById("myLog");
            oT.innerText = s  + "\n" + oT.innerText;
        };
        function fnTest()
        {
                XtZPS.setLogCbk("log");
                XtZPS.readStm(
                  { name:"牧仁", 
                    QQ:11602011, 
                    age:"9ZB",
                    a: {b:[1234,34,33,34]},  /* 复杂对象传递测试*/
                    /* 回调java方法,并返回结果,入口参数为: public Object myCbkTest(Map m) */
                    xtStreamCbk: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTest" 
                   }, cbk, contextPath);
        }
        
        function fnTestRow()
        {
                  XtZPS.setLogCbk("log",false);
                  XtZPS.readStm(
                  { name:"牧仁", 
                    QQ:11602011, 
                    age:"9ZB",
                    a: {b:[1234,34,33,34]},  /* 复杂对象传递测试*/
                    /* 回调java方法,并返回结果,入口参数为: public void myCbkTestRow(Map m, IRowHandler cbk) throws Exception */
                    xtStreamCbkRow: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTestRow" 
                   }, cbk,  contextPath);
        }
        
        /*
        Rpc调用演示
        1、指定类名,获取该类的JS映射对象
        2、在回调中使用、调用该类的方法(属性)
        */
        function Test3()
        {
            XtZPS.setLogCbk("log",false);
            // 指定类名和回调函数,必须用回调的方式,否则无法得到和类同名的对象Test,只有在回调里才能确保正确获得这个对象
    XtZPS.getRpcObj("com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test", function(o)
           {
                /*//////和下面的方法效果一样/////////
                o.myCbkTest({data:"表单数据"}, function(p)
                {
                    for(var k in p)alert(k + " = " + p[k]);
                });
                /////////////////////////*/
                Test.myCbkTest({data:"表单数据"}, function(p)
                {
                    for(var k in p)alert(k + " = " + p[k]);
                });
            });
        }
        </script>
<button onclick=fnTest()>一般对象的发送、调用java、返回对象(List)</button>       
<button onclick=fnTestRow()>一般对象的发送、调用java、逐行返回对象(List)</button>
<button onclick=Test3()>rpc</button>
<div id="myLog"></div></body>
</html>


3.3 JS API

// 指定上下文路径,必须的,没有的上下文的时候就是空串""
var contextPath = "<%=path%>";
var XtZPS = XtZPStream(contextPath);


1、XtZPS.nextId(); // 生成一个唯一的字符串id

2、XtZPS.getRpcObj(s,myCbk);
-------------------------------------------------------------
s        类名,例如:"com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test"
-------------------------------------------------------------
myCbk  回调函数,有一个入参,是指定类转换为js的对象,例如:
    
 function(o)
            {
                /*//////和下面的方法效果一样/////////
                o.myCbkTest({data:"表单数据"}, function(p)
                {
                    for(var k in p)alert(k + " = " + p[k]);
                });
                /////////////////////////*/
                Test.myCbkTest({data:"表单数据"}, function(p)
                {
                    for(var k in p)alert(k + " = " + p[k]);
                });
            }


3、XtZPS.readStm(o, fnCbk, ctx);
-------------------------------------------------------------
o    传递到后台的复杂js对象,例如:
{ name:"牧仁", 
                    QQ:11602011, 
                    age:"9ZB",
                    a: {b:[1234,34,33,34]},  /* 复杂对象传递测试*/
                    /* 回调java方法,并返回结果,入口参数为: public Object myCbkTest(Map m) */
                    xtStreamCbk: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTest" 
                   }


xtStreamCbk用于指定要回调的java类名:(com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test)和方法(myCbkTest)
其中方法定义、入参要求是:

// 入参要去是Map
public Object myCbkTest(Map m)
{
     List lst = new ArrayList();
     lst.add(new String[]{"牧仁", "之", "数据压缩传输", "创新"});
     lst.add(new int[]{1,1,6,0,2,0,1,1});
     return lst;
}


另外:

/* 回调java方法,并返回结果,入口参数为: public void myCbkTestRow(Map m, IRowHandler cbk) throws Exception */
xtStreamCbkRow: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTestRow"
用来指定基于流的方式输出行流对象,并逐行回调js方法,方法的定义要求:

   public void myCbkTestRow(Map m, com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.IRowHandler cbk) throws Exception
   {
     List lst = new ArrayList();
     lst.add(new String[]{"牧仁2", "之", "数据压缩传输", "创新"});
     lst.add(new int[]{1,1,6,0,2,0,1,1});
     if(null != cbk)
     for(int i = 0; i < lst.size(); i++)
        cbk.handleRow(lst.get(i));// 这里逐行输出数据
   }

-------------------------------------------------------------
fnCbk  回调函数,具有一个入口参数,是异步返回的对象,例如:
var k, cbk = function(o)
        {
            o || (o = {});
            var k;
            for(k in o)
               alert(k + " = " + o[k]);
        };

-------------------------------------------------------------
ctx 当前应用上下文路径,没有时为"",例如:var ctx = "<%=request.getContextPath()%>";

项目网站http://code.google.com/p/json-rpc-for-java/

下载地址http://json-rpc-for-java.googlecode.com/files/XtZPStream_demo_V1.0.rar
5
0
评论 共 8 条 请登录后发表评论
8 楼 jxpath 2012-05-09 16:00
kingsfighter 写道
不错,不过和dwr比起来,有什么优势?应该把亮点都列出来。

优势:数据压缩传输,尤其是后台返回list数据,是经过压缩后,下载效率就非常高了,例如应用开发中1000~n条数据的加载

j5321594 写道
能不能 不要每次把页面的输入 标签的值提交到后台? 项目是个单页的大量的输入标签都被隐藏着,每次都会提交大量无用数据给后台。

肯定可以指定定特定的参数传递了
7 楼 liberty1789 2012-02-17 08:46
跟DWR有什么区别呢?即使有区别,那点区别意义在哪呢?
6 楼 j5321594 2011-12-14 18:19
能不能 不要每次把页面的输入 标签的值提交到后台? 项目是个单页的大量的输入标签都被隐藏着,每次都会提交大量无用数据给后台。
5 楼 beingchou 2011-08-21 15:10
搞不懂什么趋势啊这是。。。。
4 楼 zyy7567093 2011-08-19 17:10
比DWR的优势在哪 没有说明
3 楼 jxpath 2011-08-19 12:33
据传:
引用
1、数据传输压缩、自动解压

2、不要注册使用的java类

3、支持数据流传输

2 楼 conanca 2011-08-19 10:44
flash+js+jsp+java ?很好奇,研究下
1 楼 kingsfighter 2011-08-19 10:43
不错,不过和dwr比起来,有什么优势?应该把亮点都列出来。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • dfactor:Java中的轻量级服务器框架,一个用java编写的多核服务端开发框架

    去中心化自动组网,充分利用内结点互相发现相互通信开发中js脚本开发支持因素dfactor是一个基于actor模型的消息处理框架,充分利用多核处理器,平衡业务负载,可参考erlang dfactor使用java编写,天生多平台支持,...

  • 转载: 轻量级 js2java RPC 框架发布

    1. 相关介绍: ...是一个基于flash、java、js架构设计的超轻量级RPC框架。 1.2 特点是什么 1、JS2Java RPC:能够在javascript的web浏览器环境中指定java类,获取该类实例的属性,调用该实例的方法

  • java 轻量rpc框架_HTTP-RPC:轻量级跨平台REST框架

    java 轻量rpc框架 重要要点 HTTP-RPC是一个轻量级的开源框架,用于使用RPC隐喻开发RESTful应用程序 提供服务器和客户端API 支持多种操作系统和设备 支持多种语言,包括Java,Objective-C / Swift和...

  • 轻量级Rpc框架Hessian学习笔记

    1.Hessian简介Hessian是一个轻量级的远程http工具,采用binaray Rpc协议,适合发送二进制数据,同时具有防火墙穿透能力,hessian一般通过web应用来提供服务。...

  • 什么是RPC框架?

    RPC(Remote Procedure Call)即远程过程调用,不同于本地调用,RPC是指调用远端机器的函数或方法,且不需要关心底层的调用细节,如网络协议和传输协议等,对于调用者来说,和调用本地方法没有什么区别。

  • Solon 1.6.10 重要发布,轻量级的应用开发框架

    Solon 是一个轻量级应用开发框架。支持 Web、Data、Job、Remoting、Cloud 等任何开发场景。短小而精悍! 强调,克制 + 简洁 + 开放的原则 力求,更小、更快、更自由的体验 关于 Solon Cloud Solon Cloud 定义了一...

  • json-rpc-for-java:本开源作者的书)《 JavaScript高级应用与实践》之后推出的开源代码,小于100行js代码,小于10个java类,实现json rpc for java(AJAX调用java类方法);仅不到100行的javascript代码和不到10个java文件实现的超级轻量级​​的通过javaScript快速调用java对象并返回任意对象的轻量级框架,并支持级联调用,无需多余JavaScript编程,就可以通过javascript调用被注册的java对象并返回java对象,如

    仅不到100行的javascript代码和不到10个java文件实现的超轻量级的通过javaScript快速调用java对象并返回任意对象的轻量级框架,和支持级联调用,而无需额外JavaScript编程,就可以通过javascript调用被注册的java...

  • 自研RPC框架-原理篇

    笔者工作也有些时间了,在某互联网一二线场都工作过,当时在某二线厂工作时,部门自研了RPC框架,用来支撑部门C端产品业务开发,当时一直想自己也要写一个RPC框架,但由于一直没有时间,这个想法隔着了很久。...

  • HTTP-RPC:轻量级跨平台REST框架

    核心要点\HTTP-RPC是一个开发RESTful应用的轻量级开源框架,同时符合RPC隐喻的做法; \提供了服务端和客户端的API; \支持各种操作系统和设备; \支持多种语言,包括Java、Objective-C/Swift和JavaScript。HTTP-RPC...

  • 推荐这款全新一代性能强到爆的RPC框架

    RPC、gRPC、Thrift、HTTP,大家知道它们之间的联系和区别么?...RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节,服务调用者可以像调用本地接口一样调用远程

  • 高并发系统设计——RPC框架的技术选型

    如果想要解决这两方面问题,你需要了解,微服务化所需要的中间件的基本原理,和使用技巧,那么本节课,我会带你掌握,解决第一点问题的核心组件:RPC 框架。 你的垂直电商系统的 QPS 已经达到了每秒 2 万次,在做了...

  • Smart Framework:轻量级 Java Web 框架

    Smart Framework:轻量级 Java Web 框架 收藏 黄勇 工作闲暇之余,我开发了一款轻量级 Java Web 框架 ——SmartFramework。 开发该框架是为了: 加速基于 Java 的中小型...

  • 跨语言rpc框架Thrift

    RPC技术简单说就是为了解决远程调用服务 的一种技术,使得调用者像调用本地服务一样方便透明 Thrift的定义   Thrift是一个轻量级、跨语言的RPC框架,主要用于各个服务之间的RPC通信,最初由Facebook于2007 年开发...

  • RPC框架:10万QPS下如何实现毫秒级的服务调用?

    RPC框架:10万QPS下如何实现毫秒级的服务调用?RPC如何提升网络传输性能选择合适的序列化方式总结: 我们已经决定对系统做服务化拆分,以便解决扩展性和研发成本高的问题。与此同时,我们在不断学习的过程中还发现,...

  • OF.JsonRpc (.NET轻量级服务框架)

    RPC 2.0 Specification》的 .NET 实现, 它是基于 HTTP (也能支持本地调用和TCP)方式实现的轻量级松耦合的远程调用服务框架,提供了高效可用、无侵入式的方式搭建自己的服务平台,可以快速开发、调试、发布、调用...

  • 轻量级开发技术总结

    目前轻量级开发技术非常多,适用的场景也各有不同,比如我们熟知的PHP、ASP .NET(ASP 和SAP .NET不是一个东西,二者编程思想都不一样)他们适用于中小型Web开发,尤其PHP非常适合开发Web站点。Java非常适合大型和...

  • 1基于蓝牙的项目开发--蓝牙温度监测器.docx

    1基于蓝牙的项目开发--蓝牙温度监测器.docx

  • AppDynamics:性能瓶颈识别与优化.docx

    AppDynamics:性能瓶颈识别与优化

  • percona-xtrabackup-2.4.28-1.ky10.x86-64.rpm

    xtrabackup银河麒麟v10rpm安装包

  • 2024年全球产品经理大会(脱敏)PPT合集(34份).zip

    2024年全球产品经理大会(脱敏)PPT合集,共34份。 1、AI 原生产品设计的 7 个反共识 2、AI 时代的策略产品与内容社区推荐实践 3、AI时代的用户界面设计 4、AI智能陪练:大模型赋能销售成长 5、AI浪潮中的应用主义者 6、AI驱动下的B端产品的思考与创新 7、AI驱动业务增长的探索与实践 8、Al Native 生产力工具的发展、价值与商业落地 9、B端产品设计避坑指南 10、GenAl驱动的xGen电商AI平台产品实践与思考 11、Kwaipilot 在快手的落地实践 12、OPPO AI的探索新交互到新生态 13、RPA + AI打造大模型驱动的领先数字员工 14、产品AI化重塑的思考与实践 15、产品分析:通过关键指标助力团队与企业成功 16、从RPA到Al Agent,高价值、可落地的智能助手 17、从流量运营到AI驱动的机器增长 18、做穿越时代的产品 19、创造好工具,创造世界一流产品力 20、医疗健康场景的大模型产品探索 21、即时零售柔性供应链体系建设与AIGC在零售数字化的探索 22、向量数据库的出海实践与未来展望 23、大模型在B端落地思考实践

Global site tag (gtag.js) - Google Analytics