Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> servlet и обновление страницы, отменить повторный запуск 
V
    Опции темы
sith
Дата 10.7.2007, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



... появилась такая проблема...

... есть страница с формой... пользователь вводит данные нажимает отправить и подчиненный сервлет записывает эти данные в файл...  и возвращает страницу со всем данными которые в файле были записанны...

... в процессе отладки обнаружилось очень неприятное дело... при нажатии кнопки обновить страницу сервлет опять запускаеться и дописывает повторные данные.... и так может быть до безконечности... 

... вопрос... как избежать этот баг... 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
ecologist
Дата 10.7.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 5
Всего: 9



Так разве при "настоящей" отправке не нажимается какая-то кнопка ? На этот атрибут и ловить - если установлен параметр (для кнопки) - значит это пользователь нажал. Иначе - не нажал а просот обновил.
PM MAIL   Вверх
batigoal
Дата 10.7.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Приведи код своей формы. Я полагаю, ты не используешь атрибут action у формы, а оставляешь его дефолтовым (текущая страница). Это так?

Это сообщение отредактировал(а) batigoal - 10.7.2007, 12:18


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ekr
Дата 10.7.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 12
Всего: 19



Используй шаблон проектирования Маркер Синхронизации.
К слову, в struts это называется transaction token, если struts используешь.


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
sith
Дата 10.7.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



... не работает...
... при обновлении страницы имя параметра и само значение его устанавливаемое в кнопке не пропадает...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
sith
Дата 10.7.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



... привожу код своей формы


Код

    <form action="/BobsBandProj/guest">
          <center>
<PRE>   Имя           <input type="text" name="name" size="30">
    E-mail             <input type="text" name="e-mail" size="30">
    Город              <input type="text" name="city" size="30">
    ДОмашняя страница  <input type="text" name="home" value="http:\\" size="30">
    
Текст
               <textarea cols="25" rows="10" name="text"></textarea>
    <input type="hidden" name="type" value="write">
    </PRE>
              
              
              
              <br><hr width="500" size="3"style="color=#E9B10A"></center>
             <center>  <input type="submit" name="act" value="ОТправить"><input type="reset" value="Очистить">
              
          </form>


... кстате еще один такой ньюанс... если я ввожу данные в форму русскими буквами... то в своем сервлете получаю вопросики... как это исправить...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
Maksym
Дата 10.7.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Цитата(sith @  10.7.2007,  13:58 Найти цитируемый пост)
.. кстате еще один такой ньюанс... если я ввожу данные в форму русскими буквами... то в своем сервлете получаю вопросики... как это исправить...

тут
PM MAIL   Вверх
batigoal
Дата 10.7.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



А траница у тебя доступна по УРЛу /BobsBandProj/guest или какому-то другому?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
sith
Дата 10.7.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



... с кодировкой я разобрался...

... а как избавиться от проблемы с обновлением страницы...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
fixxer
Дата 10.7.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 4
Всего: 27



Попробуйте использовать метод POST

Или разделите отображение формы и ее обработку, например тут

Это сообщение отредактировал(а) fixxer - 10.7.2007, 17:14


--------------------
user posted image
PM MAIL ICQ   Вверх
check
Дата 10.7.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Надо всего лишь сделать в сервлете редирект на страницу с формой после записи в файл
Код

response.sendRedirect("form.html");

В этом случае значения полей обнулятся.
PM MAIL   Вверх
sith
Дата 10.7.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



batigoal ... именно так...


fixxer я не все понял в этой статье а особенно куда всунуть этот 

response.sendRedirect(response.encodeRedirectURL(URL))

и что поставить вместо URL


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
check
Дата 10.7.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



А, ну по ссылке, которую дал  fixxer как раз этот способ описан.
PM MAIL   Вверх
sith
Дата 10.7.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



...а нельзя как то сдлеать что бы все таки я остался на той страничке... ведь получаеться так... что пльзователь выбирает... смотреть данные или записать... выбирает записать... и после всего ему опять предлогают записать... ему нужно возвращаться назад... это мне кажеться не очень красиво...
... было бы лутше если бы форма отправила данные... сервлет отработал их... вернул страничку и обнулил параметры...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
check
Дата 10.7.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



response.sendRedirect нужно вставить после выполнения записи в файл, т.е. сервлет,
сделав сделав свое дело должен перенаправить браузер на исходную страницу(или на какую-то другую страницу, какую ты посчитаешь нужным). Методу sendRedirect нужно передать УРЛ этой страницы.

Добавлено через 1 минуту и 48 секунд
Перенаправляй на тот УРЛ, который тебе нужен...
PM MAIL   Вверх
sith
Дата 10.7.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



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


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
check
Дата 10.7.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Можно так:  обработку параметров пришедших из формы делай в методе
doPost().  Значит и форму нужно соответственно отправлять методом POST.

Вывод данных из файла помести в метод doGet().  
В doPost() после выполнения всех нужных действий(запись в файл  и тд) пишешь
Код

response.sendRedirect("/BobsBandProj/guest?param1");

при этом произойдёт редирект на тот же сервлет,  но запрос будет обрабатываться методом doGet(),  в котором ты должен сделать проверку существования параметра param1, и если он есть,  прочитать данные из файла и вывести их.

PM MAIL   Вверх
PashaOvechkin
Дата 10.7.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 1
Всего: 4



Как кто то уже упмоянул...
Помоему ету проблему можно решитй гораздо проще.
При обновлении страницы вызывается метод ГЕТ.

Значит в форме нужно установить метод ПОСТ.

В сервлете пускай дуПост() делает генерацию чего то там.
А дуГет... Хотя бы просто показывает ту же страничку заново.

Ну или конечно редиретк поможет smile

Это сообщение отредактировал(а) PashaOvechkin - 11.7.2007, 00:05
PM MAIL Skype   Вверх
batigoal
Дата 11.7.2007, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



sith, просто редирект - это достаточно стандартный подход решения данной проблемы. К тому же, он поможет тебе лучше разделить логику и отображение.

Цитата(sith @  11.7.2007,  00:48 Найти цитируемый пост)
... что сервлет читает форму... записывает данные в файл... и тут же выводит эти данные на экран... 

Вот это и есть принципиальная ошибка. Зачем смешивать в одну кучу страничку отображения и сервлет записи? Лучше разделить - пусть определённый сервлет занимается обработкой форм, а страница - только выводит. Тогда ты просто поставишь в свою форму action="/BobsBandProj/SomeServlet">, a в нем уже сделаешь редирект на guests.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
sith
Дата 11.7.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



... ЗАПИСКИ С ФРОНТА...

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

... приму к сведенью ваши умные вещи о разделении добавления записей в их просмотр... полностью с этим согласен но в этом варианте исполнения так уже и останеться...

... всем большое спасибо... пока что проблема решена... будут новые... обязательно сообщу...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
IDVsbruck
Дата 18.9.2007, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



Обойти повторное исполнение действий при обновлении страницы достаточно просто (старый дедовский способ):

в jsp-страничке до <html> (в заголовке):
<% String randomStr = String.valueOf((new java.util.Random()).nextInt()); session.setAttribute("sessionAttr", randomStr); %>

в форме, которая отправляется, добавить скрытый элемент:
<input type="hidden" name="formAttr" value="<%= randomStr %>"/>

А в сервлете делаем проверку:
String sessionAttr = (String) _request.getSession().getAttribute("sessionAttr");
String formAttr = _request.getParameter("formAttr");
if (sessionAttr != null && formAttr != null) {
    if (!sessionAttr.equals(formAttr)) {
        refresh = false;
    } else refresh = true;
}

Естественно, перед выполнением действий, которые не должны повторяться, надо поставить проверку на рефреш ... 


Это сообщение отредактировал(а) IDVsbruck - 18.9.2007, 01:56
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1102 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.