ZetCode

Spring Boot 上下文路径

最后修改于 2023 年 7 月 16 日

Spring Boot 上下文路径教程展示了如何在 Spring 应用程序中设置上下文路径。

Spring 是一个流行的 Java 应用程序框架,而 Spring Boot 是 Spring 的一个演进,它有助于轻松创建独立的、生产级的基于 Spring 的应用程序。

上下文路径

上下文路径 是我们访问应用程序的 URL 的名称。 默认上下文路径为空。

上下文路径可以通过多种方式更改。我们可以在属性文件中设置它,使用 SERVER_SERVLET_CONTEXT_PATH 环境变量,使用 Java 系统属性或在命令行中设置。

$ export SERVER_SERVLET_CONTEXT_PATH=/myapp

在 Unix 系统上,我们可以使用 export 命令更改 SERVER_SERVLET_CONTEXT_PATH

> set SERVER_SERVLET_CONTEXT_PATH=/myapp

在 Windows 上,使用 set 命令完成。

server.servlet.context-path=/myapp

该属性可以在 application.properties 文件中更改。(也可以在 application.yml 文件中。)

@Configuration
public class AppConfig {

    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
        webServerFactoryCustomizer() {

        return factory -> factory.setContextPath("/myapp");
    }
}

上下文路径可以使用 WebServerFactoryCustomizer bean 设置。

@SpringBootApplication
public class Application  {

    public static void main(String[] args) {

        System.setProperty("server.servlet.context-path", "/myapp");
        SpringApplication.run(Application.class, args);
    }
}

在这里,我们使用 Java 系统属性设置上下文。

new SpringApplicationBuilder(Application.class)
    .bannerMode(Banner.Mode.OFF)
    .properties("server.servlet.context-path=/myapp")
    .logStartupInfo(false)
    .build()
    .run(args);

在这里,我们使用 SpringApplicationBuilder 将上下文路径设置为默认属性。

$ java -jar -Dserver.servlet.context-path=/test target/SpringBootContextPath-1.0-SNAPSHOT.jar

在这里,我们在命令行中设置上下文路径。

Spring 为这些选项提供了不同的优先级。以下列表按降序显示优先级。

选项越高,优先级越高。

Spring Boot 上下文路径示例

在以下应用程序中,我们设置了一个自定义上下文路径。 几个选项被注释掉了。 尝试使用这些选项,以了解它们的优先级。

... Tomcat started on port(s): 8080 (http) with context path '/myapp'

当应用程序启动时,Spring Boot 会在终端上显示一条关于所选上下文路径的信息消息。

build.gradle
...
src
├── main
│   ├── java
│   │   └── com
│   │       └── zetcode
│   │           ├── Application.java
│   │           ├── config
│   │           │   └── AppConfig.java
│   │           └── controller
│   │               └── MyController.java
│   └── resources
│       └── application.yml
└── test
    ├── java
    └── resources

这是项目结构。

build.gradle
plugins {
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

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

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

这是 Gradle 构建文件。

resources/application.yml
server:
  servlet:
    context-path: /myapp3

application.yml 文件中,我们编写了 Spring Boot 应用程序的各种配置设置。 我们可以在这里设置上下文路径。可以使用其他具有更高优先级的选项(例如 @Bean 配置)覆盖此配置。

com/zetcode/config/AppConfig.java
package com.zetcode.config;

import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class AppConfig {

    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
        webServerFactoryCustomizer() {

        return factory -> factory.setContextPath("/myapp1");
    }
}

在这里,我们使用 WebServerFactoryCustomizer bean 设置上下文路径。

com/zetcode/controller/MyController.java
package com.zetcode.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @GetMapping(value = "/", produces = MediaType.TEXT_PLAIN_VALUE)
    public @ResponseBody String home() {

        return "home page";
    }
}

MyController 处理来自客户端的请求。对于主页,它返回一个简单的文本值。

com/zetcode/Application.java
package com.zetcode;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {

//        System.setProperty("server.servlet.context-path", "/myapp2");
//        SpringApplication.run(Application.class, args);

        new SpringApplicationBuilder(Application.class)
                .bannerMode(Banner.Mode.OFF)
                .properties("server.servlet.context-path=/myapp4")
                .logStartupInfo(false)
                .build()
                .run(args);
    }
}

Application 是设置 Spring Boot 应用程序的入口点。我们也可以在这里设置上下文路径;可以使用 Java 系统属性,也可以使用构建器的默认属性。

在本文中,我们展示了如何在 Spring Boot 应用程序中设置上下文路径。

作者

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

列出 所有 Spring Boot 教程