目 录
概述
继《JavaScript高级应用与实践》之后推出的json-rpc-for-java开源代码,是仅仅100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持级联调用,也就是说不需要额外 的JavaScript编程,就可以通过javascript调用被注册的java对象并返回java对象,如果被返回的对象还有方法,这个在javascript中返回的java对象的变量,还可以继续调用它的方法.....这就是这个轻量级json-rpc-for-java的神奇之处。
链接
作者相关链接
开源项目地址
http://code.google.com/p/json-rpc-for-java/
工程svn下载地址
http://json-rpc-for-java.googlecode.com/svn/trunk/
不需要用户名和密码。
示例工程下载地址
http://json-rpc-for-java.googlecode.com/files/JsonRpcExample2008-08-05.rar
测试环境:MyEclipse、JRE1.4(或1.6)、tomcat 5.0(或6.0) 如果你要测试,可以采用相应的环境,不一定要那么高版本的环境 ,Import工程后请注意修改工程中JRE为正确的路径:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="width: 414.75pt; height: 446.25pt;" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME%7E1%5Cjust%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png"></imagedata></shape>
支持的浏览器
IE4、IE5、IE6、IE7、IE8、 FireFox、Opera、Safari等等。
Java对象到JavaScript对象的对照表
Java对象
| JavaScript对象
| 说明
|
java.lang.String | String |
|
java.lang.Object | String | 调用java对象的toString()后转换到JavaScript里 |
java.util.Date、java.sql.Timestamp | String | 可是为yyyy-MM-dd HH: mm:ss.000,如果时分秒都为0,则为:yyyy-MM-dd |
java.lang.Boolean | Blooean | 对应的值:true、false |
java.lang.Character | String | 单引号的字符串,例如:‘c’ |
java.lang.Short、 java.lang.Integer、 java.lang.Long、 java.lang.Float、 java.lang.Double、 java.math.BigDecimal | Number | 到JavaScript中都为数字对象,可以直接参与加、减、乘、除运算 |
java.util.Map | Object | 例如:obj[“key1”]、obj[“key3”]、obj.key3,唯独没有function的方法,当然,属于Object.prototype的function属性依然有的 |
java.util.List | Array | 例如:a[0]、a[2].getList() 也就是说List里也可以存在复合对象,这些对象依然可以有自己的方法 |
null | null | 空对象 |
其他Java对象 | Object | 例如:obj.displayName()、obj.aac001,可以有属性和方法 |
功能介绍
自动捕获异常
在你编写的java服务类的方法中不需要try{….}catch(Exception e){},本框架会为你捕获错误消息,但你在javascript中没有获取到正确的数据,可以调用异步对象的方法getErrMsg()获取异常消息,该方法封装在jcore.jsonrpc.common.JsonRpcObject中,也就是AJAX服务java基类中。
JavaScript中释放注册的Java服务对象
你只需要在JavaScript中调用release()就可以释放注册的Java对象资源,详细见示例工程,或者见“
http://code.google.com/p/json-rpc-for-java/wiki/Wiki32
级联调用功能
不明白的地方请结合示例工程进行理解。
1、Java中注册复合对象myjsonrpc
2、JSP JavaScript中获取该对象:var myjsonrpc = JsonRpcClient().myjsonrpc;
3、调用被注册的java对象的方法getMyObj,返回复合的java对象TestDomain:
var oDomain = myjsonrpc. getMyObj();
// 继续调用该返回的java对象的方法
alert(oDomain. toXml())
或者:alert(myjsonrpc. getList()[1].toXml());
如果toXml返回的还是一个复合的Java对象,你可以继续在JavaScript中继续调用,而不需要额外的编程。
使用
Web.xml配置
需要在web.xml中加入下面的配置“
- <servlet>
- <servlet-name>JSONRPCServlet</servlet-name>
- <servlet-class>
- jcore.jsonrpc.servlet.JSONRPCServlet
- </servlet-class>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>JSONRPCServlet</servlet-name>
- <url-pattern>/JRPC</url-pattern>
- </servlet-mapping>
引入Jar包
需要在工程中引入:JSON-RPC.jar、commons-logging.jar、commons-logging-api.jar,其中后面两个jar在示例工程中的JsonRpcExample\webapp\WEB-INF\lib\ 下。示例工程下载地址:
http://json-rpc-for-java.googlecode.com/files/JsonRpcExample2008-08-05.rar
而,JSON-RPC.jar,你也可以引入源代码重新进行打包。
AJAX服务Java类的编写
必须继承与jcore.jsonrpc.common.JsonRpcObject,并实现接口java.io.Serializable。例如示例工程中的AJAX服务Java类:
package test; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map;
import jcore.jsonrpc.common.JsonRpcObject;
public class TestObject extends JsonRpcObject implements Serializable{ private static final long serialVersionUID = 1L;
private List myList = new ArrayList(); private Map map = new HashMap();
public TestObject() { myList.add("good"); myList.add(new TestDomain()); // map中也可以放入复合对象 map.put( |