写点什么

Vert.x 教程 (一):如何搭建一个 web 应用

作者:Kevin_913
  • 2023-11-01
    美国
  • 本文字数:1500 字

    阅读完需:约 5 分钟

Vert.x教程(一):如何搭建一个web应用

这篇文章将介绍如何通过 Vert.x 来开发一个 web 应用。

Q:为什么要使用 Vert.x

A:因为 Vert.x 是一个更纯粹的基于 Reactive 模式的框架,在云平台上可以更充分利用容器的资源,基于 Netty 的二次开发,可以更好的利用 Netty 的一些特性。


关于什么是 Vert.x,请参考这篇文章

快速开始

你可以通过脚手架创建一个基础工程,至少需要包括:


<dependency>  <groupId>io.vertx</groupId>  <artifactId>vertx-web</artifactId></dependency>
复制代码

扩展

  • 在 Java 项目开发过程中,我们也会使用 Lombok 来简化我们开发,所以需要引入


<dependency>  <groupId>org.projectlombok</groupId>  <artifactId>lombok</artifactId>  <optional>true</optional></dependency>
复制代码


  • 我们也可以使用 logback 代替 vert.x 默认的日志框架,添加 slf4j 和 logback 的依赖,再添加一个 logback.xml 到你的 classpath,当然你也可以使用其他的 log bundle 框架,例如 slf4j-sample。


<dependency>     <groupId>org.slf4j</groupId>     <artifactId>slf4j-api</artifactId></dependency><dependency>     <groupId>ch.qos.logback</groupId>     <artifactId>logback-classic</artifactId></dependency>
复制代码


  • 对于 web 项目,会需要通过 json 来处理 request body,需要添加一个 json databind 框架,例如 jackson。


<dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-databind</artifactId></dependency>
复制代码

代码

这里将会使用Router来代替脚手架里面的原生代码,方便更好的管理代码。


  • 创建 Router,并初始化,设置全局的一些属性,例如通过BodyHandler来处理ctx.body()的 json 数据。


    HttpServer server = vertx.createHttpServer();    Router router = Router.router(vertx);    router.route().handler(BodyHandler.create());    router.errorHandler(HttpResponseStatus.SERVICE_UNAVAILABLE.code(), ctx -> {      ctx.end("something went to wrong, try it later.");    });
复制代码


  • 添加 Router。

  • GET

router.get("/demos").handler(request -> {  request.json(demos);});
复制代码
  • POST,需要添加 BodyHandler 以后才能 decode request body。

router.post("/demo").handler(request -> {  Demo demo = request.body().asPojo(Demo.class);   if (!demos.containsKey(demo.getKey())) {      demos.put(demo.getKey(), demo);      request.end("record had been added.");    } else {      request.response().setStatusCode(HttpResponseStatus.NOT_ACCEPTABLE.code());      request.end("no record has been added");    }
});
复制代码
  • PUT

router.put("/demo/:key").handler(request -> {      String key = request.pathParam("key");      Demo demo = request.body().asPojo(Demo.class);      if (demos.containsKey(key)) {        demos.put(demo.getKey(), demo);        request.end("record had been updated.");      } else {        request.response().setStatusCode(HttpResponseStatus.NOT_FOUND.code());        request.end("no record exists.");      }
});
复制代码
  • DELETE

router.delete("/demo/:key").handler(request -> {      String key = request.pathParam("key");      Demo demo = demos.remove(key);      if (demo != null) {        request.response().setStatusCode(HttpResponseStatus.NO_CONTENT.code());        request.end();      } else {        request.response().setStatusCode(HttpResponseStatus.NOT_FOUND.code());        request.end("no record found.");      }
});
复制代码


启动

 ./mvnw clean compile exec:java
复制代码




发布于: 刚刚阅读数: 7
用户头像

Kevin_913

关注

纸上得来终觉浅,绝知此事要躬行。 2019-02-25 加入

专注于代码和设计15+年。 主要涉及Java,Golang,云平台。

评论

发布
暂无评论
Vert.x教程(一):如何搭建一个web应用_Java_Kevin_913_InfoQ写作社区