AJAXPRC实现了使用Javascript调用服务端方法
2010-10-14 08:29
686 查看
最近看到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。
下载: Java .Net PHP
博客
提交BUG
Developer Guide:English Chinese Japanese
最新版本: 1.0
最近更新: 2010-10-10
注意:必须是公开的静态方法。
然后,我们使用AJAXRPC客户端,对服务端的方法进行调用。
注意:在调用RPC方法时,如果没有传递回调函数,则是同步调用;如果传递回调函数,则是异步调用。
不传递回调函数,以try…catch来处理错误。在同步调用模式下,如果有网络错误、业务逻辑错误等,会抛出一个异常。
传递回调函数作为参数。如果只有一个回调函数, 则默认是成功的回调函数。
当我们通过Javascript调用服务端方法时,会传递一些参数,这些参数有一个约定的类型转换,如下表。
使用AJAXRPC只需要几个简单的步骤,依次为:描述RPC,发布RPC,生成RPC客户端代理脚本,创建Javascript RPC客户端对象并调用服务端方法。
说明:
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的同级目录。
1)引入AJAXRPC.js;
2)自动生成调用脚本ajaxrpc/Script.jsp;
3)创建AJAXRPC_Client客户端对象new AJAXRPC_Client("ajaxrpc/Server.jsp");
4)直接调用服务端方法
AJAXRPC的使用是如此简单,但是能极大的简化WEB AJAX程序的复杂性,帮助人们更好更快的完成AJAX开发工作。
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。
下载: Java .Net PHP
博客
提交BUG
Developer Guide:English Chinese Japanese
最新版本: 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开发工作。
相关文章推荐
- 使用AjaxPro.Net框架实现在客户端调用服务端方法
- 使用AjaxPro.Net框架实现在客户端调用服务端的方法
- Asp.net中使用javaScript实现前后台方法的相互调用
- 使用MVC中的HtmlHelper对象的ActionLink方法,实现一个Javascript:void(0)效果,去调用一个JS方法
- Android编程使用WebView实现与Javascript交互的方法【相互调用参数、传值】
- 零起点 Asp.net中使用javaScript实现前后台方法的相互调用
- Javascript中bind()方法的使用与实现
- javascript iframe内的函数调用实现方法
- iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法
- MongoDB服务端JavaScript脚本使用方法
- Javascript中bind()方法的使用与实现
- javascript实现相同事件名称,不同命名空间的调用方法
- AIDL基本使用1----调用服务端方法
- 使用javascriptcore实现供h5调用的native接口
- ajax javascript post 方法实现(与C#混合使用)
- Javascript中bind()方法的使用与实现
- IOS-29-Hybrid混合开发(一):OC调用JS的方法的使用:stringByEvaluatingJavaScriptFromString
- JavaScript调用Activex控件的事件的实现方法
- Android 使用WebView中的JavaScript调用Android方法