| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
... привожу код своей формы
... кстате еще один такой ньюанс... если я ввожу данные в форму русскими буквами... то в своем сервлете получаю вопросики... как это исправить... |
| Автор: 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 | ||
Надо всего лишь сделать в сервлете редирект на страницу с формой после записи в файл
В этом случае значения полей обнулятся. |
| Автор: 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() после выполнения всех нужных действий(запись в файл и тд) пишешь
при этом произойдёт редирект на тот же сервлет, но запрос будет обрабатываться методом doGet(), в котором ты должен сделать проверку существования параметра param1, и если он есть, прочитать данные из файла и вывести их. |
| Автор: PashaOvechkin 10.7.2007, 23:59 |
| Как кто то уже упмоянул... Помоему ету проблему можно решитй гораздо проще. При обновлении страницы вызывается метод ГЕТ. Значит в форме нужно установить метод ПОСТ. В сервлете пускай дуПост() делает генерацию чего то там. А дуГет... Хотя бы просто показывает ту же страничку заново. Ну или конечно редиретк поможет |
| Автор: batigoal 11.7.2007, 08:01 | ||
sith, просто редирект - это достаточно стандартный подход решения данной проблемы. К тому же, он поможет тебе лучше разделить логику и отображение.
Вот это и есть принципиальная ошибка. Зачем смешивать в одну кучу страничку отображения и сервлет записи? Лучше разделить - пусть определённый сервлет занимается обработкой форм, а страница - только выводит. Тогда ты просто поставишь в свою форму 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; } Естественно, перед выполнением действий, которые не должны повторяться, надо поставить проверку на рефреш ... |