我从here运行了spring-boot-sample-web-static项目,将这个改动改为了pom
select
并添加此类以从同一<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
文件夹位置提供重复页面index2.html:
static
json url工作正常,但是当我尝试访问localhost时:8080 / tw我得到一个空白页面,并在控制台中出现此错误:
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class Rester {
@RequestMapping(value = "/rand", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
private RandomObj jsonEndpoint() {
return new RandomObj();
}
@RequestMapping(value = "/tw")
public String somePg() {
return "index2";
}
}
我做错了吗?
答案 0 :(得分:25)
静态文件应该从资源提供,而不是从控制器提供。
Spring Boot会自动添加位于其中的静态Web资源 以下任何目录:
/META-INF/resources/ /resources/ /static/ /public/
参考文献:
https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot
https://spring.io/guides/gs/serving-web-content/
答案 1 :(得分:11)
在Spring启动时,/META-INF/resources/
,/resources/
,static/
和public/
目录可用于提供静态内容。
因此,您可以在static/
目录下创建public/
或resources/
目录,并将静态内容放在那里。它们可以通过以下方式访问:http://localhost:8080/your-file.ext
。 (假设server.port
是8080)
您可以使用spring.resources.static-locations
中的application.properties
自定义这些目录。
例如:
spring.resources.static-locations=classpath:/custom/
现在,您可以使用custom/
下的resources/
文件夹来提供静态文件。
答案 2 :(得分:1)
我正在使用:: Spring Boot :: (v2.0.4.
RELEASE
) with Spring Framework 5
静态内容Spring Boot 2.0要求Java 8为最低版本。许多现有的API已更新,以利用Java 8的功能,例如:接口上的默认方法,函数回调以及新的API(例如javax.time)。
默认情况下,Spring Boot从名为 / static (或 / public 或 / resources / 资源)在类路径中或从ServletContext的根目录开始。它使用Spring MVC中的ResourceHttpRequestHandler,以便您可以通过添加自己的WebMvcConfigurer
并覆盖addResourceHandlers
方法来修改该行为。
默认情况下,资源映射在/**
上,并且位于/static
目录中。
但是您可以在我们的Web上下文配置类中以编程方式自定义静态位置。
@Configuration @EnableWebMvc
public class Static_ResourceHandler implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// When overriding default behavior, you need to add default(/) as well as added static paths(/webapp).
// src/main/resources/static/...
registry
//.addResourceHandler("/**") // « /css/myStatic.css
.addResourceHandler("/static/**") // « /static/css/myStatic.css
.addResourceLocations("classpath:/static/") // Default Static Loaction
.setCachePeriod( 3600 )
.resourceChain(true) // 4.1
.addResolver(new GzipResourceResolver()) // 4.1
.addResolver(new PathResourceResolver()); //4.1
// src/main/resources/templates/static/...
registry
.addResourceHandler("/templates/**") // « /templates/style.css
.addResourceLocations("classpath:/templates/static/");
// Do not use the src/main/webapp/... directory if your application is packaged as a jar.
registry
.addResourceHandler("/webapp/**") // « /webapp/css/style.css
.addResourceLocations("/");
// File located on disk
registry
.addResourceHandler("/system/files/**")
.addResourceLocations("file:///D:/");
}
}
http://localhost:8080/handlerPath/resource-path+name
/static /css/myStatic.css
/webapp /css/style.css
/templates /style.css
在春季,每个请求都将通过DispatcherServlet。为了避免通过DispatcherServlet(Front contoller)进行静态文件请求,我们配置了MVC Static content。
正如@STEEL
所说,静态资源不应通过Controller。 Thymleaf
是一个ViewResolver,它采用视图名称形式的控制器,并将prefix
和suffix
添加到视图层。
答案 3 :(得分:1)
如前所述,默认情况下,某些文件夹(/ META-INF / resources /,/ resources /,/ static /,/ public /)提供静态内容,控制器配置错误会破坏此行为。
人们通常会在@RestController
批注中定义控制器的基本URL,而不是在控制器顶部的@RequestMapping
批注中。
这是错误的:
@RestController("/api/base")
public class MyController {
@PostMapping
public String myPostMethod( ...) {
上面的示例将阻止您打开index.html。 Spring希望在根目录使用POST方法,因为myPostMethod
映射到“ /”路径。
您必须改用它:
@RestController
@RequestMapping("/api/base")
public class MyController {
@PostMapping
public String myPostMethod( ...) {
答案 4 :(得分:0)
您可以通过thymeleaf
快速提供JAVA Spring-boot App中的静态内容(参考:source)
我假设您已经添加了Spring Boot插件apply plugin: 'org.springframework.boot'
和必要的buildscript
然后继续将百里香添加到build.gradle
==&gt;
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
testCompile('org.springframework.boot:spring-boot-starter-test')
}
假设您已在src/main/resources
添加 home.html
要提供此文件,您需要创建一个控制器。
package com.ajinkya.th.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomePageController {
@RequestMapping("/")
public String homePage() {
return "home";
}
}
多数民众赞成!现在重新启动gradle服务器。 ./gradlew bootRun
答案 5 :(得分:0)
我不得不将thymeleaf依赖项添加到pom.xml。没有这种依赖性,Spring Boot找不到静态资源。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
答案 6 :(得分:-2)
您可以在spring boot official
项目中看到名为spring boot
的{{1}}示例。
首先,您需要spring-boot-sample-web-static
;
其次,在extends SpringBootServletInitializer
类
override
配置方法
Application