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

Spring MVC未从webapp加载静态资源

牟恺
2023-03-14

问题无法让Spring为静态资源添加资源处理程序。

背景信息我有一个Spring MVC webapp在独立的Jetty实例中运行。我的webapp结构是

webapp root/
    resources/
        css/
        images/
        js/
    WEB-INF/
        layouts/
            tiles.xml
            page.jsp
        lib/
        views/
            home/
                home.jsp
                tiles.xml
        web.xml

我已经扩展了WebMVCConfigureAdaptor,添加了一个资源映射,这样URL就像公司一样。com/myservlet/resources/css/main。css将解析到webapp根目录/资源/css文件夹。

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

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

我的小控制器是这样的:

@Controller
public class SpringAppController {       

    public SpringAppController() {
    }

    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public ModelAndView handleRequestHome(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        return new ModelAndView("home");
    }
}

我的网站。xml就是这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- Java-based Spring container definition -->
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>

    <!-- Location of Java @Configuration classes that configure the components that makeup this application -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.company</param-value>
    </context-param>

    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Processes application requests -->
    <servlet>
        <servlet-name>admin</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>admin</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- Ensure UTF-8 encoded pages so that certain characters are displayed and submitted correctly -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Enables support for DELETE and PUT request methods with web browser clients -->
    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

我的JavaConfig用于webapp实例化一些mvc解析器,如下所示:

@Configuration
public class MainConfig {

    @Bean
    public ViewResolver viewResolver() {
        UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
        viewResolver.setViewClass(TilesView.class);
        return viewResolver;
    }

    @Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer configurer = new TilesConfigurer();
        configurer.setDefinitions(new String[] {
            "/WEB-INF/layouts/tiles.xml",
            "/WEB-INF/views/**/tiles.xml"
        });
        configurer.setCheckRefresh(true);
        return configurer;
    }

    @Bean
    public org.springframework.context.MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("/WEB-INF/messages/messages");
        return messageSource;
    }

}

当我点击url公司时。com/myservlet/home-the-tiles-stuff-works-and-the-home。显示jsp页面,但未加载css和图像。servlet记录此警告:

[DEBUG] [DispatcherServlet] [DispatcherServlet with name 'admin' processing GET request for [/api/v1/tlb/resources/page.css]] 
[DEBUG] [RequestMappingHandlerMapping] [Looking up handler method for path /resources/form.css] 
[DEBUG] [RequestMappingHandlerMapping] [Did not find handler method for [/resources/form.css]]
[WARN ] [PageNotFound] [No mapping found for HTTP request with URI [/api/v1/tlb/resources/form.css] in DispatcherServlet with name 'admin']

我已经尝试调试servlet和WebMvcConfig.addResourceHandler()方法从未被调用,因此为什么找不到静态资源。我错过了什么来让这个工作?

如果我在我的网站上添加以下内容,请注意。xml将加载css资源,但我想知道为什么会加载WebMvcConfig。addResourceHandlers()方法未调用,因此我不需要此servlet映射。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

共有1个答案

史智志
2023-03-14

嗯,我已经解决了这个问题,但还不确定原因/方式。该项目导入了一个jar,其中包含一个扩展了WebMvcConfigurationSupport的类,如下所示:

@Configuration
public class EnableUriMatrixVariableSupport extends WebMvcConfigurationSupport {

    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping hm = super.requestMappingHandlerMapping();
        hm.setRemoveSemicolonContent(false);
        return hm;
    }
}

此外,我还具有导入DelegatingWebMvcConfiguration的EnableMvc注释。我认为这最终会创建两个WebMvcConfigurationSupport实例,这会在spring容器中造成严重破坏。不幸的是,我升级到了spring 4。x正在修复此问题,因此我不确定这是否有帮助。

 类似资料:
  • 4.1 原生koa2实现静态资源服务器 4.2 koa-static中间件

  • 我正在尝试将静态资源加载到thymeleaf html文件。但是资源没有加载。有人知道我做错了什么吗。。。。 我在这里使用SpringJavaConfig这是我的Config类 这是我的超文本标记语言页面。 这就是我的文件夹结构如何处理需要加载的静态资源。 我在互联网上找到了使用WebMVCConfigureAdapter的资源。但是我使用的是WebMvcConfigurationSupport。

  • 问题内容: 我得到了一个Spring MVC应用程序,该应用程序当前在目录中放置了一堆CSS和JS文件。 我通读了Spring Docs和一些有关如何使用ResourceHandlerRegistry类为模板加载这些文件的教程。我特别认为本教程中的代码段完全适合我的项目结构。 但是我的资源文件上总是显示404。 这是我当前正在使用的Application / Configuration类: 这是我

  • 我试图使用相对路径在jsp文件中加载静态资源,如css文件和javascript文件,但servlet映射似乎覆盖了对它们的映射。 项目结构: web.xml: mvc调度程序servlet。xml: 我尝试加载样式表的JSP文件: 我得到的错误是: 警告组织。springframework。网状物servlet。PageNotFound:1108-在名为“mvc dispatcher”的Disp

  • 本文向大家介绍SpringMVC访问静态资源的方法,包括了SpringMVC访问静态资源的方法的使用技巧和注意事项,需要的朋友参考一下 在SpringMVC中常用的就是Controller与View。但是我们常常会需要访问静态资源,如html,js,css,image等。 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问。该肿么办呢? 在配置文件:

  • 我使用gradle从一个构建了一个war文件,并且我能够使用“java-jar my”运行它。战争'。当我访问应用程序时,静态资产出现故障,日志中出现以下异常: JAVA木卫一。FileNotFoundException:Jar URL无法解析为绝对文件路径,因为它不位于文件系统:war:file:/BUILD\u DIR/BUILD/libs/my中。war*/assets/images/hom