【问题标题】:Servlet instances across multiple mappings跨多个映射的 Servlet 实例
【发布时间】:2012-03-24 03:51:54
【问题描述】:

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

【问题讨论】:

    标签: java jakarta-ee servlets


    【解决方案1】:
    <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 只使用一个实例 声明。但是,对于实现 SingleThreadModel接口,servlet容器可以实例化 多个实例来处理繁重的请求负载和序列化 对特定实例的请求。

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

    应该避免SingleThreadModel

    假设一个非分布式环境,发布的描述符片段会产生两个 servlet 实例。

    【讨论】:

      【解决方案2】:

      默认情况下servlets are not thread safe 除非你实现javax.servelt.SingleThreadModel (已弃用)

      许多容器为 servlet 创建一个实例。 ServletMapping 与将要创建的实例数量无关。 ServletMapping just map to the servlet defined using &lt;servlet&gt; tag.

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

      【讨论】:

      • 这种行为(为 web.xml 中指定的每个 Servlet 名称创建单独的实例)是否来自 Servlet 规范?为单独的映射创建单独的实例有什么好处?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-21
        • 2016-06-30
        • 2012-02-16
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 2015-03-01
        • 2015-01-29
        相关资源
        最近更新 更多