在Spring MVC中提供静态内容(3.1.1)

时间:2012-05-12 11:27:20

标签: spring spring-mvc

我的调度程序servlet映射到应用程序的根目录。

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

我有一个名为&#39; static&#39;的文件夹。在我的webroot中。它包含CSS,JS和图像文件。但是,由于调度程序servlet映射,对静态内容的请求最终会在404s中结束。

我知道解决这个问题的解决方案。

  1. 将调度程序映射到更具体的URL,例如:context:/ app /,然后编写一个过滤器来拦截请求,并有条件地映射到默认的servlet,或者委托给spring调度程序。

  2. 网址重写技巧。

  3. 使用<mvc:resources />

  4. 问题是,我的映射是基于XML的,我绝对不会在使用注释名称的地方散布我的映射配置。因此,如果我使用<mvc:resources />,我的基于xml的映射会中断,并且所有到不同控制器的url映射都会丢失。

    这是因为<mvc:resources /&gt;覆盖一些设置并应用它自己的设置。但它也是静态内容最干净的解决方案。

    可以告诉<mvc:resources />不覆盖基于xml的映射吗?

4 个答案:

答案 0 :(得分:1)

<mvc:resources />似乎非常适合您的问题。

根据我的理解,您的DispatcherServlet正在处理对您服务器的所有请求。因此,资源标记应返回mvc:resources位置属性中指定位置的文件。它不应该捕捉除映射之外的任何东西。

你是否正在使用

的内容
<mvc:resources mapping="/static/**" location="/static/"/>

如果覆盖标签中不可配置的设置,请考虑实例化您自己的org.springframework.web.servlet.resource.ResourceHttpRequestHandler

答案 1 :(得分:1)

我确实在web.xml中有这个

    <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>

答案 2 :(得分:0)

您可以为控制器提供文件扩展名,例如

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

然后,以.do结尾的所有网址都将通过spring DispatcherServlet。

答案 3 :(得分:0)

add&lt; mvc:default-servlet-handler /&gt;在web.xml文件的顶部

或者如果您使用的是注释

@Configuration
@EnableWebMvc
public class MVCConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable("default");
    }
}