только один экземпляр сервлета создается. Вот почему так важно не включать поля в ваш сервлет, которые используются в методах get
и post
. Переменная (класс) экземпляра класса внутри сервлета не является потокобезопасной и может быть изменена несколькими запросами, что приводит к неожиданному поведению.
Рассмотрим следующий пример:
ServletTest.java
@WebServlet("/ServletTest")
public class ServletTest extends HttpServlet {
private static final long serialVersionUID = 1L;
private Integer increment = 0;
public ServletTest() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(increment++);
}
}
test.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="ServletTest" method="post">
<button type="submit">Submit</button>
</form>
</body>
</html>
Если запустить этот пример и нажмите на кнопку отправки он будет печатать 0 на консоль. Последующие представления формы будут печатать 1, затем 2 и т. Д. Это доказывает, что сервлет - это тот же самый экземпляр.
Они более или менее инстанцируются один раз, но они * могут * быть загружены контейнером по разным причинам. Не по запросу, и это может измениться в более поздних спецификациях сервлета. –
Возможный дубликат [Разница между каждым экземпляром сервлета и каждым потоком сервлета в сервлетах?] (Http://stackoverflow.com/questions/2183974/difference-between-each-instance-of-servlet-and-each-thread -of-servlet-in-servle) –