Skip to content

一步一步教你如何创建第一个Vert.x Web应用 #10

@codefollower

Description

@codefollower

Vert.x是一个支持多语言的运行在JVM之上的开发平台,可以用于构建各种应用,包括web应用,这篇文章教你如何使用Maven和Vert.x创建第一个web应用。

0. 需要JDK 8

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

1. 安装Maven

如果已经安装了,可以跳过这一步

下载Maven: http://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip
下文我都以Windows 7为例,如果使用Linux,需要修改一下相应的目录名,
把apache-maven-3.3.9-bin.zip解压到D:\apache-maven-3.3.9目录(也可以选择其他目录),
然后把D:\apache-maven-3.3.9\bin加入Path环境变量,
打开一个命令行窗口,输入mvn -version,能看到类似下面的信息:
Apache Maven 3.3.9

2. 创建一个空的Maven项目

mvn archetype:generate -DgroupId=my.test -DartifactId=vertx_app -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如果在D:\目录下运行上面的命令,会生成一个D:\vertx_app目录,
打开D:\vertx_app\pom.xml文件,用下面的内容替换掉:
(用Vert.x开发最简单的Web应用只需要依赖vertx-web,测试Vert.x应用需要用到vertx-unit)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>my.test</groupId>
  <artifactId>vertx_app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>vertx_app</name>
  <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-unit</artifactId>
            <version>3.2.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <manifestEntries>
                                        <Main-Class>io.vertx.core.Starter</Main-Class>
                                        <Main-Verticle>my.test.HelloWorldVerticle</Main-Verticle>
                                    </manifestEntries>
                                </transformer>
                            </transformers>
                            <artifactSet />
                            <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

3. Hello World

文件位置: vertx_app\src\main\java\my\test\HelloWorldVerticle.java

package my.test;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.Route;
import io.vertx.ext.web.Router;

public class HelloWorldVerticle extends AbstractVerticle {
    @Override
    public void start() {
        HttpServer server = vertx.createHttpServer();
        Router router = Router.router(vertx);

        // 处理http://localhost:8080/
        Route route = router.route("/");
        route.handler(routingContext -> {
            routingContext.response().end("Hello World!");
        });

        // 处理http://localhost:8080/date
        route = router.route("/date");
        route.handler(routingContext -> {
            HttpServerResponse response = routingContext.response();
            response.putHeader("content-type", "text/plain");
            response.end("date: " + new java.util.Date());
        });

        server.requestHandler(router::accept).listen(8080);
    }
}

4. 测试类

文件位置:vertx_app\src\test\java\my\HelloWorldVerticleTest.java

package my.test;

import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(VertxUnitRunner.class)
public class HelloWorldVerticleTest {

    private Vertx vertx;

    @Before
    public void setUp(TestContext context) {
        vertx = Vertx.vertx();
        vertx.deployVerticle(HelloWorldVerticle.class.getName(), context.asyncAssertSuccess());
    }

    @After
    public void tearDown(TestContext context) {
        vertx.close(context.asyncAssertSuccess());
    }

    @Test
    public void testHelloWorldVerticle(TestContext context) {
        final Async async = context.async();

        vertx.createHttpClient().getNow(8080, "localhost", "/", response -> {
            response.handler(body -> {
                context.assertTrue(body.toString().contains("Hello"));
                async.complete();
            });
        });

        vertx.createHttpClient().getNow(8080, "localhost", "/date", response -> {
            response.handler(body -> {
                context.assertTrue(body.toString().contains("date"));
                async.complete();
            });
        });
    }
}

5. 使用Maven测试

mvn test

6. 使用Maven打包

mvn clean package -Dmaven.test.skip=true

7. 运行

java -jar target/vertx_app-1.0-SNAPSHOT-fat.jar
如果要停止请按ctrl + c

8. 在浏览器中查看结果

http://localhost:8080/
http://localhost:8080/date

9. 参考文档:

Vert.x-Web Manual
Introduction to Vert.x

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions