如何从spring boot中提供静态html?

时间:2017-02-22 13:44:25

标签: spring-boot

我从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";
    }
}

我做错了吗?

7 个答案:

答案 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,它采用视图名称形式的控制器,并将prefixsuffix添加到视图层。

答案 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