Когда запускается сервлет контейнер:
web.xml
; Примерно, вроде этого:
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.
}
}
Нет, есть только один экземпляр сервлета, который повторно используется для нескольких запросов от нескольких клиентов. Это приводит к двум важным правилам:
синхронизированными
в сервлете (то же самое касается фильтров сервлетов и jsps)
Не могут быть несколько экземпляров класса сервлета. Даже когда есть один экземпляр сервлета, он способен обрабатывать несколько запросов. Так что мудро не использовать переменные классов уровня.