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