使用 Spring Boot 提供静态 Web 内容

工程 | Roy Clarkson | 2013 年 12 月 19 日 | ...

我们最近发布了一些关于 Spring 入门指南 的公告,包括指南目录已 迁移到 Asciidoctor。我们还添加了一些新的 客户端指南,说明如何从各种客户端技术连接到 Spring 服务。

在这篇文章中,我想重点介绍 Spring Boot 的一个有趣功能;在许多客户端指南中,我们利用 Spring Boot 启动了一个 Tomcat 实例并提供静态内容。在这些指南中,我们演示的是 **JavaScript** 客户端代码,而不是 Java 或 Groovy!如果您已经熟悉 Boot,那么您可能可以猜到要点。要实现这一点,不需要任何配置,几乎不需要任何服务器代码。

使用 Spring Boot 命令行界面 和少量 Groovy 代码,您可以指示 Spring Boot 启动 Tomcat。请考虑以下 app.groovy 文件

@Controller class JsApp { }

使用 @Controller 注解的单个空类将触发 Boot 中的 自动配置,这将设置完整的 Spring MVC 堆栈并启用对 Tomcat 的支持。

您可以使用以下命令运行应用程序

$ spring run app.groovy

虽然对于那些从 SpringOne 发布以来一直关注 Spring Boot 的人来说,这可能不是一个新的发现,但有一个细节您可能不知道。Spring Boot 会自动添加位于以下任何目录中的静态 Web 资源

  • /META-INF/resources/
  • /resources/
  • /static/
  • /public/

使用 jQuery 使用 RESTful Web 服务 指南中,我们在 /public/ 文件夹中包含了 index.htmlhello.js 文件。这意味着 Spring Boot 不仅提供了一种构建 Java 或 Groovy 应用程序的简单方法,您还可以使用它轻松部署客户端 JavaScript 代码并在真实的 Web 服务器环境中对其进行测试!

您可以通过查看 源代码 来分析其工作原理,了解 Spring Boot 中 WebMvcAutoConfiguration,您将看到以下声明,其中包含一个用于类路径资源位置的字符串数组。

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
		"classpath:/META-INF/resources/", "classpath:/resources/",
		"classpath:/static/", "classpath:/public/" };

在代码的更深处,您可以看到这些位置被添加到 Spring MVC ResourceHandlerRegistry 中。

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
	if (!registry.hasMappingForPattern("/webjars/**")) {
		registry.addResourceHandler("/webjars/**").addResourceLocations(
				"classpath:/META-INF/resources/webjars/");
	}
	if (!registry.hasMappingForPattern("/**")) {
		registry.addResourceHandler("/**").addResourceLocations(
				RESOURCE_LOCATIONS);
	}
}

总而言之,当 Spring Boot 识别到带有 @Controller 注解的类时,将执行 Web 自动配置。结果是,您可以将静态 Web 资源放在这些位置中的任何一个,当您访问应用程序时,Tomcat 会提供这些静态资源。

Spring Boot 提供了许多令人兴奋的功能,可以帮助轻松创建基于 Spring 的应用程序,您可以“直接运行”。有趣的是,使用 Spring Boot 构建和测试客户端 JavaScript 应用程序也同样简单。

获取 Spring 电子邮件简报

通过 Spring 电子邮件简报保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部