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

Есть сервлет, который обрабатывает файл xml.
есть страница jsp, которая показывает то, что удалось распарсить из XML.
проблема в следующем: если обновить страничку с результатом , то у меня прибавляется к результату ровно столько же данных, сколько распарсилось из XML, то есть если раза три обновить страницу с результатами, то получаем инфы в три раза больше, чем есть в файле.
А надо чтобы, если обновляешь страницу с результатами, кидало на начальную страницу (и сбрасывало данные), откуда делаем doPost при нажатии на кнопочку.

прогуглил, что эту проблему решает "redirect", но что-то не совсем понял как его прикрутить =( (если правильно прогуглил)
вот с этой строкой что-то надо наколдовать, если я правильно понимаю.
request.getRequestDispatcher(strForward).forward(request, response);
пытался делать по извращенному на всякие нули проверять и тд, аж стыдно говорить.

вот кусочек моего кода в сервлете
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
                AbstractCommand command;//разбирает xml
        try {
            command = FactoryCommand.buildCommand(request, response);// кнопка которая стартует разбор
            command.execute(request, response);//извлечение данных из XML
            String strForward = command.getForward(); //страница на которую отображается результат 
           //вот тут наколдовать у меня не получается =(
            request.getRequestDispatcher(strForward).forward(request, response);
        } catch (LogicalException ex) {
            LOG.warn("Exception in Servlet" + ex);
        }
    }

...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592469
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
response.sendRedirect(url)
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592471
alex021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wstresponse.sendRedirect(url)
это как бы в доке прочитанно
я с логикой не могу разобраться
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592607
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо логики? Смысл в том, что браузер при обновлении страницы повторяет последний запрос, в том числе и POST. Причем еще и с теми же параметрами, отсюда дублирование данных. То есть после обработки поста надо сделать так, чтобы последним запросом было что-то еще, то есть GET, например. Для этого и отправляется редирект.
forward же просто запускает обработчика для нового адреса в рамках исходного запроса. А значит проблема с повторным постом сохраняется.
Вывод - меняем в коде из 1 поста форвард на редирект и дублирование данных при обновлении страниц прекратится.
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592742
alex021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wst, спасибо! суть понял)
а вот с редиректом так и не допер.
он вызывается на "респонсе" , на "реквесте" как у меня в посте он не вызывается.
если заменить/добавить респонс вместо/после реквеста, то данные вообще не отправляются/томкат кидается ошибками всякими. можете хоть в пример какого-нибудь кода тыкнуть мне пальцем. потому что я реально не понимаю, столкнулся с этим первый раз, хотя эт опросто до ужаса скорее всего =(
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592757
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex021,

Я так понимаю происходит следущее

1. Есть некий bean в котором хранится сумма. Она отрисовывается на странице.

2. При неком событии к нему добавляется что-то из xml.

3. По перерисовке страницы вызывается событие 2.

4. Действий по обнулению bean не предусмотрено.

Я что-то упустил?
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592830
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу с телефона, так что до вечера примера кода от меня не будет по причине не вполне удобного ввода. Общая мысль в том, что форвард это продолжение обработки одного и того же запроса, потому и доступ к функции идет через реквест. Редирект же это отправка HTTP кода 304 (или какого еще из 300-х), с сообщением что запрошенный ресурс надо искать в другом месте. То есть если код из первого поста работает, замена форварда на редирект в тот же адрес куда был форвард должна оставить его как минимум не менее рабочим.
Примечание - форвард идет по путям внутри приложения (например, так можно сослаться на файл, заныканный в WEB-INF), а редиректить надо на полноценный урл, например request.contextroot() + путь на который форвардили.
Примечание 2 - все вышенаписанное относится к случаю когда в doPost происходит обработка данных, а не вывод еще и результатов обработки. Если обработчик поста получает данные и выплевывает результат обработки - остается дергать этот сервлет через ajax. Или думать как разделить получение данных и возврат результата обработки.
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592861
alex021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,
-есть класс который хранит инфу
-на index.jsp странице ,есть форма с мтеодом"пост" и кнопкой, при нажатии на которую из xml достается инфа и закидывается в мой класс. При это происходит вывод инфы на результирующей странице result.jsp.
- так, получили вывод. теперь если тыкать обновление страницы result.jsp., то к уже имеющейся инфе , как я понял, опять вызывается метод по ихвлечению инфы и доабвляется рещультат на эту же страницу (было одна строчка, стало две, и тд +1 при каждом обновлении.)
-ну и да. видимо действие по обнулению не предусмотренно =(
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592897
alex021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wst,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
//меняю следующую строку кода
request.getRequestDispatcher(strForward).forward(request, response);
//если заменить на это , то вообще не видит 
 response.sendRedirect( request.getContextPath()+"/web/index.jsp");
// вот так вот обработки данных не происходит и страницы index.jsp  просто обновляется
 response.sendRedirect( "index.jsp");
// если Вы имеет ввиду вот так заменить, то ..ну я видимо вообще валенок, редирект тут вообще не вызвать же
request.getRequestDispatcher(strForward).sendRedirect("index.jsp");



На странице index.jsp находится просто выпадающий список в котором указано каким, парсером разбирать xml, и фишка в том что при выборе одного все нормально, а с другим приосходит такая фигня
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38592973
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть было не предложил редиректить на result.jsp, но все-таки маловато данных для такого. Сначала вопросы:
1. В приложении 2 страницы index и result?
2. Парсеры xml сторонние? (Смысл вопроса - оценить возможность правки их обработчиков если что)
3. В какой момент и как именно выводится результат? Меня беспокоит мысль что объект с результатом могут просто запихивать в атрибут реквеста и в таком виде он может попадать к result.jsp.
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38593010
alex021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wst,
1) да, в приложении две страницы основных, ну есть еще страница exception.jsp, которая выбрасывается если результат ноль и тд. но не думаю что она важна
2) нет, парсеры из стандартных библиотек (дом, сакс, стакс, на доме норм все работает)
3) Меня беспокоит мысль что объект с результатом могут просто запихивать в атрибут реквеста и в таком виде он может попадать к result.jsp.
вот так именно и делается ..видимо это жесть? и так делать не надо)
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38593086
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего страшного, в принципе, только грабли с дублированием POST-ов.
Решения по возрастанию затрат времени.
1. Большие красные буквы "СТРАНИЦУ НЕ ОБНОВЛЯТЬ"
2. На каждый запрос создавать парсер заново, никаких кешей и синглтонов - это если те не пытаются хранить свое состояние еще где-то.
3. Посмотреть в сторону ajax.
4. Прочие методы от костылестроения до переработки приложения.
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38593354
alex021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wst,
спасибо, буду смотреть что делать
вариант3,4
первый очень хардкорно)
второй невериант, т.к. по условиям нужны синглтоны.

а по поводу вот этого
"Меня беспокоит мысль что объект с результатом могут просто запихивать в атрибут реквеста и в таком виде он может попадать к result.jsp."

может быть можно тут с реквестами и респонсами сделать что либо?
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38593375
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно ли я понял, что только один парсер от запроса к запросу не обнуляет данные? И он их не обнуляет только при обновлении страницы или еще и для нескольких разных xml-ей обработанных подряд выдает их все скопом? Я не против синглтонов вообще, но вот сам проблемный парсер можно (и, судя по поведению, нужно) пересоздавать на каждый запрос, хотя бы и в методе синглтона.

По поводу сделать с реквестом - результат можно класть в doPost() в бин (когда command.execute отработает вынуть из реквеста атрибут с готовым результатом и засунуть в бин), выдавать редирект на result.jsp, а в result.jsp (или сопутствующем сервлете) уже результат выводить. Это не исправит косячного парсера, но избавит от напоминания браузера "послать заново данные формы?".

P.S. Если используются стандартные библиотеки, то скорее виноват не парсер, а обвязка, его вызывающая, может там забыли подчистить данные между обращениями.
...
Рейтинг: 0 / 0
Servlet/Redirect
    #38593409
alex021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wst,
"По поводу сделать с реквестом - результат можно класть в doPost() в бин (когда command.execute отработает вынуть из реквеста атрибут с готовым результатом и засунуть в бин), выдавать редирект на result.jsp, а в result.jsp (или сопутствующем сервлете) уже результат выводить. Это не исправит косячного парсера, но избавит от напоминания браузера "послать заново данные формы"."
- так и попробую сделать сокрее всего,
-ajax еще посмотрю, если я правильно понял этим можно просто запретить обновление страницы
-еще код перебирать буду, может действительно чего подчистить где-нибудь забыл

Спасибо огромное что возитесь тут)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Servlet/Redirect
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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