Экземпляры сервлета в нескольких сопоставлениях - PullRequest
1 голос
/ 24 марта 2012

Если один сервлет отображается дважды, используя два разных имени (как показано ниже), сколько экземпляров сервлета будет создано контейнером?

Один экземпляр или два, или это зависит от контейнера?

<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 ]

2 голосов
/ 24 марта 2012
<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 3.0 гласит:

Для сервлета, не размещенного в распределенной среде (по умолчанию), контейнер сервлета должен использовать только один экземпляр на сервлет декларация . Однако для сервлета, реализующего SingleThreadModel интерфейс, контейнер сервлета может быть создан несколько экземпляров для обработки тяжелой загрузки запросов и сериализации запросы к конкретному экземпляру.

В случае, когда сервлет был развернут как часть приложения помеченный в дескрипторе развертывания как распространяемый, контейнер может иметь только один экземпляр на объявление сервлета на виртуальную Java Машина (JVM ™). Однако, если сервлет в распространяемом приложении реализует интерфейс SingleThreadModel, контейнер может создать несколько экземпляров этого сервлета в каждой JVM контейнер.

SingleThreadModel следует избегать.

Предполагая, что в нераспределенной среде фрагмент размещенного дескриптора приведет к двум экземплярам сервлета.

1 голос
/ 24 марта 2012

По умолчанию servlets are not thread safe, если не реализовано javax.servelt.SingleThreadModel (что устарело) .

Многие контейнеры создают один экземпляр для сервлета.ServletMapping не имеет ничего общего с количеством экземпляров, которые будут созданы.ServletMapping just map to the servlet defined using <servlet> tag.

Если у вас есть несколько тегов <servlet> для одного и того же класса сервлета с разными именами.Да, он создаст несколько экземпляров для этого сервлета.Но теперь, когда у вас есть многократные отображения.

0 голосов
/ 24 марта 2012

Скорее всего, это будет зависеть от реализации контейнера сервлета.Что бы вы ни собирались делать, вы должны предполагать, что один экземпляр вашего сервлета будет доступен сразу нескольким потокам, независимо от ваших конфигураций отображения сервлета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...