AJAXPRC是快速、简单的Javascript远程方法调用。它允许你使用Javascript调用服务端方法,基于JSON数据协议,开源授权(LGPL),可同步和异步调用。

使用AJAXRPC,您可以像开发传统的C/S程序一样,来开发WEB程序,让WEB开发更简单和高效。

支持服务端语言:Java、.Net、PHP。
支持浏览器:IE、FireFox、Opera、Safari、Chrome。

最新版本: 1.0
最近更新: 2010-10-10

使用AJAXRPC

首先,我们在服务端定义了一个类和静态方法:

public class Test {
	public static String sayHello(String name){
		return "hello, " + name;
	}
}

注意:必须是公开的静态方法。

然后,我们使用AJAXRPC客户端,对服务端的方法进行调用。

注意:在调用RPC方法时,如果没有传递回调函数,则是同步调用;如果传递回调函数,则是异步调用。

同步调用

<script type="text/javascript">
......
try{
    var obj = Test.sayHello('world!');
    ......
}catch(e){
    //e.error 错误码
    //e.message 错误描述
}
......
</script>

不传递回调函数,以try…catch来处理错误。在同步调用模式下,如果有网络错误、业务逻辑错误等,会抛出一个异常。

异步调用

<script type="text/javascript">
......
Test.sayHello('world!',
    function(obj){          //success callback function
        ......
    },
    function(error, message){    //fail callback function
    }

);
......
</script>

传递回调函数作为参数。如果只有一个回调函数, 则默认是成功的回调函数。

当我们通过Javascript调用服务端方法时,会传递一些参数,这些参数有一个约定的类型转换,如下表。

数据类型映射表

AJAXRPC支持基本数据类型、自定义类,不支持泛型。

Javascript Java .Net Php 说明
Number Short,short
Integer,int
Long,long
Float,float
Double,double
short,Int16
int,Int32
long,Int64
float
Double,double
Integer
Float
Double
数字类型之间没有严格的界限,可以任意转换
Boolean Boolean,boolean Boolean,bool Boolean  
String String String,string String  
Date Date DateTime String 日期字符串”Y-m-d\TH:i:s“格式,php需要额外处理
Object HashMap,Map Hashtable,IDictionary Object  
Array ArrayList,List ArrayList,IList Array  
null null null NULL  

AJAXRPC完整示例

首先我们有一个服务端的类,和一些静态方法:

public class Test {
	//test Date
	public static Date getTime(){
		return new Date();
	}
	//test Number
	public static int add(int a, int b){
		return a + b;
	}
	//test String
	public static String sayHello(String name){
		return "hello, " + name;
	}
	//test Boolean
	public static Boolean isTrue(Boolean b){
		return b == true;
	}
	//test Object
	public static String addUser(Map user){
		String id = UUID.randomUUID().toString();
		user.put("id", id);
		//insert to database
		//...
		return id;
	}
	//test Array
	public static List getUsers(String name){
		List users = new ArrayList();
		for(int i=0; i<20; i++){
			Map user = new HashMap();
			user.put("name", name+i);
			user.put("gender",  i%2);
			user.put("birthday", new Date());

			users.add(user);
		}
		return users;
	}
	//test user defined class
	public static User updateUser(User user)
	{
	    user.birthday = new Date();
	    //update to database...
	    return user;
	}
	//test user defined class array
	public static User[] saveUsers(User[] users)
	{
	    for (int i = 0, l = users.length; i < l; i++)
	    {
	        User user = users[i];
	        user.name = "Server" + i;
	        user.birthday = new Date();
	        //update to database...
	    }
	    return users;
	}
}

使用AJAXRPC只需要几个简单的步骤,依次为:描述RPC,发布RPC,生成RPC客户端代理脚本,创建Javascript RPC客户端对象并调用服务端方法。

1.rpc_config.xml

用于描述RPC

<?xml version="1.0″ encoding="UTF-8″?>
<services>
	<service id="Test" class="Test"/>
</services>

说明:
1.class是服务端的类名, id是javascript中使用到的类名, id可以自定义别名
2.class上定义的公开静态方法, 被全部发布到客户端
3.在php中,必须为service指定一个文件路径,如:<service id="Test" class="Test" path="/test/Test.php"/>
4.在java中,rpc_config.xml被放在web.xml的同级目录。

2.ajaxrpc/Service.jsp

发布RPC服务端方法,如ajaxrpc/Service.jsp。

<%@ page import="org.ajaxrpc.*" %> 
<%      HttpContext.setCurrent(request, response);

      AJAXRPC_Server server = new AJAXRPC_Server("rpc_config.xml");
      server.run();
%>

3.ajaxrpc/Script.jsp

自动生成RPC的客户端代理脚本,如ajaxrpc/Script.jsp。

<%@ page import="org.ajaxrpc.*" %>  <%
      HttpContext.setCurrent(request, response);

      AJAXRPC_Script script = new AJAXRPC_Script("rpc_config.xml");
      response.getWriter().write(script.getScripts());
%>

4.使用Javascript调用服务端方法

这里做几件事:

1)引入AJAXRPC.js;
2)自动生成调用脚本ajaxrpc/Script.jsp;
3)创建AJAXRPC_Client客户端对象new AJAXRPC_Client("ajaxrpc/Server.jsp");
4)直接调用服务端方法

<html>
<head>
    <title>Test AJAXRPC</title>
</head>

<body>
    <input type="button" value="test Date" onclick="testDate()" /><br />
    <input type="button" value="test Number" onclick="testNumber()" /><br />
    <input type="button" value="test String" onclick="testString()" /><br />
    <input type="button" value="test Boolean" onclick="testBoolean()" /><br />

    <input type="button" value="test Object" onclick="testObject()" /><br />
    <input type="button" value="test Array" onclick="testArray()" /><br />
    <input type="button" value="test User Class" onclick="testUserClass()" /><br />   
    <input type="button" value="test UserClass Array" onclick="testUserClassArray()" /><br />  
</body>

</html>
<script src="scripts/AJAXRPC.js" type="text/javascript"></script>
<script src="ajaxrpc/Script.jsp" type="text/javascript"></script>
<script type="text/javascript">
var client = new AJAXRPC_Client('ajaxrpc/Server.jsp');
var Test = client.Test;

function testDate(){
    var o = Test.getTime();
    alert(o);
}
function testNumber(){
    var o = Test.add(1, 10);
    alert(o);
}
function testString(){
    var o = Test.sayHello('world!');
    alert(o);
}
function testBoolean(){
    var o = Test.isTrue(true);
    alert(o);
    var o = Test.isTrue(false);
    alert(o);
}
function testObject(){
    var user = {
        id: null,
        name: 'ajaxrpc',
        birthday: new Date(),
        gender: 1
    };
    var id = Test.addUser(user);
    alert(id);
}
function testArray(){
    var users = Test.getUsers('ajaxrpc');
    alert(users.length +":"+ users[0].name +":"+ users[users.length-1].name);
}
function testUserClass(){
    var user = {
        id: null,
        name: 'ajaxrpc',
        birthday: null,
        gender: 1
    };
    user = Test.updateUser(user);
    alert(user.birthday);
}
function testUserClassArray(){
    var users = [];
    for(var i=0; i<20; i++){
        var user = {
            id: i,
            name: 'ajaxrpc'+i,
            birthday: new Date(),
            gender: i%2
        };
        users.push(user);
    }
    var users = Test.saveUsers(users);
    alert(users.length +":"+ users[0].name +":"+ users[users.length-1].name);
}
</script>

AJAXRPC的使用是如此简单,但是能极大的简化WEB AJAX程序的复杂性,帮助人们更好更快的完成AJAX开发工作。

希望AJAXRPC能成为您不可获取的AJAX开发好帮手,如果您有任何问题,可以通过以下邮件地址联系我:
fcrong@gmail.com