AJAXPRC实现了使用Javascript调用服务端方法

最近看到AJAXPRC相关介绍,其实他的实现相当于Ajax+DWR+JAVA的实现机制(我的另外一篇博客有相关介绍:http://blog.csdn.net/jimesum1/archive/2010/10/14/5939918.aspx),实现了使用Javascript调用服务端方法,这里使用起来更简单,不错,不过有待检验。以下转载于:

http://ajaxrpc.com/; http://ajaxrpc.com/cn/index.html

 

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支持基本数据类型、自定义类,不支持泛型。

JavascriptJava.NetPhp说明
NumberShort,short
Integer,int
Long,long
Float,float
Double,double
short,Int16
int,Int32
long,Int64
float
Double,double
Integer
Float
Double
数字类型之间没有严格的界限,可以任意转换
BooleanBoolean,booleanBoolean,boolBoolean 
StringStringString,stringString 
DateDateDateTimeString日期字符串”Y-m-d/TH:i:s“格式,php需要额外处理
ObjectHashMap,MapHashtable,IDictionaryObject 
ArrayArrayList,ListArrayList,IListArray 
nullnullnullNULL 

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" οnclick="testDate()" /><br />
    <input type="button" value="test Number" οnclick="testNumber()" /><br />
    <input type="button" value="test String" οnclick="testString()" /><br />
    <input type="button" value="test Boolean" οnclick="testBoolean()" /><br />

    <input type="button" value="test Object" οnclick="testObject()" /><br />
    <input type="button" value="test Array" οnclick="testArray()" /><br />
    <input type="button" value="test User Class" οnclick="testUserClass()" /><br />   
    <input type="button" value="test UserClass Array" οnclick="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开发工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值