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

Posted

技术标签:

【中文标题】多个应用程序上下文,多个调度程序 servlet?【英文标题】:Multiple application context, multiple dispatcher servlets? 【发布时间】:2012-08-17 01:27:54 【问题描述】:

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

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

【问题讨论】:

看看FrameworkServlet,它是DispatcherServlet的超类。很多困惑都会消失。 【参考方案1】:

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

当然,引用official documentation(粗体实际上也有!)

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


怎么做?

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


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

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


另外,整个 Web 应用程序中可以只有一个应用程序上下文吗?

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


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

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


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

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

【讨论】:

【参考方案2】:

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

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

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

调度程序 servlet 功能


Dispatcher Servlet 使用HandlerMapping 实现来控制请求到处理程序对象的路由。默认为BeanNameUrlHandlerMapping 和RequestMappingHandlerMapping。 它的视图解析策略可以通过ViewResolver 实现指定,将符号视图名称解析为视图对象。默认为InternalResourceViewResolver。 可以通过HandlerExceptionResolver 指定它的异常解决策略,例如将某些异常映射到错误页面。 解决多部分请求的策略由MultipartResolver 实现决定。 它的语言环境解析策略由LocaleResolver 决定。 它的主题解析策略由ThemeResolver决定。


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

InternalResourceViewResolver 用于 DS1 它仅处理 prefix + returned String + suffixTilesViewResolver 用于 DS2 它的实现由 apache tile 提供,这是一个基于布局/骨架的插件高级功能,如下所示。 或者,如果我们为不同的 URL 集使用具有不同布局的 TilesViewResolver 匿名用户 - 不同的布局 登录用户 - 不同的布局

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

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

【讨论】:

以上是关于多个应用程序上下文,多个调度程序 servlet?的主要内容,如果未能解决你的问题,请参考以下文章

servlet 上下文的多个动态数据源

根上下文和调度程序 servlet 上下文到底是如何进入 Spring MVC Web 应用程序的?

用@RequestMapping映射请求

多核并行编程技术

Servlet容器如何同时来处理多个请求

Spring MVC 调度程序 xml 和应用程序上下文 xml