json-rpc-자바 전면 수정

json-rpc-java 가 가장 답답 한 점 은 bridge 를 session 에 등록 하 는 것 입 니 다.물론 모든 방법 을 GlobalBridge 에 등록 할 수 있 습 니 다.하지만 문제 가 있 습 니 다.클 라 이언 트 가 JSONRpcClient 를 만 들 때 listMethod 는 모든 등록 방법 을 되 돌려 줍 니 다.하 나 는 그렇지 않 습 니 다.물건 이 너무 많 으 면 무 섭 습 니 다.또한 응용 전단 에 도 JSONRpcClient 와 필사적으로 묶 여 있 습 니 다.
소량의 dispath 방법 을 드 러 내 고 반사 적 으로 들 어 오 는 방법 으로 이름 을 Map 매개 변수 에 전달 하 는 방법 이 있 습 니 다.그러나 이런 느낌 도 이상 하기 때문에 자신의 생각 으로 개조 하 는 것 입 니 다.클 라 이언 트 는 new JSONRpcClient 가 아니 라 url 방식 으로 노출 된 업무 구성 요 소 를 방문 합 니 다.예 를 들 어 XXXService.xxx.모든 노출 구성 요 소 를 GlobalBridge 에 등록 합 니 다.수정 은 사실 Servlet 을 고치 면 됩 니 다.
public class RpcServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private final static int buf_size = 4096;

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ClassCastException {
		String action = request.getRequestURI().substring(
				request.getServletPath().length()
						+ request.getContextPath().length() + 1);
		JSONRPCBridge json_bridge = JSONRPCBridge.getGlobalBridge();
		response.setContentType("text/plain;charset=utf-8");
		OutputStream out = response.getOutputStream();
		String charset = request.getCharacterEncoding();
		if (charset == null)
			charset = "UTF-8";
		BufferedReader in = new BufferedReader(new InputStreamReader(request
				.getInputStream(), charset));
		CharArrayWriter data = new CharArrayWriter();
		char buf[] = new char[buf_size];
		int ret;
		while ((ret = in.read(buf, 0, buf_size)) != -1)
			data.write(buf, 0, ret);
		
		String json = "{\"method\": \""+action+"\", \"params\": "+data.toString()+"}";
		// Process the request
		JSONObject json_req = null;
		JSONRPCResult json_res = null;
		try {
			json_req = new JSONObject(json);
			json_res = json_bridge.call(new Object[] { request }, json_req);
		} catch (ParseException e) {
			e.printStackTrace();
			json_res = new JSONRPCResult(JSONRPCResult.CODE_ERR_PARSE, null,
					JSONRPCResult.MSG_ERR_PARSE);
		}

		byte[] bout = json_res.toString().getBytes("UTF-8");
		response.setIntHeader("Content-Length", bout.length);

		out.write(bout);
 		out.flush();
		out.close();
	}
}

이전 보다 고치 기 가 쉬 웠 습 니 다.그 다음 에 클 라 이언 트 에서 사용 할 수 있 는 접근 기 를 구축 하 는 것 입 니 다.
응용 프로그램 은 Ext 와 결합 되 어 있 기 때문에 기본 라 이브 러 리 를 사 용 했 습 니 다(게 으 름 피 웠 습 니 다- -)그리고 jsonrpc js 라 이브 러 리 의 몇 가지 도움말 방법 으로 동기 화 와 비동기 호출 을 실현 합 니 다.
JsonRpc = {
	rootUrl : ""
};
JsonRpc.request = function(url, params, callback) {
	if (callback) {
		Ext.Ajax.request({
			url : JsonRpc.rootUrl + url,
			params : toJSON(params),
			method : "POST",
			callback : function(op, success, response) {
				if (success) {
					var o = eval("(" + response.responseText + ")");
					callback(o.result, o.error);
				} else {
					callback(undefined, {
						msg : "failed"
					});
				}
			}
		});
	} else {
		var conn = Ext.lib.Ajax.getConnectionObject().conn;
		conn.open("POST", JsonRpc.rootUrl + url, false);
		conn.send(toJSON(params));
		var o = eval("(" + conn.responseText + ")");
		if (o.error) {
			throw o.error;
		} else {
			return o.result;
		}
	}
};

 동기 화 와 비동기 사용 은 다음 과 같 습 니 다.
//  
JsonRpc.request("XXXService.xx", [params]);
//  
var callback = function(result, ex) {
};
JsonRpc.request("XXXService.xx", [params], callback);

좋은 웹페이지 즐겨찾기