Java 根url的匹配和静态资源的服务

Java 根url的匹配和静态资源的服务,java,spring-mvc,resources,Java,Spring Mvc,Resources,我的问题是如何配置SpringMVC应用程序以同时允许 应用程序应该提供静态资源(css、js、图像…) 根url(http://my.host.org/webb_app/)应由弹簧控制器提供服务 我已经读过了,还有。所有这些都提供了有效的解决方案,直到最近,我才将它们作为烹饪食谱使用,直到应用程序或多或少可以接受为止。所有这些都并没有参考资料,也并没有对其最终工作的原因和方式的明确理解 因此,问题是:针对这一需求配置Spring MVC应用程序的不同方式有哪些,它们的缺点是什么,它们背后的

我的问题是如何配置SpringMVC应用程序以同时允许

  • 应用程序应该提供静态资源(css、js、图像…)
  • 根url(
    http://my.host.org/webb_app/
    )应由弹簧控制器提供服务
我已经读过了,还有。所有这些都提供了有效的解决方案,直到最近,我才将它们作为烹饪食谱使用,直到应用程序或多或少可以接受为止。所有这些都并没有参考资料,也并没有对其最终工作的原因和方式的明确理解


因此,问题是:针对这一需求配置Spring MVC应用程序的不同方式有哪些,它们的缺点是什么,它们背后的原理是什么。

我将首先对
DefaultServlet
的工作原理作一个初步的评论。根据,容器通常提供一个默认的servlet,该servlet具有最低优先级并服务于静态上下文。映射
/
是此默认servlet的隐式映射

现在来看解决方案:

将弹簧控制器映射到子层次 这是最简单的解决方案:您可以将Spring
DispatcherServlet
映射到
/pages
,或者映射到
/pages
/api
。然后,默认servlet将为所有其他URL(包括根URL)提供服务。要为根控制器提供服务,您可以将控制器映射到
/home
(例如),并使
/index.jsp
包含
——这是当前在使用扩展映射的其他框架中使用的一种方法,例如Struts(
*.do
用于旧Struts1)

缺点:用
/pages
声明url不是很好

将资源映射到子层次结构 此解决方案在参考页面中使用率很高。Spring
DispatcherServlet
映射到
/*
,因此获取所有请求(除非存在更具体的映射)。要提供静态资源,只需声明一个
ResourceHttpRequestHandler
,在XML中使用:

<mvc:resources mapping="/resources/**" location="/public-resources/"/>
这非常好,您可以直接将Spring控制器映射到
/

缺点:不能提供直接位于根上下文下的静态资源

将DispatcherServlet映射为默认servlet 将Spring
DispatcherServlet
映射到
/
实际上正在替换容器中的默认servlet,以处理所有尚未处理的URL。通过这种映射,Spring可以回退到未映射到控制器的URL的原始默认servlet。为此,您必须配置一个URL映射为
“/**”
且优先级最低的
DefaultServletHttpRequestHandler
。您可以使用XML进行此操作:

<mvc:default-servlet-handler/>
这样,
DispatcherServlet
通常调用所有控制器,并使用原始默认servlet来服务静态(未映射)资源。不幸的是,这对根URL不起作用,您必须像第一个解决方案一样使用
技巧

缺点:

  • 无法直接映射根URL,需要
    index.jsp
    技巧
  • 由于Spring取代了原来的容器缺省servlet,所以它必须按名称调用它。它适用于普通容器(包括Tomcat、Jetty、GlassFish、JBoss、Resin、WebLogic和WebSphere),或者您也可以在XML配置(
    )中作为属性指定默认servlet的名称,或者在java配置中作为参数指定:
    configurer.enable(“customDefaultServlet”)

参考资料:

您还可以做另一件事:将
DispatcherServlet
映射到
/
(替换默认servlet)和
注册表.addResourceHandler(“/**”).addResourceLocations(“/”
)。一切都可以从根目录获得,但我不确定它是否正确。你对此有何评论??谢谢
<mvc:default-servlet-handler/>
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

}