开发您的第一个 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 部分中重点提到。
|
使用 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)