Java 根url的匹配和静态资源的服务
我的问题是如何配置SpringMVC应用程序以同时允许Java 根url的匹配和静态资源的服务,java,spring-mvc,resources,Java,Spring Mvc,Resources,我的问题是如何配置SpringMVC应用程序以同时允许 应用程序应该提供静态资源(css、js、图像…) 根url(http://my.host.org/webb_app/)应由弹簧控制器提供服务 我已经读过了,还有。所有这些都提供了有效的解决方案,直到最近,我才将它们作为烹饪食谱使用,直到应用程序或多或少可以接受为止。所有这些都并没有参考资料,也并没有对其最终工作的原因和方式的明确理解 因此,问题是:针对这一需求配置Spring MVC应用程序的不同方式有哪些,它们的缺点是什么,它们背后的
- 应用程序应该提供静态资源(css、js、图像…)
- 根url(
)应由弹簧控制器提供服务http://my.host.org/webb_app/
因此,问题是:针对这一需求配置Spring MVC应用程序的不同方式有哪些,它们的缺点是什么,它们背后的原理是什么。我将首先对
DefaultServlet
的工作原理作一个初步的评论。根据,容器通常提供一个默认的servlet,该servlet具有最低优先级并服务于静态上下文。映射/
是此默认servlet的隐式映射
现在来看解决方案:
将弹簧控制器映射到子层次
这是最简单的解决方案:您可以将SpringDispatcherServlet
映射到/pages
,或者映射到/pages
和/api
。然后,默认servlet将为所有其他URL(包括根URL)提供服务。要为根控制器提供服务,您可以将控制器映射到/home
(例如),并使/index.jsp
包含
——这是当前在使用扩展映射的其他框架中使用的一种方法,例如Struts(*.do
用于旧Struts1)
缺点:用/pages
声明url不是很好
将资源映射到子层次结构
此解决方案在参考页面中使用率很高。SpringDispatcherServlet
映射到/*
,因此获取所有请求(除非存在更具体的映射)。要提供静态资源,只需声明一个ResourceHttpRequestHandler
,在XML中使用:
<mvc:resources mapping="/resources/**" location="/public-resources/"/>
这非常好,您可以直接将Spring控制器映射到/
缺点:不能提供直接位于根上下文下的静态资源
将DispatcherServlet映射为默认servlet
将SpringDispatcherServlet
映射到/
实际上正在替换容器中的默认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();
}
}