Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сессии в HttpServlet / 10 сообщений из 10, страница 1 из 1
22.06.2012, 10:33:11
    #37849795
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
Добрый день,

Начинаю изучать 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
22.06.2012, 10:50:44
    #37849820
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
Xsl ,
Сервлет конкретного типа обычно один на приложение. Но формально согласно спецификации конкретный контейнер может создавать больше одного инстанса сервлета, если сочтет это нужным. Поэтому сервлет всегда, абсолютно всегда, должен быть stateless - то есть не хранить в себе какие-либо изменяемые переменные или ссылки.

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

а так
Код: 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
22.06.2012, 10:52:40
    #37849825
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
Xsl,
логика сервлетов тупая до безобразия.
При запросе, сервер берёт поток, и запускает МЕТОД doGet.
На всё остальное ему по барабану.
...
Рейтинг: 0 / 0
22.06.2012, 12:14:25
    #37850037
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
Воспользовался приведенным примером:
Код: 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
22.06.2012, 12:16:19
    #37850041
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
XslВопрос... почему даже после перезагрузки сервера каунтер сохраняется?
А почему не должен? Сохранил все сессии на диск во время остановки. При запуске подчитал, чтобы юзеры продолжали работать с того же места.
...
Рейтинг: 0 / 0
22.06.2012, 12:18:02
    #37850052
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
XslВопрос... почему даже после перезагрузки сервера каунтер сохраняется?Разные могут быть варианты:
1) Может быть у вас что-то закешировалось в браузере, и он вместо отправки нового запроса на сервер, выдал вам результат из своего кеша
2) Может быть у вешго сервера стоит какой-нибудь shutdown hook, который сохраняет состяние сессии на диск при выключении, а при старте снова восстанаваливает. Маловероятно конечно, но все же.
...
Рейтинг: 0 / 0
22.06.2012, 12:25:51
    #37850069
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
интересный случай))
Если в СУБД мы гарантированно скажем что произойдёт при перезагрузке, то в АппСервере мы не можем сказать.
Хотя спецификаций - выше крыши.
...
Рейтинг: 0 / 0
22.06.2012, 12:45:30
    #37850118
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессии в HttpServlet
svenom1) Может быть у вас что-то закешировалось в браузере, и он вместо отправки нового запроса на сервер, выдал вам результат из своего кеша

Вы правы.

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

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


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