当前位置: 首页 > 知识库问答 >
问题:

Spring靴不适用于带Thymeleaf的静态内容

许彦
2023-03-14

我有以下thymeleaf html页面:

<head th:fragment="header">

    <meta charset="utf-8" />
    <link rel="stylesheet" href="../../css/main.css" th:href="@{/css/main.css}" />
    <title th:text="#{device.page.title}">Title</title>
</head>

<body>
<div>
    <h1 th:text="#{device.table.caption}"></h1>
    <hr class="fineline"/>
    Select devices using the checkboxes, you can update the client version or add client commands.
    <form action="#" th:action="@{/devices/modify}" th:object="${deviceCommand}" method="post">
    <table border="0" cellpadding="0" cellspacing="0" class="touchTable">
        <!--<thead> -->
            <tr>
                <td scope="col" th:text="#{device.check.label}">Select</td>
                <td width="300" scope="col"><span th:text="#{device.id.label}"></span>&nbsp;(<span th:text="#{device.retailer.name.label}"></span>)</td>
                <td scope="col" th:text="#{device.current.label}">Curr Version</td>
                <td scope="col" th:text="#{device.next.label}">Next Version</td>
                <td scope="col" th:text="#{device.commands.label}">Commands</td>
            </tr>
        <!--</thead>-->
        <!--<tbody> -->
            <tr th:each="d : ${devices}">
                <td><input type="checkbox" th:field="*{deviceModificationIds}" th:value="${d.id}"/></td>
                <td><span th:text="${d.id}"></span>&nbsp;(<span th:text="${d.retailerName}"></span>)</td>
                <td th:text="${d.currentClientVersion}">Washington</td>
                <td th:text="${d.nextClientVersion}">gwash</td>
                <td th:text="${d.commands}">gwash</td>
            </tr>
            <tr>
                <td colspan="2"></td>
                <td><span th:text="#{device.change.version.label}"></span><br/><input type="text" th:field="*{newVersion}"/></td>
                <td><span th:text="#{device.add.command.label}"></span><br/><input type="text" th:field="*{newCommand}"/></td>
                <td><br/><button type="submit" th:text="#{device.modify.action.button}">Action</button></td>
            </tr>
        <!--</tbody>  -->
    </table>
    </form>


</div>
</body>

问题出在css样式表上。基本上Spring似乎找不到它,尽管我把文件放在 /resources/static/css/main.css

它返回错误(在日志中):

o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/css/main.css] in DispatcherServlet with name 'dispatcherServlet'

现在医生都说Spring Boot应该自动提供 /resources/static

这是我的网络配置:

@Configuration
@ComponentScan("com.txxxxcorp.txxxxpoint.resource")
@EnableWebMvc
public class WebConfig {

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultiPartConfigFactory factory = new MultiPartConfigFactory();
        factory.setMaxFileSize("4096KB");
        factory.setMaxRequestSize("4096KB");
        return factory.createMultipartConfig();
    }

    @Bean  
    public ViewResolver viewResolver() {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setTemplateMode("XHTML");
        templateResolver.setPrefix("templates/");
        templateResolver.setSuffix(".html");

        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver);

        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(engine);

        String[] excludedViews = new String[]{
            "/resources/static/**"};
        viewResolver.setExcludedViewNames(excludedViews);

        return viewResolver;
    }

    @Bean
    public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer servletContainer) {
                ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers(
                        new TomcatConnectorCustomizer() {
                            @Override
                            public void customize(Connector connector) {
                                AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
                                httpProtocol.setCompression("on");
                                httpProtocol.setCompressionMinSize(256);
                                String mimeTypes = httpProtocol.getCompressableMimeTypes();
                                String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE;
                                httpProtocol.setCompressableMimeTypes(mimeTypesWithJson);
                            }
                        }
                );
            }
        };
    }

    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource source = new ResourceBundleMessageSource();
        source.setBasename("messages");
        return source;
    }

出于某种原因,编辑器不让我插入Spring安全配置而不抱怨其格式不正确(IntelliJ、Maven和Spring Boot不同意这一点,因为它可以编译和工作),请放心,我已经允许 /css/main.css路径通过

有人知道为什么我无法解析css文件吗?

共有3个答案

王鹏飞
2023-03-14

我不得不将thymeleaf依赖性添加到pom中。没有这个依赖项,Spring Boot就找不到静态资源。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
洪浩波
2023-03-14

因此,您在此处使用的任何css文件都已被Thyemeleaf解析,您需要声明该类以继承WebMvcAutoConfigurationAdapter并覆盖addResourceHandler方法,代码可能如下所示:

 @Configuration
    @ComponentScan("com.txxxxcorp.txxxxpoint.resource")
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {

 @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        String[] STATIC_RESOURCE = {"/","classpath:/","classpath:/META-INF/resources/", "classpath:/META-INF/resources/webjars/",
                "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

        if (!registry.hasMappingForPattern("/**")) {
            registry.addResourceHandler("/**").addResourceLocations(STATIC_RESOURCE);
        }
    }

.......................
}
董小林
2023-03-14

使用EnableWebMvc关闭Spring Boot的MVC自动配置(以及静态资源处理)。

要启用静态资源处理,最好的解决方案是删除EnableWebMvc,让Spring Boot做它最擅长的事情——自动配置。

更改后,你应该做一些回归测试,以确保没有其他损坏

 类似资料:
  • POM 应用程序 控制器 此外,我有模板文件夹中的资源文件夹和内部错误。html和index.html 当我访问localhost:8080/index时,会显示错误,而不是索引。我做错了什么?这真的是最简单的设置,它已经错了。。。

  • 我试图让我的web应用程序重新使用新的Spring Boot版本1.3.5工作,但是thymeleaf方言似乎不再工作了。 我补充说 (尽管我认为spring boot会为我做到这一点)。温使用了像E。g. 表达式将不会呈现,因为角色似乎是空的,尽管我可以将自定义用户元素注入控制器: 从调试中,我看到注入的主体对象不是null,但模板似乎无法解析sec:objects。我删除了xmlns命名空间并

  • 这是Thymeleaf引擎的配置文件。我还试图添加资源处理,这是: SpringBoot with Thymeleaf-css not search 包com.ggk.config; 这是我的索引。html添加css文件。

  • 因此,作为一个初学者,我曾尝试使用spring boot 2.2.11、spring security、thymeleaf和json web令牌创建一个ecommmerce网站,我的问题是,当用户对模板进行身份验证时,即使我在模板中放置了thymeleaf的isAnonyms和IsAuthentificated标记,模板也没有更改。 我有两个问题: 1-/如何告诉所有控制器用户已经登录? 2-/如

  • 我有两个项目。我用Angular2 cli构建的Angular2应用程序和只为Angular2应用程序服务的Spring Boot应用程序。我用构建Angular2应用程序,它会生成一个文件夹。然后,我将文件夹的内容放在Spring Boot应用程序的中。 我的Spring启动应用程序有两个文件。 Spring Boot应用程序类: 及其应用。属性文件: 它工作得很好,但是如果我转到一个url并点