1

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

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

我的 webroot 中有一个名为“static”的文件夹。它包含 CSS、JS 和图像文件。但是,由于调度程序 servlet 映射,对静态内容的请求以 404 结束。

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

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

  2. URL 重写技巧。

  3. 使用<mvc:resources />

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

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

有什么方法可以告诉<mvc:resources />不要覆盖我的基于 xml 的映射?

4

4 回答 4

1

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

据我了解,您DispatcherServlet正在处理对服务器的所有请求。所以资源标签应该返回在 mvc:resources 位置属性中指定的位置的文件。除了映射的内容之外,它不应该捕获任何内容。

您是否正在使用类似的东西

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

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

于 2012-05-12T13:26:34.127 回答
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>
于 2012-12-10T22:56:26.460 回答
0

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

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

然后所有以结尾的 URL.do都会经过 springs DispatcherServlet。

于 2012-05-12T11:34:45.920 回答
0

将 <mvc:default-servlet-handler/> 添加到 web.xml 文件的顶部

或者如果您正在使用注释

@Configuration
@EnableWebMvc
public class MVCConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable("default");
    }
}
于 2014-06-16T09:57:16.837 回答