Spark Java 简介
最后修改于 2024 年 1 月 27 日
这是 Spark Java Web 框架的入门教程。我们将介绍 Spark Java 框架,并提供三个代码示例。
Spark Java
Spark 是一个 Java 微框架,用于以最小的努力在 Java 8 中创建 Web 应用程序。Spark 框架是一个简单而轻量级的 Java Web 框架,专为快速开发而构建。它的灵感来自流行的 Ruby 微框架Sinatra。
Spark 广泛使用 lambda 表达式,这使得 Spark 应用程序的代码量大大减少。与其他 Java Web 框架相比,Spark 不会大量使用 XML 文件或注解。
路由
一个 Spark 应用程序包含一组路由。路由将 URL 模式映射到 Java 处理程序。
一个路由有三个部分
- 一个动词,包括 get、post、put、delete、head、trace、connect 和 options
- 一个路径,例如 /first 或 /hello/:name
- 一个回调 (request, response) -> { }
Spark 第一个例子
第一个应用程序返回一个简单的消息。Gradle 用于构建应用程序。
build.gradle
src
└── main
└── java
└── com
└── zetcode
└── FirstSparkEx.java
这是项目结构。Gradle 的 Java 插件期望 Java 生产代码位于 src/main/java 目录中。
apply plugin: 'java'
apply plugin: 'application'
archivesBaseName = "first"
version = '1.0'
mainClassName = "com.zetcode.FirstSparkEx"
repositories {
mavenCentral()
}
dependencies {
implementation 'com.sparkjava:spark-core:2.9.4'
implementation 'org.slf4j:slf4j-simple:1.7.36'
}
这是 Gradle 构建文件。它包含 Spark 核心组件和 slf4j simple logger 的依赖项。
package com.zetcode;
import static spark.Spark.get;
public class FirstSparkEx {
public static void main(String[] args) {
get("/hello", (req, res) -> "Hello there!");
}
}
该应用程序将 "First Spark application message" 返回给 GET 请求。当我们运行应用程序时,Spark 启动一个嵌入式 Jetty Web 服务器。
get("/hello", (req, res) -> "Hello there!");
get 方法映射 HTTP GET 请求的路由。在 Spark 术语中,路由是一个处理程序。路由是一个映射到处理程序的 URL 模式。处理程序可以是一个物理文件或一个
$ gradle run
我们使用 gradle run 命令运行应用程序。启动一个嵌入式 Jetty 服务器。
$ curl localhost:4567/hello Hello there!
我们使用 curl 工具向服务器发送 GET 请求。默认情况下,内置的嵌入式 Jetty 服务器侦听 4567 端口。
Spark 请求参数
第二个应用程序将向用户问候。客户端通过 URL 发送一个名称,应用程序回复对用户的问候。
apply plugin: 'java'
apply plugin: 'application'
archivesBaseName = "hello"
version = '1.0'
mainClassName = "com.zetcode.HelloSparkEx"
repositories {
mavenCentral()
}
dependencies {
implementation 'com.sparkjava:spark-core:2.9.4'
implementation 'org.slf4j:slf4j-simple:1.7.36'
}
这是应用程序的 Gradle 构建文件。
build.gradle
src
└── main
└── java
└── com
└── zetcode
└── HelloSparkEx.java
这是项目结构。
package com.zetcode.hellospark;
import static spark.Spark.get;
public class HelloSparkEx {
public static void main(String[] args) {
get("/hello/:name/", (req, res) -> "Hello " + req.params(":name"));
}
}
Spark 应用程序检索请求参数,构建消息并将其返回给调用者。
get("/hello/:name/", (req, res) -> "Hello " + req.params(":name"));
params 方法返回提供的路由模式参数的值。
$ gradle run
我们运行应用程序。
$ curl localhost:4567/hello/Peter/ Hello Peter
我们向服务器发送一个请求;该 URL 包含一个名称。应用程序发回一个问候。
模板引擎
Spark 没有自己的模板系统;它使用第三方引擎。在下面的两个示例中,我们使用 Thymeleaf 和 FreeMarker。
使用 Thymeleaf
在下面的示例中,我们将把 Thymeleaf 模板引擎集成到我们的 Spark 应用程序中。Thymeleaf 是一种现代服务器端 Java 模板引擎,适用于 Web 和独立环境。
build.gradle
src
└── main
├── java
│ └── com
│ └── zetcode
│ └── SparkThymeleafEx.java
└── resources
└── templates
└── hello.html
这是项目的目录结构。模板文件位于 src/main/resources/templates 目录中。
apply plugin: 'java'
apply plugin: 'application'
archivesBaseName = "spark-thymeleaf"
version = '1.0'
mainClassName = "com.zetcode.SparkThymeleafEx"
repositories {
mavenCentral()
}
dependencies {
implementation 'com.sparkjava:spark-core:2.9.4'
implementation 'com.sparkjava:spark-template-thymeleaf:2.7.1'
implementation 'org.slf4j:slf4j-simple:1.7.36'
}
这里我们有 Gradle 构建文件,它包含 spark-template-thymeleaf 依赖项。
package com.zetcode;
import java.util.HashMap;
import java.util.Map;
import spark.ModelAndView;
import spark.Request;
import spark.Response;
import spark.template.thymeleaf.ThymeleafTemplateEngine;
import static spark.Spark.get;
import static spark.Spark.staticFileLocation;
public class SparkThymeleafEx {
public static void main(String[] args) {
get("/hello/:name/", SparkThymeleafEx::message, new ThymeleafTemplateEngine());
}
public static ModelAndView message(Request req, Response res) {
Map<String, Object> params = new HashMap<>();
params.put("name", req.params(":name"));
return new ModelAndView(params, "hello");
}
}
该应用程序读取请求参数并将其放入 ModelAndView 对象中。
get("/hello/:name/", SparkThymeleafEx::message, new ThymeleafTemplateEngine());
ThymeleafTemplateEngine 的实例传递给 get 方法。
<pre class="code">
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>Hello user</title>
</head>
<body>
<p th:inline="text">Hello, [[${name}]]!</p>
</body>
</html>
这是 hello.html 模板文件。它引用了随 ModelAndView 对象传递的 name 变量。
$ curl localhost:4567/hello/Peter/
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title>Hello user</title>
</head>
<body>
<p>Hello, Peter!</p>
</body>
</html>
FreeMarker
在下面的示例中,我们将把 FreeMarker 模板引擎集成到我们的 Spark 应用程序中。FreeMarker 是一种完善的 Java 模板引擎。
build.gradle
src
└── main
├── java
│ └── com
│ └── zetcode
│ └── SparkFreeMarkerEx.java
└── resources
└── views
└── hello.ftlh
这是项目的目录结构。模板文件位于 src/main/resources/views 目录中。
apply plugin: 'java'
apply plugin: 'application'
archivesBaseName = "spark-freemarker"
version = '1.0'
mainClassName = "com.zetcode.SparkFreemarkerEx"
repositories {
mavenCentral()
}
dependencies {
implementation 'com.sparkjava:spark-core:2.9.4'
implementation 'com.sparkjava:spark-template-freemarker:2.7.1'
implementation 'org.slf4j:slf4j-simple:1.7.36'
}
这里我们有 Gradle 构建文件,它包含 spark-template-freemarker 依赖项。
package com.zetcode;
import freemarker.template.Configuration;
import freemarker.template.Version;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import spark.ModelAndView;
import spark.Request;
import spark.Response;
import static spark.Spark.get;
import spark.template.freemarker.FreeMarkerEngine;
public class SparkFreemarkerEx {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration(new Version(2, 3, 26));
conf.setClassForTemplateLoading(SparkFreemarkerEx.class, "/views");
get("/hello/:name/", SparkFreemarkerEx::message, new FreeMarkerEngine(conf));
}
public static ModelAndView message(Request req, Response res) {
Map<String, Object> params = new HashMap<>();
params.put("name", req.params(":name"));
return new ModelAndView(params, "hello.ftlh");
}
}
我们为 FreeMarker 设置相同的应用程序。
Configuration conf = new Configuration(new Version(2, 3, 26)); conf.setClassForTemplateLoading(SparkFreemarkerEx.class, "/views");
我们使用 Configuration 类配置 FreeMarker。模板文件将放置在 views 目录中,该目录必须位于类路径上。
get("/hello/:name/", SparkFreemarkerEx::message, new FreeMarkerEngine(conf));
FreeMarkerEngine 传递给 get 方法。
<!DOCTYPE html>
<html>
<head>
<title>Home page</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<p>Hello ${name}</p>
</body>
</html>
这是 hello.ftlh 模板文件;它引用了随 ModelAndView 对象传递的 name 变量。
$ curl localhost:4567/hello/Lucy/
<!DOCTYPE html>
<html>
<head>
<title>Home page</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<p>Hello Lucy</p>
</body>
</html>
来源
在本文中,我们介绍了 Spark Java 框架。
作者
列出所有Java教程。