thrift提供了基于jquery--ajax的客户端调用方式,返回json数据。
生成js代码使用如下命令:
thrift --gen js Contact.thrift
这样会在gen-js目录下生成两个js文件:Contact_types.js,ContactManager.js,将这两个js文件拷贝到项目中。
同时需要导入thrift.js(thrift-0.9.1\lib\js目录下)和JQuery.js(1.5以上的版本)。
编写一个jsp页面thriftJs.jsp,用于展示客户端的调用方法:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/js/thrift.js"></script>
<script type="text/javascript" src="resources/js/jquery-1.7.2.min.js"></script>
<!-- ContactManager -->
<script type="text/javascript" src="resources/js/Contact_types.js"></script>
<script type="text/javascript" src="resources/js/ContactManager.js"></script>
<script type="text/javascript">
$(function() {
try {
var path = "<%=request.getContextPath()%>";
//使用ajax,不能跨域访问,这里传入一个type=json参数
var transport = new Thrift.Transport(path + "/contractManageServletProxy.do?type=json");
var protocol = new Thrift.Protocol(transport);
var client = new ContactManagerClient(protocol);
var result_GetString = client.getAll(); //json格式
//alert(result_GetString);
$("#thriftjs").html(result_GetString[0].id);
} catch (e) {
alert("出错鸟:" + e.message);
}
});
</script>
</head>
<body>
thrift js result:
<div id="thriftjs"></div>
</body>
</html>
服务端依然使用http://hanqunfeng.iteye.com/blog/1946999中的servlet代理,只不过这里为了使其能够支持json类型,对代理进行了改写:
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
TTransport inTransport = null;
TTransport outTransport = null;
TProtocolFactory inProtocolFactory = null;
TProtocolFactory outProtocolFactory = null;
String local_type = request.getParameter("type");
try {
if(StringUtils.hasText(local_type)){
protocolType = local_type;
}
if ("json".equals(protocolType)) {//支持json协议
inProtocolFactory = new TJSONProtocol.Factory();
outProtocolFactory = new TJSONProtocol.Factory();
response.setContentType("application/json");
} else {
inProtocolFactory = new TCompactProtocol.Factory();
outProtocolFactory = new TCompactProtocol.Factory();
response.setContentType("application/x-thrift");
}
if (null != this.customHeaders) {
for (Map.Entry<String, String> header : this.customHeaders) {
response.addHeader(header.getKey(), header.getValue());
}
}
InputStream in = request.getInputStream();
OutputStream out = response.getOutputStream();
TTransport transport = new TIOStreamTransport(in, out);
inTransport = transport;
outTransport = transport;
TProtocol inProtocol = inProtocolFactory.getProtocol(inTransport);
TProtocol outProtocol = outProtocolFactory
.getProtocol(outTransport);
processor.process(inProtocol, outProtocol);
out.flush();
} catch (TException te) {
throw new ServletException(te);
}
}