2012-03-24 65 views
1

如果一个Servlet被映射两次,使用两个不同的名称(如下图所示)容器将创建多少个Servlet实例?跨多个映射的Servlet实例

一个实例或两个,或者是集装箱依赖?

<servlet> 
    <servlet-name>servlet1</servlet-name> 
    <servlet-class>com.me.servlet.MyServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>servlet1</servlet-name> 
    <url-pattern>/page1.html</url-pattern> 
</servlet-mapping> 


<servlet> 
    <servlet-name>servlet2</servlet-name> 
    <servlet-class>com.me.servlet.MyServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>servlet2</servlet-name> 
    <url-pattern>/page2.html</url-pattern> 
</servlet-mapping> 

回答

2
<servlet> 
    <servlet-name>FooServlet</servlet-name> 
    <servlet-class>foo.FooServlet</servlet-class> 
    <init-param> 
     <param-name>foo</param-name> 
     <param-value>bar</param-value> 
    </init-param> 
</servlet> 

由于每个Servlet都有自己的configuration,必须有每个servlet定义至少一个servlet实例。

Servlet 3.0 specification说:

对于在分布式环境中(默认值)不举办一个servlet, servlet容器必须按servlet的 声明只使用一个实例。但是,对于实现接口的servlet,servlet容器可以实例化多个实例来处理沉重的请求负载并将请求序列化到特定实例。

在一个servlet部署标示在部署描述符为分布式应用程序 的一部分的情况下,一个容器可以 每个Java虚拟机 每有servlet的声明只有一个实例(JVM™)。但是,如果可分发应用程序 中的servlet实现了SingleThreadModel接口,则容器可能在 容器的每个JVM中实例化该servlet的多个实例。

SingleThreadModel应该避免。

假设非分布式环境,发布的描述符片段将导致两个servlet实例。

0

它很可能取决于servlet容器的实现。无论你打算做什么,你应该假设你的servlet的一个实例将被多个线程同时访问,无论你的servlet映射配置如何。

1

默认情况下servlets are not thread safe除非实现javax.servelt.SingleThreadModel(这是不建议使用)

许多容器为servlet创建单个实例。 ServletMapping与创建的实例数量无关。 ServletMapping just map to the servlet defined using <servlet> tag

如果您为具有不同名称的相同servlet类使用多个<servlet>标记。是的,它会为该servlet创建多个实例。但是现在当你有多个映射时。

+0

这是否行为(在web.xml中指定的每个Servlet的名称创建单独的实例)来自Servlet规范?为单独的映射创建单独的实例有什么好处? – siva636 2012-03-24 09:00:24