一直在JAVAEYE里混,一直没写过BLOG。最近看一个大哥说写BLOG,对人生有很多好处于是打算写一些。
今天在家闲来无事,决定要研究一下JSON-RPC-JAVA据说是和DWR有些类似,所以决定研究一下。于是上网下了一个例子,看了看觉得比较简单,于是做了试试。
下来的代码中有一个JSON-RPC的jar包,和他的源码都在一个eclipse工程里,我一个开始还纳闷为什么一个工程里又有jar又有源码。不过没上心,直接把jar包靠到我的工程里。没想到这是我的噩梦的开始。一开始代码如下
首先是把JSON-RPC的一个servlet配到web.xml里。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <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> </web-app>
2:写一个后台的JAVA类,这样前台可以调用。
package com.bean;
import java.io.Serializable;
import jcore.jsonrpc.common.JsonRpcObject;
public class SelectBo extends JsonRpcObject implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer selectName(String name)
{
Integer i = name.length();
return i;
}
}
一定要继承JsonRpcObject类和实现序列化。
3:在页面注册
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//调用json-rpc进行注册,第二个参数是以后JS中用的。
jcore.jsonrpc.common.JsonRpcRegister.registerObject(request, "myjsonrpc",com.bean.SelectBo.class);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>测试JSON-RPC for java</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<script type="text/javascript" src="JsonRpcClient.js"></script>
<script type="text/javascript">
//引用一个JS脚本,用他的JsonRpcClient方法获取一个对象(变量名JSON),
对象调用刚才注册时候的变量名,这时生成的就是后台的JAVA对象了。
var json = JsonRpcClient("JRPC"), myjsonrpc = json.myjsonrpc;
function test()
{
myjsonrpc.name = 'wangxiaowei';
alert(myjsonrpc.name);
var i = myjsonrpc.selectName(myjsonrpc.name);
}
</script>
</head>
<body>
<input type="button" value="测试" οnclick="test()"/>
</body>
</html>
要说这样可以了,可是怎么调试系统都报一个叫
2008-10-3 23:14:14 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet JSONRPCServlet threw exception
java.lang.StackOverflowError
at java.util.regex.Pattern.range(Unknown Source)
at java.util.regex.Pattern.clazz(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.group0(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.<init>(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at jcore.jsonrpc.common.ObjectToJSON.toJSON(ObjectToJSON.java:109)
最后我试着把源码重新打包OK解决了我晕。再次说明时间是检验一切真理的唯一标准。