繁体   English   中英

Spring MVC 无法提供静态资源

[英]Static resource cannot be served with Spring MVC

我正在尝试提供静态资源(css 文件)。

我已经注册了位置和处理程序

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

所以 Tomcat 的 Logger 会显示到资源的正确映射

将 URL 路径 [/resources/**] 映射到 [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 类型的处理程序上

当浏览器呈现视图时,检查器会在尝试获取静态资源时显示 404 错误。

在此处输入图片说明

应用初始化程序

@Configuration
@ComponentScan("com.learning")
@EnableWebMvc
public class ApplicationInitializer extends WebMvcConfigurerAdapter implements WebApplicationInitializer {

    private final Logger LOGGER = Logger.getLogger(ApplicationInitializer.class.getName());
    public static final String DISPATCHER_SERVLET_NAME = "dispatcher";

    @Autowired
    private ApplicationContext applicationContext;

    public ApplicationInitializer() {
    }

    //region Context Initialization Area
    public void onStartup(ServletContext servletContext) throws ServletException {
        WebApplicationContext springContext = getSpringApplicationContext();
        MyDispatcherServlet dispatcherServlet = new MyDispatcherServlet(springContext);

        servletContext.addListener(new ContextLoaderListener(springContext));
        servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
        servletContext.getSessionCookieConfig().setHttpOnly(true);

        ServletRegistration.Dynamic dispatcher = servletContext.addServlet(DISPATCHER_SERVLET_NAME, dispatcherServlet);
        dispatcher.addMapping("/");
        dispatcher.setLoadOnStartup(1);

    }

    private WebApplicationContext getSpringApplicationContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        LOGGER.info(String.format("Registering springApplicationContext: %s", context));
        // Loads into container first
        context.register(ApplicationInitializer.class);
        LOGGER.info(String.format("Registration success of springApplicationContext: %s", context));
        return context;
    }
    //endregion

    //region ViewResolver Region
    @Bean
    public ViewResolver viewResolver() {
        //Runs after coontroller ends its execution. It receives the view name to be processed.
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }

    @Bean
    public TemplateEngine templateEngine() {
        // Processes the template
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setEnableSpringELCompiler(true);
        engine.setTemplateResolver(templateResolver());
        return engine;
    }

    private ITemplateResolver templateResolver() {
        //Resolves templates with provided prefix and suffix
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }
    //endregion

    //region ResourceHandler Region
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");
    }
    //endregion
}

你好.html

 h1 { color: red; text-align: center; }
 <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="/resources/css/MyCss.css" th:href="@{/resources/css/MyCss.css}"/> </head> <body> <h1 th:text="'Hello ' + ${name}">Hello World</h1> </body> </html>

它应该显示为正在运行的代码段......但正如我所提到的,该应用程序无法找到并加载资源。

日志文件

类路径

在此处输入图片说明

在此处输入图片说明

有什么帮助吗?

http://localhost:8080/resources/css/MyCss.css

您缺少 webapp 名称:

http://localhost:8080/webapp_name/resources/css/MyCss.css

在您的: link rel="stylesheet" ...

使用Spring URL 标记,以便更好地解析您的 URL。

这是我用来导入 bootstrap.min.css 的方法:

<link rel="stylesheet" href='<spring:url value="/resources/bootstrap/bootstrap.min.css"/>' type="text/css" />

不要忘记添加标签库,如下所示:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM