2013-11-22 2 views
1

У меня есть сомнения относительно того, как создается сервлет. На самом деле у меня есть причины думать, что он устанавливается только один раз, когда приложение загружается или когда он получает первый запрос. И не один экземпляр для каждого запроса, который он получает. Может ли кто-нибудь прояснить это сомнение?Как работают экземпляры сервлета?

Причина в том, что класс сервлета имеет элемент «String var = null» и, похоже, имеет нулевое значение только в первый раз, когда он получает запросы.

Большое спасибо

+0

Они более или менее инстанцируются один раз, но они * могут * быть загружены контейнером по разным причинам. Не по запросу, и это может измениться в более поздних спецификациях сервлета. –

+0

Возможный дубликат [Разница между каждым экземпляром сервлета и каждым потоком сервлета в сервлетах?] (Http://stackoverflow.com/questions/2183974/difference-between-each-instance-of-servlet-and-each-thread -of-servlet-in-servle) –

ответ

3

только один экземпляр сервлета создается. Вот почему так важно не включать поля в ваш сервлет, которые используются в методах 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 и т. Д. Это доказывает, что сервлет - это тот же самый экземпляр.

1

Прошло некоторое время с тех пор, как я играл с сервлетами. Но вот экспериментальный подход. Почему бы вам не создать метод в вашем сервом (скажем, переопределить doGet).

В этом методе выполните следующие действия: System.out.println (this.hashCode()); или даже лучше System.out.println (this);

Затем сделайте GET-запросы к нему и посмотрите, что распечатано.

How do servlets work? Instantiation, sessions, shared variables and multithreading

Это также кажется полезным.

+0

Yea. Кажется, что до сих пор мы все согласны с тем, что сервлеты создаются только один раз или, по крайней мере, мы должны предположить, что когда мы их пишем. Я сомневался только в том, что я использовал поля в своих сервлетах. Интересно, может ли это быть очень плохой практикой. Большое спасибо за ваш ответ. – mdev

Смежные вопросы