多个应用程序上下文,多个调度servlet?

25

直到现在,我一直认为Web应用程序只能有一个dispatcher-servlet,我们在web.xml中定义它

  • 我的想法是否正确?
  • 在单个Web应用程序中可以有多个Dispatcher Servlet吗?如果可以,该如何实现?
  • 什么情况下需要多个Dispatcher Servlet?
  • 整个Web应用程序中是否只能有一个应用程序上下文?
  • 如何定义多个应用程序上下文?
  • 非 Spring 应用程序中可以存在 Dispatcher Servlet 吗?

看一下FrameworkServlet,它是DispatcherServlet的超类。许多困惑将会消失。 - smwikipedia
2个回答

30

一个Web应用程序可以定义任意数量的DispatcherServlet。每个servlet将在自己的命名空间中运行,使用自己的应用程序上下文加载映射、处理程序等。仅由ContextLoaderListener加载的根应用程序上下文(如果有)将被共享。

当然,引用官方文档加粗也是存在的!)


只需声明几个不同名称的servlet,但使用org.springframework.web.servlet.DispatcherServlet类。还要确保 yourServletName-servlet.xml 文件可用。

我们在什么情况下可能需要这个?

DispatcherServlet非常灵活。不仅Spring MVC使用它,而且Spring WS、Spring对的支持也使用它。


此外,整个Web应用程序中只能有一个应用程序上下文吗?已经回答过了,在引用的文档中:每个DispatcherServlet +一个主Web应用程序上下文一个应用程序上下文。
我们如何定义多个应用上下文? 只需创建多个DispatcherServlet即可。

调度程序Servlet能否存在于非Spring应用程序中?

DispatcherServlet本身就是一个Spring上下文(Spring应用程序),因此不行。然而,DispatcherServlet可以在没有父(主)应用程序上下文的应用程序中声明,因此可以。


1
我们在什么情况下可能需要这个?
或者
多个Dispatcher Servlet的优点
为什么我们需要多个Dispatcher Servlet?
简单的答案是为了以多种形式拥有 DispatcherServlet的功能。

Dispatcher Servlet的功能



我将尝试解释由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 提供,是一个基于布局/骨架的高级插件,具有以下功能。
enter image description here 或者,如果我们针对不同的URL集合使用 TilesViewResolver 不同的布局:
匿名用户 - 不同的布局
已登录用户 - 不同的布局

优点3:我们可以为不同的URL集合设置不同的主题解析器。
这些解析器会持续监控cookie/session以解析主题,并提供符合样式表/主题要求的服务(如下图所示)。以下仅是CookieThemeResolver的示例结果。
注意:这不是关于主题配置,而是关于主题解析器配置。

enter image description here

优势4:我们可以为不同的URL集合设置不同的区域设置解析器。
这些解析器会持续监控cookie/session/accept-header以解析区域设置,并加载应用程序消息(如下图所示)。以下仅是CookieLocaleResolver的结果示例。
注意:这不是关于区域设置配置,而是关于区域设置解析器配置。
enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接