Thrift生成Java端和JavaScript端代码,并实现前端调用后端的方法
2018-03-08 20:26
656 查看
Thrift生成Java端和JavaScript端代码,并在前端调用后端的方法,服务通过Vertx提供
1.什么是Thrift下面这篇文章介绍的很详细,可以点进去了解一下什么是Thrift
http://blog.csdn.net/qq_27784479/article/details/73250958
2.如何生成java端和js端代码
windows下比较简单,官方提供了预编译的exe文件。地址在下面:
https://thrift.apache.org/docs/install/windows
编写好.thrift文件,语法在上面的链接里可以学习一下,直接上代码;
namespace java test.thrift struct FieldInfo{ 1:string fieldName 2:FieldType fieldType 3:string aliesName 4:string desc 5:i32 order } enum FieldType{ LONGLAT = 1, TEXT = 2, TIME = 3 } enum DbType{ ORACLE = 1, POSTGRESQL =2 } struct ReturnResult { 1:bool status 2:string id 3:string message } service DbSourceTableMgr{ ReturnResult addDbSourceTable(1:DbType dbtype,2:string address,3:i32 port,4:string user,5:string pwd,6:string desc,7:string tablename,8:bool ismulti,9:string multirule,10:FieldInfo fieldInfo), ReturnResult deleteDbSourceTable(1:string id) }
将Thrift文件和下载的thrift.exe放在一个文件夹下面,执行以下命令:
thrift-0.10.0.exe -r --gen js --gen java test.thrift
即可生成gen-java文件夹和gen-js文件夹,里面分别包含了服务端的java代码和前端的js代码。
生成的java端代码包括:
DbSourceTableMgr.java DbType.java FieldInfo.java FiledType.java ReturnResult.java
生成的js端代码包括:
DbSourceTableMgr.js DbSourceTableMgr_types.js
对于test.thrift中的service DbSourceTableMgr会生成DbSourceTableMgr类,该类中有一个Iface接口,新建一个DbSourceTableMgr的实现类DbSourceTableMgrImp,继承DbSourceTableMgr.Iface,代码如下:
package com.link2map.thrift.imp; import org.apache.thrift.TException; import com.link2map.thrift.DbType; import com.link2map.thrift.DbSourceTableMgr; import com.link2map.thrift.FieldInfo; import com.link2map.thrift.ReturnResult; public class DbSourceTableMgrImp implements DbSourceTableMgr.Iface{ @Override public ReturnResult addDbSourceTable(DbType dbtype, String address, int port, String user, String pwd, String desc, String tablename, boolean ismulti, String multirule, FieldInfo fieldInfo) throws TException { System.out.println(dbtype); System.out.println(address); System.out.println(fieldInfo.getAliesName()+"|"+fieldInfo.getFieldType()); return new ReturnResult(true,"2222","sucess"); } @Override public ReturnResult deleteDbSourceTable(String id) throws TException { System.out.println("id"+id); return new ReturnResult(true,"1111","dddd"); } }
下面创建vertx服务:
package service; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TJSONProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TMemoryBuffer; import com.link2map.thrift.DbSourceTableMgr; import com.link2map.thrift.imp.DbSourceTableMgrImp; import io.vertx.core.AbstractVerticle; import io.vertx.core.Vertx; import io.vertx.core.http.HttpMethod; import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.CorsHandler; public class VertxService extends AbstractVerticle{ public static void main(String[] args) { Vertx vertx=Vertx.vertx(); Router router = Router.router(vertx); // 解决跨域问题 router.route().handler( CorsHandler.create("*").allowedMethod(HttpMethod.GET) .allowedMethod(HttpMethod.POST) .allowedMethod(HttpMethod.OPTIONS) .allowedHeader("X-PINGARUNER") .allowedHeader("Content-Type")); router.route("/server/*").handler(context->{ context.request().handler(buffer->{ byte[] arr=buffer.getBytes(); vertx.executeBlocking(future->{ String result=thriftRequest(arr); future.complete(result); }, res->{ if(res.succeeded()) { context.response().end(res.result().toString()); }else { context.response().end(res.cause().getMessage()); } }); }); }); vertx.createHttpServer().requestHandler(router::accept).listen(8088, res->{ if(res.succeeded()) { System.out.println("Server starts successfully!"); }else { System.out.println("Server fails to start!"); } }); vertx.deployVerticle(new VertxService()); } private static String thriftRequest(byte[] input){ try{ //Input TMemoryBuffer inbuffer = new TMemoryBuffer(input.length); System.out.println("input-length:"+input.length); inbuffer.write(input); TProtocol inprotocol = new TJSONProtocol(inbuffer); //Output TMemoryBuffer outbuffer = new TMemoryBuffer(100); TProtocol outprotocol = new TJSONProtocol(outbuffer); //这里是关键的地方,thrift提供了一个通用的service接口TProcessor,前端发送请求后,实际通过DbSourceTableMgrImp的方法进行处理 TProcessor processor = new DbSourceTableMgr.Processor(new DbSourceTableMgrImp()); processor.process(inprotocol, outprotocol); byte[] output = new byte[outbuffer.length()]; outbuffer.readAll(output, 0, output.length); return new String(output,"UTF-8"); }catch(Throwable t){ return "Error:"+t.getMessage(); } } }
至此,服务端代码已经完成;
下面对js端代码进行说明,需要用到Tomcat。
在Tomcat的webapps下新建一个项目,把gen-js中的两个js文件拷贝过来,还需要一个thrift.js,一共3个js文件,一个index.html文件,一个WEB-INF文件夹。WEB-INF中包含classes和libs两个文件夹。在index.html里引入3个js文件,调用如下代码:
var transport = new Thrift.Transport("http://127.0.0.1:8088/server/1"); var protocol = new Thrift.Protocol(transport); var client = new DbSourceTableMgrClient(protocol); var fieldInfo = new FieldInfo(); fieldInfo.aliesName = 'alies'; fieldInfo.fieldName = 'tel'; fieldInfo.desc = 'desc'; fieldInfo.order = 3; fieldInfo.fieldType = FieldType.LONGLAT; console.log(fieldInfo); var result = client.add(DbType.ORACLE,'1234',30,'gyd','6055','no','che',true,'multi',fieldInfo); alert(result.status); alert(result.id); alert(result.message); var result2 = client.delTable('10000'); alert(result2.status); alert(result2.id); alert(result2.message);
至此,前端的工作完成,进行测试,前端可以成功调用后端的函数,序列化和数据处理等过程由thrift提供,我们可以着重于业务代码的编写。
相关文章推荐
- 基于Java代码实现游戏服务器生成全局唯一ID的方法汇总
- JAVA用JNI方法调用C代码实现HelloWorld
- java wsdl反向生成源码,并使用CXF实现客户端调用代码
- 原生java调用webservice的方法,不用生成客户端代码
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)
- JAVA用JNI方法调用C代码实现HelloWorld(含windows及ubuntu两种操作系统环境下的操作)
- 使用java调用C语言的方法,让java获取串口数据并生成一个String对象的代码。
- 二维码的两种生成方法(前端js生成,后端java生成)
- java代码实现鼠标双击出现画图-----------paint()方法由系统自动调用,且一定是小写的字母p
- Android(java)学习笔记229:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)
- Java实现二维码生成的代码方法
- java wsdl反向生成源码,并使用CXF实现客户端调用代码
- java本地方法调用(JNI)的参考代码----实现将String转换成char*,将char*转换成String.
- java调用Word中Replace的实现方法(jacob)
- 视频上传过程中自动转换为flv格式并截图生成缩略图(Java调用命令实现)
- java中查找一个方法都是哪些方法调用的代码
- oracle调用java方法的例子(下面所有代码都是在sql/plus中写)
- oracle调用java方法的例子(下面所有代码都是在sql/plus
- 利用VS“生成方法存根”—放空层次调用 专注写代码结构
- 用简单工厂方法设计的数据库查询(JAVA代码实现)