【问题标题】:Spring MVC web.xml's DispatcherServlet instances per url-mapping每个 url-mapping 的 Spring MVC web.xml 的 DispatcherServlet 实例
【发布时间】:2016-05-05 05:20:04
【问题描述】:

Spring MVC web.xml 具有充当 FrontController 的 DispatcherServlet,我对 Spring 中的 Servlet 概念有点困惑,因为我知道 Web 容器中只有一个 Servlet 实例,并且多个线程在 service() 方法上运行但是在 Spring 的情况下,每个 url-mapping 只创建一个 DispatcherServlet 实例,或者我们有多个 DispatcherServlet 实例。

例如: 映射到jsp调用:

<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/config/servlet-config-jsp.xml</param-value>
  </init-param>
</servlet>

<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

映射到 HTML 调用:

<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/config/servlet-config-html.xml</param-value>
  </init-param>
</servlet>

<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>*.html</url-pattern>
</servlet-mapping>

简单地把创建了多少 DispatcherServlet 的实例放在上面的例子中,用于映射 html 和 jsp 调用。

【问题讨论】:

    标签: java spring jsp spring-mvc servlets


    【解决方案1】:

    是的,就像任何普通的 Java Servlet 一样,您可以通过为每个 &lt;servlet&gt; 声明分配不同的 Servlet 名称来定义同一个 servlet 类的两个实例

    <servlet>
        <servlet-name>jspDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        ...
    </servlet>
    <servlet>
        <servlet-name>htmlDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        ...
    </servlet>
    

    documentation 中也明确指出,您可以在一个 Web 应用程序中安全地定义多个 DispatcherServlet 实例。

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

    所以只要将这两个 Servlet 映射到两种不同的 URL 模式,就可以了。

    【讨论】:

    • 这些场景下什么时候会为每个DispatcherServlet创建Spring WebApplicationContext,谁负责为每个DispatcherServet创建WebApplicationContext对象
    • Spring 为容器内创建的每个 DispatcherServlet 关联一个 WebApplicationContext
    • 你没有得到我的问题,我是问当应用程序启动时,web.xml 将被读取以加载 servlet,因此我们的 DispatcherServlet 将被加载但 Spring 仍然不在图片中,现在我的查询是:IS DispatcherServlet 实例化 WebApplicationContext 或由服务器处理。希望我现在明白了。
    • 其实答案是 DispatcherServlet init() 方法正在初始化 WebApplicationContext。无论如何,谢谢。干杯
    • 是的,没错。当容器加载DispatcherServlet时,会创建WebApplicationContext(在init()方法执行期间)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2012-08-27
    • 2014-05-01
    • 2012-09-01
    • 2018-10-12
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多