|
|
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
Добрый вечер! Возникла проблемка. Есть сервлет, который обрабатывает файл 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 00:18 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
response.sendRedirect(url) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 01:23 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
wstresponse.sendRedirect(url) это как бы в доке прочитанно я с логикой не могу разобраться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 01:31 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
Надо логики? Смысл в том, что браузер при обновлении страницы повторяет последний запрос, в том числе и POST. Причем еще и с теми же параметрами, отсюда дублирование данных. То есть после обработки поста надо сделать так, чтобы последним запросом было что-то еще, то есть GET, например. Для этого и отправляется редирект. forward же просто запускает обработчика для нового адреса в рамках исходного запроса. А значит проблема с повторным постом сохраняется. Вывод - меняем в коде из 1 поста форвард на редирект и дублирование данных при обновлении страниц прекратится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 09:52 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
wst, спасибо! суть понял) а вот с редиректом так и не допер. он вызывается на "респонсе" , на "реквесте" как у меня в посте он не вызывается. если заменить/добавить респонс вместо/после реквеста, то данные вообще не отправляются/томкат кидается ошибками всякими. можете хоть в пример какого-нибудь кода тыкнуть мне пальцем. потому что я реально не понимаю, столкнулся с этим первый раз, хотя эт опросто до ужаса скорее всего =( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:55 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
alex021, Я так понимаю происходит следущее 1. Есть некий bean в котором хранится сумма. Она отрисовывается на странице. 2. При неком событии к нему добавляется что-то из xml. 3. По перерисовке страницы вызывается событие 2. 4. Действий по обнулению bean не предусмотрено. Я что-то упустил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:08 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
Пишу с телефона, так что до вечера примера кода от меня не будет по причине не вполне удобного ввода. Общая мысль в том, что форвард это продолжение обработки одного и того же запроса, потому и доступ к функции идет через реквест. Редирект же это отправка HTTP кода 304 (или какого еще из 300-х), с сообщением что запрошенный ресурс надо искать в другом месте. То есть если код из первого поста работает, замена форварда на редирект в тот же адрес куда был форвард должна оставить его как минимум не менее рабочим. Примечание - форвард идет по путям внутри приложения (например, так можно сослаться на файл, заныканный в WEB-INF), а редиректить надо на полноценный урл, например request.contextroot() + путь на который форвардили. Примечание 2 - все вышенаписанное относится к случаю когда в doPost происходит обработка данных, а не вывод еще и результатов обработки. Если обработчик поста получает данные и выплевывает результат обработки - остается дергать этот сервлет через ajax. Или думать как разделить получение данных и возврат результата обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:54 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, -есть класс который хранит инфу -на index.jsp странице ,есть форма с мтеодом"пост" и кнопкой, при нажатии на которую из xml достается инфа и закидывается в мой класс. При это происходит вывод инфы на результирующей странице result.jsp. - так, получили вывод. теперь если тыкать обновление страницы result.jsp., то к уже имеющейся инфе , как я понял, опять вызывается метод по ихвлечению инфы и доабвляется рещультат на эту же страницу (было одна строчка, стало две, и тд +1 при каждом обновлении.) -ну и да. видимо действие по обнулению не предусмотренно =( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 13:20 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
wst, Код: java 1. 2. 3. 4. 5. 6. 7. 8. На странице index.jsp находится просто выпадающий список в котором указано каким, парсером разбирать xml, и фишка в том что при выборе одного все нормально, а с другим приосходит такая фигня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 13:54 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
Чуть было не предложил редиректить на result.jsp, но все-таки маловато данных для такого. Сначала вопросы: 1. В приложении 2 страницы index и result? 2. Парсеры xml сторонние? (Смысл вопроса - оценить возможность правки их обработчиков если что) 3. В какой момент и как именно выводится результат? Меня беспокоит мысль что объект с результатом могут просто запихивать в атрибут реквеста и в таком виде он может попадать к result.jsp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 14:43 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
wst, 1) да, в приложении две страницы основных, ну есть еще страница exception.jsp, которая выбрасывается если результат ноль и тд. но не думаю что она важна 2) нет, парсеры из стандартных библиотек (дом, сакс, стакс, на доме норм все работает) 3) Меня беспокоит мысль что объект с результатом могут просто запихивать в атрибут реквеста и в таком виде он может попадать к result.jsp. вот так именно и делается ..видимо это жесть? и так делать не надо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 15:03 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
Ничего страшного, в принципе, только грабли с дублированием POST-ов. Решения по возрастанию затрат времени. 1. Большие красные буквы "СТРАНИЦУ НЕ ОБНОВЛЯТЬ" 2. На каждый запрос создавать парсер заново, никаких кешей и синглтонов - это если те не пытаются хранить свое состояние еще где-то. 3. Посмотреть в сторону ajax. 4. Прочие методы от костылестроения до переработки приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 16:04 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
wst, спасибо, буду смотреть что делать вариант3,4 первый очень хардкорно) второй невериант, т.к. по условиям нужны синглтоны. а по поводу вот этого "Меня беспокоит мысль что объект с результатом могут просто запихивать в атрибут реквеста и в таком виде он может попадать к result.jsp." может быть можно тут с реквестами и респонсами сделать что либо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 21:49 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понял, что только один парсер от запроса к запросу не обнуляет данные? И он их не обнуляет только при обновлении страницы или еще и для нескольких разных xml-ей обработанных подряд выдает их все скопом? Я не против синглтонов вообще, но вот сам проблемный парсер можно (и, судя по поведению, нужно) пересоздавать на каждый запрос, хотя бы и в методе синглтона. По поводу сделать с реквестом - результат можно класть в doPost() в бин (когда command.execute отработает вынуть из реквеста атрибут с готовым результатом и засунуть в бин), выдавать редирект на result.jsp, а в result.jsp (или сопутствующем сервлете) уже результат выводить. Это не исправит косячного парсера, но избавит от напоминания браузера "послать заново данные формы?". P.S. Если используются стандартные библиотеки, то скорее виноват не парсер, а обвязка, его вызывающая, может там забыли подчистить данные между обращениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 22:25 |
|
||
|
Servlet/Redirect
|
|||
|---|---|---|---|
|
#18+
wst, "По поводу сделать с реквестом - результат можно класть в doPost() в бин (когда command.execute отработает вынуть из реквеста атрибут с готовым результатом и засунуть в бин), выдавать редирект на result.jsp, а в result.jsp (или сопутствующем сервлете) уже результат выводить. Это не исправит косячного парсера, но избавит от напоминания браузера "послать заново данные формы"." - так и попробую сделать сокрее всего, -ajax еще посмотрю, если я правильно понял этим можно просто запретить обновление страницы -еще код перебирать буду, может действительно чего подчистить где-нибудь забыл Спасибо огромное что возитесь тут) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 00:08 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38592469&tid=2127459]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
172ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 453ms |

| 0 / 0 |
