相关链接
1 json-rpc-for-java
http://code.google.com/p/json-rpc-for-java/downloads/list
2 国人的json-rpc-for-java比老外的更好用
http://blog.csdn.net/jxpath/archive/2009/11/27/4888260.aspx
使用之后发现这个框架:JSON-RPC要注意的三个地方,其它还有什么就没有试出来了呀
1 JavaBean对象要用默认的无参构造函数,必须实现 java.io.Serializable序列化接口
2 JS方面: 必须注意:你的参数是String类型请在前后加',如:{username:'张三'}, 如是空值后台也会报错!
在传递对象请确保:参数类型的正确性,如你在age年龄中输入了非数字后台将报错!
3 通过在web.xml中注册的方式不能用!
更多精彩请参见官方示例:有更强大的级联调用
一 环境:XP+Myeclipse6.6+Tomcat7+JDK1.6
二 项目目录结构如下图
1 UserJSON.java
package jcore.jsonrpc.rpcobj; //必须是jcore.jsonrpc.rpcobj包下才可以免注册 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import jcore.jsonrpc.common.JsonRpcObject; import jcore.jsonrpc.entity.User; public class UserJSON extends JsonRpcObject implements java.io.Serializable{ private static final long serialVersionUID = 1L; /** * 直接返回普通类型 * */ public String helloJSONPRC(String userName){ //可从getAllInputParms获取页面值 //String userName = (String)this.getAllInputParms().get("userName"); return "Hello World "+userName +" !"; } /*** * 返回JavaBean类型 * */ public User getUser(){ return new User(1,"张三","123456",25); } public String saveUser(User user){ System.out.println("id: "+user.getUserId() + ",name:" + user.getUserName() + ",password: " + user.getUserPassword() + ",age: " + user.getAge()); return "保存用户成功!"; } /** * 返回List集合 * */ public List<User> getUserAll(){ List<User> users = new ArrayList<User>(); users.add(new User(1,"张三","123456",25)); users.add(new User(2,"李逵","123123",20)); return users; } /** * 返回Map集合 * */ public Map<String,User> getUserMapAll(){ Map<String,User> maps = new HashMap<String,User>(); maps.put("1",new User(1,"张三","123456",25)); maps.put("2",new User(2,"李逵","123123",20)); return maps; } }
2 User.java
package jcore.jsonrpc.entity; public class User implements java.io.Serializable{ private static final long serialVersionUID = 1L; private int userId; private String userName ; private String userPassword; private int age ; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User(int userId, String userName, String userPassword, int age) { super(); this.userId = userId; this.userName = userName; this.userPassword = userPassword; this.age = age; } /** * 必须注意:JSON-RPC必须要求你的JavaBean对象要用默认的无参构造函数 * */ public User(){ } }
3 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>
3 index.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>JSON-RPC</title> <script type="text/javascript"> var contextPath = "<%=path%>";// 关键的地方 </script> <script type="text/javascript" charset="UTF-8" src="js/JsonRpcClient.js"></script> <script type="text/javascript"> var myrpc = rpc.UserJSON; /** 传递变通字符串 */ function helloName(){ var userName = document.getElementById("userName").value; alert(myrpc.helloJSONPRC(userName)); } /** 传递javaBean对象 */ function saveUser(){ /** 必须注意:你的参数是String类型请在前后加',如:{username:'张三'} 如是空值后台也会报错!! 在传递对象请确保:参数类型的正确性,如你在age年龄中输入了非数字后台将报错! */ var user = "{"; user += "userId:"+ document.getElementById("userId").value; user += ",userName:'"+document.getElementById("userName").value+"'"; user += ",userPassword:'"+document.getElementById("userPassword").value+"'"; user += ",age:"+document.getElementById("age").value; user += "}"; var message = myrpc.saveUser(user); alert(message); } /** 获取对象 */ function getUser(){ var user = myrpc.getUser(); document.getElementById("userId").value = user.userId; document.getElementById("userName").value = user.userName; document.getElementById("userPassword").value = user.userPassword; document.getElementById("age").value = user.age; } /** 获取集合对象 */ function listUser(){ var users = myrpc.getUserAll(); var size = users.length; var userInfo = "<table border='1'>"; userInfo += "<tr>"; userInfo += "<td>ID</td>"; userInfo += "<td>姓名</td>"; userInfo += "<td>密码</td>"; userInfo += "<td>年龄</td>"; userInfo += "</tr>"; var user = ''; for(var i =0;i<size;i++){ user = users[i]; userInfo += "<tr>"; userInfo += "<td>"+user.userId+"</td>"; userInfo += "<td>"+user.userName+"</td>"; userInfo += "<td>"+user.userPassword+"</td>"; userInfo += "<td>"+user.age+"</td>"; userInfo += "</tr>"; } userInfo += "</table>"; document.getElementById("userInfo").innerHTML = userInfo; } /** 获取Map对象 */ function mapUser(){ var users = myrpc.getUserMapAll(); var size = users.length; var userInfo = "<table border='1'>"; userInfo += "<tr>"; userInfo += "<td>ID</td>"; userInfo += "<td>姓名</td>"; userInfo += "<td>密码</td>"; userInfo += "<td>年龄</td>"; userInfo += "</tr>"; var user = ''; for(var u in users){ user = users[u]; if(user.userId == undefined){ break; } userInfo += "<tr>"; userInfo += "<td>"+user.userId+"</td>"; userInfo += "<td>"+user.userName+"</td>"; userInfo += "<td>"+user.userPassword+"</td>"; userInfo += "<td>"+user.age+"</td>"; userInfo += "</tr>"; } userInfo += "</table>"; document.getElementById("userInfo").innerHTML = userInfo; } function testRegObject(){ alert(rpc.getRpcObj("com.liuzd.json.web.action.TestJson").testHello("欢迎天涯!!")); } </script> </head> <body> ID: <input type="text" name="userId" id="userId"> <br> 姓名: <input type="text" name="userName" id="userName"> <br> 密码: <input type="text" name="userPassword" id="userPassword"> <br> 年龄:<input type="text" name="age" id="age"> <br> <input type="button" value="测试" onclick="helloName();"> <br> <input type="button" value="获取User" onclick="getUser();"> <br> <input type="button" value="保存User" onclick="saveUser();"> <br> <input type="button" value="List显示" onclick="listUser();"> <br> <input type="button" value="map显示" onclick="mapUser();"> <br> <input type="button" value="测试未注册的对象" onclick="testRegObject();"> <br> <div id="userInfo"> </div> </body> </html>
4 TestJSON.java未注册的使用
A TestJSON.java code
package com.liuzd.json.web.action; // 不是jcore.jsonrpc.rpcobj包下要进行注册 public class TestJson implements java.io.Serializable{ private static final long serialVersionUID = 1L; public String testHello(String hello){ return hello; } }
B JS调用方式
function testRegObject(){ alert(rpc.getRpcObj("com.liuzd.json.web.action.TestJson").testHello("欢迎天涯!!")); }
个人觉得这种方式不错吧!
工程附件说明:
JsonRpcForJava3.2_sample.rar官方示例
TestJsonRPC-project.zip 我的DEMO示例
JSON-RPC-lib.zip 所要的jar重新打包:JSON-RPC.jar文件