powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сессии в HttpServlet
10 сообщений из 10, страница 1 из 1
Сессии в HttpServlet
    #37849795
Xsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xsl
Гость
Добрый день,

Начинаю изучать JavaEE и начал с сервлетов.
В Eclipse создал "Dunamic Web Project", добавил сервлет с методами doGet и doPost.
В doGet добавил каунтер, который при каждом запросе возвращается клиенту.
Получилось вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
	private int count = 0;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		count++;
		response.getWriter().write("Counter is " + count);
	}
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		print("doPost()");
	}
...



Захожу на страницу через браузер, после каждого обновления каунтер растет.
Захожу на страницу с другого компьютера, каунтер не обнулился, а остался в том состоянии в котором я его оставил с первого раза.

Почему так? Переменная ведь не статическая.
Возможно это какие-то настройки сервера(использую Tomcat 7)?
Или мне необходимо при каждом запросе запускать отдельный поток с реализованной логикой для каждого отдельного запроса?

Заранее благодарен за помощь!
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37849820
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xsl ,
Сервлет конкретного типа обычно один на приложение. Но формально согласно спецификации конкретный контейнер может создавать больше одного инстанса сервлета, если сочтет это нужным. Поэтому сервлет всегда, абсолютно всегда, должен быть stateless - то есть не хранить в себе какие-либо изменяемые переменные или ссылки.

Вы же, скорее всего, хотите, что бы каунтер увеличивался для конкретного пользователя. Тогда вам нужно класть каунтер в сессию, а не в поле сервлета.
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37849821
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно тут ченить почитать

а так
Код: java
1.
2.
3.
4.
5.
6.
doGet(req, res) {
  Session ses = req.getSession();
  int count = ses.getAttr('count') == null ? 0 : ses.getAttr('count');
  ses.setAttr(++count);
  res.getWriter().write("Counter is " + count);
}
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37849825
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xsl,
логика сервлетов тупая до безобразия.
При запросе, сервер берёт поток, и запускает МЕТОД doGet.
На всё остальное ему по барабану.
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37850037
Xsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xsl
Гость
Воспользовался приведенным примером:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		HttpSession session = request.getSession();
		int counter = (Integer) (session.getAttribute("counter") == null ? 0
				: session.getAttribute("counter"));
		session.setAttribute("counter", ++counter);
		response.getWriter().write("Counter is " + counter);
	}



Вопрос... почему даже после перезагрузки сервера каунтер сохраняется?
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37850041
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XslВопрос... почему даже после перезагрузки сервера каунтер сохраняется?
А почему не должен? Сохранил все сессии на диск во время остановки. При запуске подчитал, чтобы юзеры продолжали работать с того же места.
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37850052
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XslВопрос... почему даже после перезагрузки сервера каунтер сохраняется?Разные могут быть варианты:
1) Может быть у вас что-то закешировалось в браузере, и он вместо отправки нового запроса на сервер, выдал вам результат из своего кеша
2) Может быть у вешго сервера стоит какой-нибудь shutdown hook, который сохраняет состяние сессии на диск при выключении, а при старте снова восстанаваливает. Маловероятно конечно, но все же.
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37850069
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересный случай))
Если в СУБД мы гарантированно скажем что произойдёт при перезагрузке, то в АппСервере мы не можем сказать.
Хотя спецификаций - выше крыши.
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37850118
Xsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xsl
Гость
svenom1) Может быть у вас что-то закешировалось в браузере, и он вместо отправки нового запроса на сервер, выдал вам результат из своего кеша

Вы правы.

Спасибо всем за помощь!
...
Рейтинг: 0 / 0
Сессии в HttpServlet
    #37850167
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XslВы правы.

Спасибо всем за помощь!
Если вы видите в браузере то что по вашему мнению быть не должно, нажмите Ctrl+F5.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сессии в HttpServlet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]