Различие между каждым экземпляром сервлета и каждым потоком сервлета в сервлетах? [дубликат]

83
задан Ashwin 17 May 2012 в 14:16
поделиться

3 ответа

Когда запускается сервлет контейнер:

  1. чтения web.xml ;
  2. находит объявленные сервлеты в классе; и
  3. нагрузки и инстанцирует каждый сервлет только один раз .

Примерно, вроде этого:

String urlPattern = parseWebXmlAndRetrieveServletUrlPattern();
String servletClass = parseWebXmlAndRetrieveServletClass();
HttpServlet servlet = (HttpServlet) Class.forName(servletClass).newInstance();
servlet.init();
servlets.put(urlPattern, servlet); // Similar to a map interface.

Эти сервлеты хранятся в памяти и повторно используются каждый раз, когда URL-адрес запроса соответствует ассоциированию сервлета URL-шаблона . Контейнер сервлета, затем выполняет код, аналогичный:

for (Entry<String, HttpServlet> entry : servlets.entrySet()) {
    String urlPattern = entry.getKey();
    HttpServlet servlet = entry.getValue();
    if (request.getRequestURL().matches(urlPattern)) {
        servlet.service(request, response);
        break;
    }
}

Сервис Genericsevled # Service () на свою очередь решает, что из Doget () , Допост () и т. Д. Призывает на основе httpservletrequest # getmethod () .

Видите ли вы, сервлетный элемент повторно использует тот же экземпляр сервлета для каждого запроса. Другими словами: сервлеты разделяются между каждый запрос . Вот почему чрезвычайно важно писать код сервлета Threadsafe манера - что на самом деле простой: просто делайте не Назначьте запрос или сеанс навесные данные в качестве переменных экземпляров сервлета, но так же как метод локальных переменных. Например.

public class MyServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}
186
ответ дан 24 November 2019 в 08:43
поделиться

Нет, есть только один экземпляр сервлета, который повторно используется для нескольких запросов от нескольких клиентов. Это приводит к двум важным правилам:

  • не используйте переменные экземпляра в сервлете, за исключением значений для всего приложения, которые чаще всего получаются из параметров контекста.
  • не делают методы синхронизированными в сервлете

(то же самое касается фильтров сервлетов и jsps)

30
ответ дан 24 November 2019 в 08:43
поделиться

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

5
ответ дан 24 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: