首先,我将对
DefaultServlet工作原理进行初步说明。根据Servlet
3.0规范,容器通常提供默认的Servlet,该Servlet的优先级最低,并提供静态上下文。映射
/是此默认Servlet的隐式映射。
现在为解决方案:
将d簧控制器映射到子层次结构这是最简单的解决方案:你映射spring
DispatcherServlet到
/pages,或者
/pages和
/api例如。然后,默认servlet将提供所有其他URL(包括root)。为了服务于根控制器,可以映射控制器,其
/home(例如),并具有
/index.jsp包含
<jsp:forwardpage="/home"/>-这是在使用扩展映射如Struts其他框架当前使用(的方法
*.do用于老Struts1的)。
缺点:用url声明
/pages不是很好。将资源映射到子层次结构
此解决方案在参考页面中得到了广泛使用。Spring
DispatcherServlet被映射到
/*所有请求(除非存在更具体的映射)。要提供静态资源,您只需
ResourceHttpRequestHandler在XML中声明一个,即可:
<mvc:resources mapping="/resources/**" location="/public-resources/"/>
或在Java配置中:
@Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/"); }}
这工作得很好,您可以
/直接将Spring控制器映射到。
缺点:您不能提供直接位于根上下文下的静态资源。
映射DispatcherServlet为默认servlet
实际上,将Spring映射
DispatcherServlet为
/要替换容器中的默认servlet,以处理所有尚未处理的URL。通过这种映射,对于未映射到控制器的URL,Spring可以回退到原始的默认servlet。为此,您必须配置一个
DefaultServletHttpRequestHandler具有
"/**"最低优先级的URL映射。您可以使用XML进行 *** 作:
<mvc:default-servlet-handler/>
或在Java配置中:
@Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }}
这样,
DispatcherServlet通常会调用所有控制器,并具有原始的默认Servlet来服务静态(未映射)资源。不幸的是,这并 没有为根URL工作,你必须使用
<jsp:forward page="..."/>伎俩像第一个解决方案。
缺点 :
- 无法直接映射根URL,需要
index.jsp
<jsp:forward page="..."/>
技巧 - 由于Spring被替换为原始容器的默认servlet,因此 必须 按名称进行调用。它适用于常见容器(包括Tomcat,Jetty,GlassFish,JBoss,Resin,WebLogic和WebSphere),或者您也可以将默认servlet的名称作为XML config(
<mvc:default-servlet-handler default-servlet-name="customDefaultServlet"/>
)中的属性或参数(如果是Java配置)给出:configurer.enable("customDefaultServlet");
参考:Spring参考手册/ Web
MVC框架/资源服务
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)