直到现在,我一直认为Web应用程序只能有一个dispatcher-servlet
,我们在web.xml
中定义它
- 我的想法是否正确?
- 在单个Web应用程序中可以有多个Dispatcher Servlet吗?如果可以,该如何实现?
- 什么情况下需要多个Dispatcher Servlet?
- 整个Web应用程序中是否只能有一个应用程序上下文?
- 如何定义多个应用程序上下文?
- 非 Spring 应用程序中可以存在 Dispatcher Servlet 吗?
直到现在,我一直认为Web应用程序只能有一个dispatcher-servlet
,我们在web.xml
中定义它
一个Web应用程序可以定义任意数量的DispatcherServlet。每个servlet将在自己的命名空间中运行,使用自己的应用程序上下文加载映射、处理程序等。仅由ContextLoaderListener加载的根应用程序上下文(如果有)将被共享。
当然,引用官方文档(加粗也是存在的!)
org.springframework.web.servlet.DispatcherServlet
类。还要确保 yourServletName-servlet.xml
文件可用。
我们在什么情况下可能需要这个?
DispatcherServlet
非常灵活。不仅Spring MVC使用它,而且Spring WS、Spring对hessian的支持也使用它。
调度程序Servlet能否存在于非Spring应用程序中?
DispatcherServlet
本身就是一个Spring上下文(Spring应用程序),因此不行。然而,DispatcherServlet
可以在没有父(主)应用程序上下文的应用程序中声明,因此可以。
DispatcherServlet
提供的某些功能。声明多个派发器servlet
考虑我们有两个调度程序servlet(DS),其中DS1,DS2配置有不同的url模式(**.简单, **.beanName
),并且它们使用不同的分派程序servlet配置,如下所示。
DispatcherServlet - simpleUrlHandlerDispatcherServlet
contextConfigLocation - /WEB-INF/simpleUrlHandlerMapping.xml
<url-pattern>*.simple</url-pattern>
DispatcherServlet - beanNameUrlHandlerDispatcherServlet
contextConfigLocation - /WEB-INF/beanNameUrlHandlerMapping.xml
<url-pattern>*.beanName</url-pattern>
优势1:我们可以为不同的URL集合使用不同的HandlerMapping
DS1 bean名称URL Handler映射配置
<bean name="/hello.beanName" class="com.pvn.mvc.HelloController" />
<bean name="/hi.beanName" class="com.pvn.mvc.HiController" />
DS2简单的URL处理程序映射配置
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.simple">simpleHello</prop>
<prop key="/hi.simple">simpleHi</prop>
</props>
</property>
</bean>
优点 2: 我们可以针对不同的URL集合使用不同的视图解析器。
InternalResourceViewResolver 用于 DS1
它只处理 前缀 + 返回的字符串 + 后缀
。
TilesViewResolver 用于 DS2
它的实现由 Apache Tiles 提供,是一个基于布局/骨架的高级插件,具有以下功能。
或者,如果我们针对不同的URL集合使用 TilesViewResolver 不同的布局:
匿名用户 - 不同的布局
已登录用户 - 不同的布局
优点3:我们可以为不同的URL集合设置不同的主题解析器。
这些解析器会持续监控cookie/session以解析主题,并提供符合样式表/主题要求的服务(如下图所示)。以下仅是CookieThemeResolver的示例结果。
注意:这不是关于主题配置,而是关于主题解析器配置。
优势4:我们可以为不同的URL集合设置不同的区域设置解析器。
这些解析器会持续监控cookie/session/accept-header以解析区域设置,并加载应用程序消息(如下图所示)。以下仅是CookieLocaleResolver的结果示例。
注意:这不是关于区域设置配置,而是关于区域设置解析器配置。
FrameworkServlet
,它是DispatcherServlet
的超类。许多困惑将会消失。 - smwikipedia