ZetCode

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 处理程序。

一个路由有三个部分

Spark 第一个例子

第一个应用程序返回一个简单的消息。Gradle 用于构建应用程序。

build.gradle
src
└── main
    └── java
        └── com
            └── zetcode
                └── FirstSparkEx.java

这是项目结构。Gradle 的 Java 插件期望 Java 生产代码位于 src/main/java 目录中。

build.gradle
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 的依赖项。

com/zetcode/FirstSpark.java
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 发送一个名称,应用程序回复对用户的问候。

build.gradle
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

这是项目结构。

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 目录中。

build.gradle
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 依赖项。

com/zetcode/SparkThymeleafEx.java
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 方法。

resources/templates/hello.html
<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 目录中。

build.gradle
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 依赖项。

com/zetcode/SparkFreeMarkerEx.java
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 方法。

resources/views/hello.ftlh
<!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>

来源

Java Spark 文档

在本文中,我们介绍了 Spark Java 框架。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程