Spring Boot静态资源访问

时间:2019-06-16 15:38:01

标签: spring spring-boot spring-mvc

我正在使用Spring Boot Web应用程序。我在访问CSS,JS和图像文件等静态资源时遇到问题。

当我没有@Controller classes时,SimpleUrlHandlerMapping已成功处理了静态资源请求。

但是在用@Controller标记一个类之后,静态资源UR仅定向到该类内部的方法(通过RequestMappingHandlerMapping)。

我缺少一些配置吗? 我的控制器类如下,

@Controller
public class LoginController {


@RequestMapping(name="/", method = RequestMethod.GET)
public String home() {
    return "index";
}


@RequestMapping(name="login", method = RequestMethod.POST)
public String login() {
    return "home";
}

在我的.HTML文件中,我引用了如下静态资源,

<link rel="stylesheet" type="text/css"
href="bootstrap/css/bootstrap.css"
th:href="@{bootstrap/css/bootstrap.css}">
<script src="bootstrap/js/bootstrap.js"
th:src="@{bootstrap/js/bootstrap.js}"></script>
<script src="jquery/jquery-3.4.1.min.js"
th:src="@{jquery/jquery-3.4.1.min.js}"></script>

目录结构如下, enter image description here

我也尝试添加如下资源,

@Configuration
public class XbrlWebApp implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

    registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");

}

但是这也不起作用。当访问静态资源时,使用类似url的网址,

  

http://localhost:8080/ {contextpath} /bootstrap/css/bootstrap.css

它返回相同的html页面内容,而不是css文件。

2 个答案:

答案 0 :(得分:0)

如果您使用的是JAR封装,则无需进行任何配置,因为只要将所有内容都放在static文件夹下,springboot都会自动配置处理静态内容。例如,将js文件放在resources/static/js下,将css放在resources/static/css和默认实现应该使用它。您可以使用以下链接来引用它:

<link rel="stylesheet" type="text/css"
href="css/bootstrap.css"
th:href="@{bootstrap/css/bootstrap.css}">
<script src="js/bootstrap.js"
th:src="@{bootstrap/js/bootstrap.js}"></script>

如果使用WAR打包,请尝试以下配置进行目录结构设置:

@Configuration
public class XbrlWebApp implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

    registry.addResourceHandler("/resources/**")
    .addResourceLocations("/resources/","classpath:/other-resources/","classpath:/static/");

}

并在html中使用:

<link rel="stylesheet" type="text/css"
href="resources/static/bootstrap/css/bootstrap.css"
th:href="@{bootstrap/css/bootstrap.css}">
<script src="resources/static/bootstrap/js/bootstrap.js"
th:src="@{bootstrap/js/bootstrap.js}"></script>
<script src="jquery/jquery-3.4.1.min.js"
th:src="@{jquery/jquery-3.4.1.min.js}"></script>

如果您要创建WAR,则所有资源实际上都会复制到webapps/resources文件夹中,同时保留文件夹结构。因此,请尝试上述配置。

答案 1 :(得分:0)

这完全是我的错误。 在@RequestMapping方法中,

@RequestMapping(name="/", method = RequestMethod.GET)
public String home() {
return "index";
}

我使用了“名称”属性。它应该是“值”。由于没有找到“值”属性,因此无论发出什么GET http请求,所有内容都将重定向到相同的方法,并返回index.html页。因此静态资源也一样。弹簧配置工作正常。