Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > servlet и обновление страницы


Автор: sith 10.7.2007, 10:32
... появилась такая проблема...

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

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

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

Автор: ecologist 10.7.2007, 10:53
Так разве при "настоящей" отправке не нажимается какая-то кнопка ? На этот атрибут и ловить - если установлен параметр (для кнопки) - значит это пользователь нажал. Иначе - не нажал а просот обновил.

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

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

Автор: sith 10.7.2007, 12:26
... не работает...
... при обновлении страницы имя параметра и само значение его устанавливаемое в кнопке не пропадает...

Автор: sith 10.7.2007, 13:58
... привожу код своей формы


Код

    <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>


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

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

http://forum.vingrad.ru/forum/topic-66203/anchor-entry530693/0.html

Автор: batigoal 10.7.2007, 15:56
А траница у тебя доступна по УРЛу /BobsBandProj/guest или какому-то другому?

Автор: sith 10.7.2007, 16:45
... с кодировкой я разобрался...

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

Автор: fixxer 10.7.2007, 17:12
Попробуйте использовать метод POST

Или разделите отображение формы и ее обработку, например http://forum.juga.ru/showthread.php?s=&threadid=13591

Автор: check 10.7.2007, 23:01
Надо всего лишь сделать в сервлете редирект на страницу с формой после записи в файл
Код

response.sendRedirect("form.html");

В этом случае значения полей обнулятся.

Автор: sith 10.7.2007, 23:01
batigoal ... именно так...


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

response.sendRedirect(response.encodeRedirectURL(URL))

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

Автор: check 10.7.2007, 23:05
А, ну по ссылке, которую дал  fixxer как раз этот способ описан.

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

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

Добавлено через 1 минуту и 48 секунд
Перенаправляй на тот УРЛ, который тебе нужен...

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

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

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

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

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

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

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

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

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

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

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

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

Автор: sith 11.7.2007, 11:09
... ЗАПИСКИ С ФРОНТА...

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

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

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

Автор: IDVsbruck 18.9.2007, 01:53
Обойти повторное исполнение действий при обновлении страницы достаточно просто (старый дедовский способ):

в 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;
}

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)