每个url-mapping的Spring MVC web.xml的DispatcherServlet实例

时间:2016-01-28 01:14:32

标签: java spring jsp spring-mvc servlets

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

例: 映射到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调用。

1 个答案:

答案 0 :(得分:3)

是的,就像任何普通的Java Servlet一样,您可以通过为每个<servlet>声明分配不同的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模式,就可以了。