开发您的第一个 Web 应用程序

本节介绍如何开发一个小型的 “Hello World!” Web 应用程序,该应用程序重点介绍了该框架的一些关键功能。 您可以选择 Gradle 或 Maven 作为构建系统。

准备

在开始之前,打开终端并运行以下命令以确保您安装了有效版本的 Java:

$ java -version
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment Zulu17.46+19-CA (build 17.0.9+8-LTS)
OpenJDK 64-Bit Server VM Zulu17.46+19-CA (build 17.0.9+8-LTS, mixed mode, sharing)

Gradle

如果您想使用 Gradle,请确保已安装 Gradle:

$ gradle --version

------------------------------------------------------------
Gradle 8.7
------------------------------------------------------------

Build time:   2024-03-22 15:52:46 UTC
Revision:     650af14d7653aa949fce5e886e685efc9cf97c10

Kotlin:       1.9.22
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          17.0.9 (Azul Systems, Inc. 17.0.9+8-LTS)
OS:           Mac OS X 14.4.1 aarch64

使用 Gradle 构建

我们需要首先创建一个 Gradle build.gradle 文件。build.gradle 是用于构建项目的构建脚本。

plugins {
  id 'java'
  id 'cn.taketoday.application' version '5.0.0-Draft.1-SNAPSHOT'
}

apply plugin: 'io.spring.dependency-management'  // 有了该插件可以自动导入 infra-dependencies

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
  mavenLocal()
  maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
  mavenCentral()
}

dependencies {
  implementation 'cn.taketoday:today-starter-web'   (1)
  implementation 'cn.taketoday:today-starter-netty' (2)

}
1 上面的 today-starter-* 和 Spring Boot 的 Starters 是一个概念,这样设计也是方便那些会用 Spring Boot 的开发者
2 使用 Netty 作为底层 HTTP 网络协议层处理。

添加 Hello World 代码

和 Spring Boot 一样我们也只需要一个文件就能完成这个简单的 Web 应用。 在 build.gradle 文件所在的同级目录下创建 src/main/java/demo/DemoApplication.java 文件。

package demo;

import cn.taketoday.framework.Application;
import cn.taketoday.framework.InfraApplication;
import cn.taketoday.web.annotation.RestController;
import cn.taketoday.web.annotation.GET;

@RestController
@InfraApplication
public class DemoApplication {

  public static void main(String[] args) {
    Application.run(DemoApplication.class, args);
  }

  @GET
  public String hello() {
    return "Hello World!";
  }

}
如果你用过 Spring 系列的框架 @RestController 你一定不陌生应该知道它的作用。 上面出现的注解我会在后面的MVC 部分中重点提到。

@InfraApplication 注解

@InfraApplication 注解是一个 元注解 包含了 @Configuration, @EnableAutoConfiguration@ComponentScan 功能。后面章节会详细提到。

@EnableAutoConfiguration 注解 含义是 开启自动配置,去决定使用哪些 Bean。

添加了 today-starter-web 依赖之后 框架会自动识别当前应用是一个 Web 应用。 会开启一个 Web 服务器 由于存在 today-starter-netty 依赖,所以使用了 Netty 作为底层 Web 服务器支持。

Starters 和 Auto-configuration(自动配置)

自动配置 一般是和 “Starters” 相结合来工作的, Starters 一般会包含一组依赖和配置.

使用 IDE 执行 “main” 方法

main 方法作为整个应用的入口。调用 Application.run 方法来启动初始化整个框架,包括自动配置应用中的 Bean,和 Web 服务器等。 如果你使用像 IntelliJ IDEA 之类的开发工具。直接运行 main 方法即可启动你的 Hello World 应用程序。

使用 Gradle 运行

可以直接使用 gradle infraRun 命令启动。

$ gradle infraRun

 ______  ____    ___    ___  __  __        ____   _  __   ____   ___    ___
/_  __/ / __ \  / _ \  / _ | \ \/ /       /  _/  / |/ /  / __/  / _ \  / _ |
 / /   / /_/ / / // / / __ |  \  /       _/ /   /    /  / _/   / , _/ / __ |
/_/    \____/ /____/ /_/ |_|  /_/       /___/  /_/|_/  /_/    /_/|_| /_/ |_| (v5.0.0-Draft.1-SNAPSHOT)

[1111-11-11 11:11:11.111] - 80362 INFO [main] --- demo.DemoApplication: Starting DemoApplication using Java 17.0.9 on xxx with PID 80362 (build/classes/java/main started by xx )
[1111-11-11 11:11:11.111] - 80362 INFO [main] --- demo.DemoApplication: No active profile set, falling back to 1 default profile: "default"
[1111-11-11 11:11:11.111] - 80362 INFO [main] --- cn.taketoday.framework.web.context.AnnotationConfigWebServerApplicationContext: Starting application context at '1111-11-11 11:11:11.111'
[1111-11-11 11:11:11.111] - 80362 INFO [main] --- cn.taketoday.web.bind.resolver.ParameterResolvingRegistry: RedirectModel disabled
[1111-11-11 11:11:11.111] - 80362 INFO [main] --- cn.taketoday.framework.web.netty.NettyChannelHandler: Completed initialization in 1 ms
[1111-11-11 11:11:11.111] - 80362 INFO [main] --- cn.taketoday.framework.web.netty.NettyWebServer: Netty web server started on port: '8080'
[1111-11-11 11:11:11.111] - 80362 INFO [main] --- cn.taketoday.framework.web.context.AnnotationConfigWebServerApplicationContext: Application context startup in 366 ms
[1111-11-11 11:11:11.111] - 80362 INFO [main] --- demo.DemoApplication: Started DemoApplication in 5.544 seconds (process running for 5.621)

打开浏览器输入 localhost:8080, 你会看到:

Hello World!

使用 ctrl-c 优雅退出应用。

使用 Gradle 打包一个可执行 Jar

使用 gradle infraJar 命令构建:

gradle infraJar

BUILD SUCCESSFUL in 639ms
3 actionable tasks: 3 executed

在你的 build/libs 目录下, 有个一 xxx-0.0.1-SNAPSHOT.jar 文件.

使用 java -jar 命令运行:

$ java -jar build/libs/xxx-0.0.1-SNAPSHOT.jar

 ______  ____    ___    ___  __  __        ____   _  __   ____   ___    ___
/_  __/ / __ \  / _ \  / _ | \ \/ /       /  _/  / |/ /  / __/  / _ \  / _ |
 / /   / /_/ / / // / / __ |  \  /       _/ /   /    /  / _/   / , _/ / __ |
/_/    \____/ /____/ /_/ |_|  /_/       /___/  /_/|_/  /_/    /_/|_| /_/ |_| (v5.0.0-Draft.1-SNAPSHOT)

....... . . .
....... . . . 启动日志
....... . . .
........ Started MyApplication in 0.999 seconds (process running for 1.253)