【问题标题】:Static resources using Spring and Thymeleaf使用 Spring 和 Thymeleaf 的静态资源
【发布时间】:2016-06-03 04:23:07
【问题描述】:

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

<link th:href="@{css/main.css}" rel="stylesheet" type="text/css" />

但是当我输入@{static/css/main.css} 时才有效。我知道在设置资源文件夹的时候,每次调用静态文件时都不需要设置静态文件夹。

我的文件夹结构:

/webapp
=== /static
==========/css
==========/js
=== /WEB-INF
==========/views

在 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();
    }

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

【问题讨论】:

    标签: java spring spring-mvc thymeleaf


    【解决方案1】:
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
                                 ^^^^^^^^                           ^^^^^^^
                                 ----------- These two are different ------       
    

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

    我知道设置资源文件夹的时候不需要设置 每次调用静态文件时,静态文件夹。

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

    registry.addResourceHandler("/static/**")...
    

    不是文件夹名称:

    ...addResourceLocations("/static/")
    

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

    registry.addResourceHandler("/content/**").addResourceLocations("/static/");
    

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

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

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

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

    【讨论】:

    • 我需要做什么才能在我的 HTML 上设置“静态”文件夹。只需设置“css”文件夹,然后应用程序就知道“静态”文件夹在哪里,找到这些文件夹?
    • 我只是在想我悲伤的方式是正确的方式。我想将资源放在 webapps 文件夹中。使用带有“静态”目录的路径设置文件也正确吗?
    最近更新 更多