如果一个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>
答案 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(默认), 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映射配置如何。