25

到目前为止,我曾经认为一个 Web 应用程序只能有一个dispatcher-servlet我们在web.xml

  • 我这样想对吗?
  • 我可以在单个 Web 应用程序中拥有多个调度程序 servlet 吗?如果是,如何?
  • 在什么情况下我们可能需要这个?
  • 整个 Web 应用程序中可以只有一个应用程序上下文吗?
  • 我们如何定义多个应用程序上下文?
  • 可以dispatcher-servlet存在于非弹簧应用程序中吗?
4

2 回答 2

30

您可以在单个 Web 应用程序中拥有多个调度程序 servlet 吗?

当然,引用官方文档粗体其实也有!)

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


如何?

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


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

DispatcherServlet非常灵活。不仅 Spring MVC 使用,还有 Spring WS、Spring 对的支持等。


此外,整个 Web 应用程序中是否只有一个应用程序上下文?

已经回答,也在引用的文档中:每个应用程序上下文DispatcherServlet+ 一个主要 Web 应用程序上下文。


我们如何定义多个应用程序上下文?

见上文,只需创建多个DispatcherServlets。


调度程序 servlet 可以存在于非 Spring 应用程序中吗?

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

于 2012-08-21T16:56:28.913 回答
1

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


多个调度程序 servlet 的优点
为什么我们需要多个调度程序 servlet?

简单的答案是以多种形式拥有DispatcherServlet 的功能

Dispatcher servlet 功能



我将尝试解释一些由DispatcherServlet

声明多个分派器 servlet
考虑我们有两个分派器 servlet(DS),其中 DS1、DS2 配置有不同的 url 模式( **.simple, **.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>

优势一:我们可以为不同的 URL 设置不同的 HandlerMapping

DS1 bean 名称 url 处理程序映射配置

<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 集使用不同的视图解析器。

DS1 的InternalResourceViewResolver
,它只处理prefix + returned String + suffix.
TilesViewResolver for DS2
它的实现由 apache tile 提供,这是一个基于布局/骨架的插件高级功能,如下所示。 或者,如果我们为不同的 URL匿名用户
在此处输入图像描述 集使用不同布局的 TilesViewResolver - 登录用户的不同布局 - 不同的布局


优势 3:我们可以为不同的 URL 集使用不同的主题解析器。
这些解析器持续监控 cookie/会话以解析主题并提供样式表/主题合格(如下图所示)。下面仅给出CookieThemeResolver
注意:这不是关于主题配置,而是关于主题解析器配置。

在此处输入图像描述

优势 4:我们可以为不同的 URL 集使用不同的语言环境解析器。
这些解析器持续监控 cookie/session/accept-header 以解析区域设置并加载合格的应用程序消息(如下图所示)。下面仅给出CookieLocaleResolver
注意:这不是关于语言环境配置,而是关于语言环境解析器配置。
在此处输入图像描述

于 2019-09-29T22:38:41.697 回答