当前位置: 首页 > 工具软件 > JS2Java RPC > 使用案例 >

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

卢志业
2023-12-01

 

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 οnclick=fnTest()>一般对象的发送、调用java、返回对象(List)</button>          
<button οnclick=fnTestRow()>一般对象的发送、调用java、逐行返回对象(List)</button>  
<button οnclick=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

本文是转载自:http://www.iteye.com/news/22527

 

 类似资料: