使用Spring和Thymeleaf的静态资源

Wil*_*usa 5 java spring spring-mvc thymeleaf

我正在尝试使用以下代码访问HTML上的静态资源:

<link th:href="@{css/main.css}" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)

但是当我放进去时才起作用@{static/css/main.css}。我知道,当您设置资源文件夹时,无需在每次调用静态文件时都设置静态文件夹。

我的文件夹结构:

/webapp
=== /static
==========/css
==========/js
=== /WEB-INF
==========/views
Run Code Online (Sandbox Code Playgroud)

在Spring上设置mvc配置:

....
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }

    private TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        return engine;
    }

    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        resolver.setCacheable(false); // On production , turn TRUE
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用Spring 4和Thymeleaf 3 beta。我正在使用的每个css-js-image文件都需要在路径上写“ static”。不编写完整路径,这种编码方式就无法使用。为什么?

Ali*_*ani 3

registry.addResourceHandler("/static/**").addResourceLocations("/static/");
                             ^^^^^^^^                           ^^^^^^^
                             ----------- These two are different ------       
Run Code Online (Sandbox Code Playgroud)

因为您告诉 spring mvc 使用类路径中文件夹的/static/路径前缀来服务每个请求。/static因此,当您向 发出请求时static/css/main.css,它将与您的资源处理程序路径匹配并成功提供服务。

我知道当你设置了资源文件夹后,你不需要每次调用静态文件时都设置静态文件夹。

我的猜测是您将/static/**路径前缀与/static文件夹名称混淆了。staticin@{static/css/main.css}引用/static/**您在以下位置定义的路径前缀:

registry.addResourceHandler("/static/**")...
Run Code Online (Sandbox Code Playgroud)

不是文件夹名称:

...addResourceLocations("/static/")
Run Code Online (Sandbox Code Playgroud)

例如,如果您定义资源处理程序如下:

registry.addResourceHandler("/content/**").addResourceLocations("/static/");
Run Code Online (Sandbox Code Playgroud)

然后您应该将您的请求发送到,例如,content/css/main.css

更新:如果您坚持使用css/main.css作为您的路径,您应该像这样定义您的资源处理程序:

registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
Run Code Online (Sandbox Code Playgroud)

并将您的/static/文件夹放入src/main/resources.