跨多个映射的Servlet实例

时间:2012-03-24 03:51:54

标签: java java-ee servlets

如果一个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>

3 个答案:

答案 0 :(得分: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   SingleThreadModel接口,servlet容器可以实例化   多个实例来处理繁重的请求加载和序列化   对特定实例的请求。

     

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

SingleThreadModel应该避免。

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

答案 1 :(得分:1)

默认情况下为servlets are not thread safe,除非您实施javax.servelt.SingleThreadModel (已弃用)

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

如果对于具有不同名称的同一servlet类,有多个<servlet>标记。是的,它将为该servlet创建多个实例。但现在当你有多个映射时。

答案 2 :(得分:0)

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