Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Восстановить информацию в форме после неудачного сабмита / 22 сообщений из 22, страница 1 из 1
15.05.2007, 10:28:56
    #34525307
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Здравствуйте!
Web-приложение, основанное на сервлетах. Использую стандартный способ редактирования записи. Одна из JSP-страниц реализует форму для редактирования записи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
<FORM name="updateTransitForm" target="_parent" method="post" action="UpdateTransit">
...
<INPUT type="text" name="cmpcod" value="<%=transit.cmpcod%>"  size="1" maxlength="1"/>
...
<INPUT type="submit" name="submit" value="Добавить"/> 
<INPUT type="submit" name="submit" value="Изменить"/> 
<INPUT type="submit" name="submit" value="Удалить"/>
...
</FORM>
...
Пользователь вводит или изменяет кучу input-полей.
По сабмиту срабатывает сервлет, который анализирует информацию. Тут возникает исключение (изз-за некорректных данных, дублирования записи, ошибки доступа и т.д.), и сервлет отправляет на страницу с сообщением об ошибке. Пользователь понимает суть ошибки и возвращает предыдущую страницу с формой, чтобы сделать исправления. Но получается, что все его изменения не сохраняются и ему снова приходится вводить кучу input-полей.

Как при таком подходе восстанавливать изменения, сделанные пользователем? Может есть другой способ?

Заранее благодарен
С уважением, Семен Попов
...
Рейтинг: 0 / 0
15.05.2007, 10:48:11
    #34525390
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Struts
...
Рейтинг: 0 / 0
15.05.2007, 11:07:21
    #34525490
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Спасибо. Я поверхностно знакомился со Struts и понял, что они больше предназначены для анализа введенных данных. Это так? А если с данными все в порядке и при изменении записи возникает DuplicateKeyException или SQLException? Такую проверку можно запихать в Struts?
...
Рейтинг: 0 / 0
15.05.2007, 11:38:46
    #34525643
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
в него можно всё запихать

но это конечно не валидация ...
action может выполнять обновление базы, ловить exception, добавлять Message c ошибкой и снова форвардить на себя, в этом случае форма прибиваться не должна - значения должны остаться
...
Рейтинг: 0 / 0
15.05.2007, 11:49:40
    #34525696
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Спасибо. Попробую применить струтс
...
Рейтинг: 0 / 0
15.05.2007, 12:44:28
    #34525920
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
wicket ;)
...
Рейтинг: 0 / 0
15.05.2007, 13:26:51
    #34526106
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
- а сессии не пробовали использовать?

- если выводить сообщение об ошибке на той же странице что и форма, то и сессии не нужны :)
...
Рейтинг: 0 / 0
15.05.2007, 14:50:18
    #34526389
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Leonidvwicket ;)
А что это такое и с чем его едят?
...
Рейтинг: 0 / 0
15.05.2007, 14:57:06
    #34526410
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Kachalov- а сессии не пробовали использовать?
Сессии активно использую, но в этом случае нет. Думал, что есть вариант менее затратный.
Kachalov- если выводить сообщение об ошибке на той же странице что и форма, то и сессии не нужны :)
Т.е. я должен предусмотреть на странице с формой область для вывода текста ошибок, а затем ее обновлять после сабмита? Пока не представляю, как обновить только область страницы, а не всю. Никогда этого не делал. Если можно, выложите примерчик. Или дайте ссылку. Спасибо.
...
Рейтинг: 0 / 0
15.05.2007, 15:11:15
    #34526454
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Semen Popov Leonidvwicket ;)
А что это такое и с чем его едят?
И Struts, и Wicket это фреймворки для создания WEB-приложений на Java. Проблемы валидации данных в них решаются очень легко и изящно. Писать на голом JSP - изобретать велосипед для решения этих проблем.
...
Рейтинг: 0 / 0
15.05.2007, 15:16:22
    #34526472
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Semen PopovТ.е. я должен предусмотреть на странице с формой область для вывода текста ошибок, а затем ее обновлять после сабмита? Пока не представляю, как обновить только область страницы, а не всю. Никогда этого не делал. Если можно, выложите примерчик. Или дайте ссылку. Спасибо.

Я использую шаблон Model 2 и в случае ошибки обработки пришедших данных (происходит в controller-е) показываю примерно такую страницу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<body>
...
<%@include file="errors.jspf"%>
...
<form ...>
  ...
   <input type="text" name="i1" value="<%=request.getParameter("f1")%>">
   ...
</form>
</body>
- при выводе значений отправленных клиентов не забудьте преобразовать символы "<" и ">" в "<" и ">" соответственно. Здесь это преобразование опущено, но я думаю Вам не составит труда написать метод выполняющий такое преобразование.

Файл "errors.jspf" может выглядеть по разному в зависимости от того как Вы храните сообщения о произошедших ошибках. У меня сообщения лежат в массиве и вывод выглядит примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<%@page pageEncoding="UTF-8"%><% if (control.hasErrors()){%>
<table>
<%
    String[] errors=control.getErrors();
     for ( int  i= 0 ; i<errors.length; i++){
    %>
        <tr><td>error:</td><td><%=errors[i]%></td></tr>
    <%
    }
%>
</table><br>
<%}%>
...
Рейтинг: 0 / 0
15.05.2007, 15:23:38
    #34526495
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
LeonidvИ Struts, и Wicket это фреймворки для создания WEB-приложений на Java.
Спасибо. Почитаем.
...
Рейтинг: 0 / 0
15.05.2007, 15:54:05
    #34526605
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
KachalovЯ использую шаблон Model 2 и в случае ошибки обработки пришедших данных (происходит в controller-е) показываю примерно такую страницу:
<body>
...
<%@include file="errors.jspf"%>
...
Спасибо.
JSPF - это случаем не JSP Fragment? До этого момента не представлял, как он может использоваться. Насчет хранения ошибок и их представления понятно.
Только я все равно не догоняю, как в страницу, которую Вы показываете в случае ошибки попадают сделанные пользователем изменения информации? Из "request.getParameter("f1")" что ли?
Я понимаю, что есть JSP-форма. Одним фрагментом кода этой JSP является "<%@include file="errors.jspf"%>" - область для вывода ошибок. Когда пользователь вызывает форму, например для добавления записи, фрагмент errors.jspf пустой. После нажатия на сабмит происходит обработка в контроллере, в результате которой должна отобразиться (методами *.forward(req, resp); или *.sendRedirect(url);) эта же JSP-форма или уже другая JSP? Если эта же, то суть не меняется. Мы получим голую форму(без изменений пользователя), но с областью ошибок.
Я скорее чего-то недопонимаю, так что поправьте меня.
...
Рейтинг: 0 / 0
15.05.2007, 16:11:59
    #34526677
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Semen PopovJSPF - это случаем не JSP Fragment?
- да. Но никто не мешает обозвать подключаемый файл errors.jsp

Semen Popov
как в страницу, которую Вы показываете в случае ошибки попадают сделанные пользователем изменения информации? Из "request.getParameter("f1")" что ли?
- да. Если я правильно понял то что Вы хоите сделать - это при ошибочном вводе, показ формы поля которой уже заполнены данными введенными на предыдущем этапе?

Semen Popov
Я понимаю, что есть JSP-форма. Одним фрагментом кода этой JSP является "<%@include file="errors.jspf"%>" - область для вывода ошибок. Когда пользователь вызывает форму, например для добавления записи, фрагмент errors.jspf пустой.
- я использую шаблон Model 2, в котором контроллер сообщает диспетчеру запросов какое View показывать. Грубо говоря есть три JSP-страницы: 1-я просто форма, 2-я форма с выводом данных на случай ошибки и 3-я страница с сообщением что данные успешно добавлены. Но из экономии можно 1-ю и 2-ю страницы объеденить.
...
Рейтинг: 0 / 0
15.05.2007, 17:12:54
    #34526929
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Kachalov- да. Если я правильно понял то что Вы хоите сделать - это при ошибочном вводе, показ формы поля которой уже заполнены данными введенными на предыдущем этапе?
Именно так. Но только мне нужен не просто показ, но и сохранить функциональность показанной в результате ошибки формы, т.е., чтобы пользователь мог так же выполнять сабмит и в этой форме.
Kachalov- я использую шаблон Model 2, в котором контроллер сообщает диспетчеру запросов какое View показывать. Грубо говоря есть три JSP-страницы: 1-я просто форма, 2-я форма с выводом данных на случай ошибки и 3-я страница с сообщением что данные успешно добавлены. Но из экономии можно 1-ю и 2-ю страницы объеденить.
Что-то проглядывается. 1 JSP - это та форма, что я имею сейчас:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
<FORM name="updateTransitForm" target="_parent" method="post" action="UpdateTransit">
...
<INPUT type="text" name="cmpcod" value="<%=transit.cmpcod%>"  size="1" maxlength="1"/>
...
<INPUT type="submit" name="submit" value="Добавить"/> 
<INPUT type="submit" name="submit" value="Изменить"/> 
<INPUT type="submit" name="submit" value="Удалить"/>
...
</FORM>
...
Вторая - подобная, для работы с ней после сабмита в случае ошибки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<%@include file="errors.jspf"%>
...
<FORM name="updateTransitForm" target="_parent" method="post" action="UpdateTransit">
...
<INPUT type="text" name="cmpcod" value="<%=request.getParameter("cmpcod")%>"  size="1" maxlength="1"/>
...
<INPUT type="submit" name="submit" value="Добавить"/> 
<INPUT type="submit" name="submit" value="Изменить"/> 
<INPUT type="submit" name="submit" value="Удалить"/>
...
</FORM>
...
Третья - понятно.
1 и 2 можно объединить в одну, тогда один из фрагментов кода первой формы
Код: plaintext
1.
2.
3.
...
<INPUT type="text" name="cmpcod" value="<%=transit.cmpcod%>"  size="1" maxlength="1"/>
...
будет, например, таким:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
<% if (FormType== 1 )%>
<INPUT type="text" name="cmpcod" value="<%=transit.cmpcod%>"  size="1" maxlength="1"/>
<%} else { %>
<INPUT type="text" name="cmpcod" value="<%=request.getParameter("cmpcod")%>"  size="1" maxlength="1"/>
<%}%>
...
Конструкцию if можно навесить на весь блок <FORM>. Верно?
Спасибо.
...
Рейтинг: 0 / 0
15.05.2007, 17:34:18
    #34527038
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Semen Popov
Конструкцию if можно навесить на весь блок <FORM>. Верно?

- можно, также можно воспользоваться условным операторм, примерно так:

Код: plaintext
1.
<INPUT type="text" name="cmpcod" value="<%=(условие)?transit.cmpcod:request.getParameter("cmpcod")%>"  size="1" maxlength="1"/>
- тоько появляется дополнительная логика, которая усложняет View, а это не есть хорошо
...
Рейтинг: 0 / 0
15.05.2007, 17:40:27
    #34527073
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Спасибо
...
Рейтинг: 0 / 0
16.05.2007, 09:27:55
    #34528100
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Kachalov- тоько появляется дополнительная логика, которая усложняет View, а это не есть хорошо
А у меня вот такая идея назрела. Можно обойтись только второй JSP с формой. На странице со списком записей пользователь вызывает ссылку "Изменить":
Код: plaintext
1.
2.
3.
...
<A HREF="ShowTransitDetails?trnid=2" target="_parent">Изменить</A>
...
По нажатию срабатывает сервлет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 public   class  ShowTransitDetails  extends  HttpServlet {
    public   void  doGet(HttpServletRequest req, HttpServletResponse resp)  throws  ServletException, IOException {
                 ...
	       int  TrnId =  0 ;
	       try  {
		    TrnId = Integer.parseInt(req.getParameter("trnid"));
                 }  catch  (NumberFormatException exc) {
	  	    log("***Error, transit id must be a number");
 	      }
                 ...
                  try  {
                         Transit trn =  new  Transit(TrnId);
		    if  (TrnId!= 0 ) trn = Transit.findByID(TrnId);
                         ...
          	              req.setAttribute("cmpcod", ""+trn.cmpcod);
                         ...
     	              RequestDispatcher rd = getServletContext().getRequestDispatcher("/transitDetails.jsp");
       	              rd.forward(req, resp);
                 }  catch  (NoSuchObjectException e) {
			log("***Error, no find Transit", e);
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/noSuchTransit.jsp");
			rd.forward(req, resp);
       	      }  catch  (SQLException e) {
			log("***Error attempting to find Transit", e);
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/sqlError.html");
			rd.forward(req, resp);
                 }
	}
}
transitDetails.jsp - это второй вариант формы. Выражение req.setAttribute("cmpcod", ""+trn.cmpcod); играет решающую роль. Т.е. в HttpServletRequest мы уже закинем необходимые поля и их значения. А в форме значения будут инициализироваться не из объекта Transit, а из риквеста. Ну а дальше мы все уже рассматривали.
Проблема, возможно, будет в несоответствии логики форматирования данных в JSP и при ручном кодировании. Я, например, 100%-но еще не знаю как в JSP-инпутах преобразуются данные различных типов. Ведь value инпута - это строковое значение, а пихнуть мы туда можем значение любого типа.
Насколько такой вариант правильный?
...
Рейтинг: 0 / 0
16.05.2007, 11:59:48
    #34528672
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
- такой вариант плох тем, что он усложняет структуру взаимодействия View и Controller-а. Мне кажется логика их взаимодействия должна быть совершенно одинаковой для всех страниц сайта, в противном случае потом придется долго вспоминать, где и что делается. Но тут Вам решать. Прежде чем что то делать советую ознакомится (хотя бы в общих чертах) с логикой и принципами работы популярных у web-разработчиков фреймворков (типа Struts и т. п.), это позволит почерпнуть здравые идеи и более разумно организовать собственный код

- по вводу данных и их отображению: все что пользователь отправит через поля формы - это строки (единственное исключение это тэг input типа file, но это в любом случае отдельная песня), соответственно никаких проблем с выводом полученных от клиента данных назад в форму быть не должно
...
Рейтинг: 0 / 0
16.05.2007, 13:06:22
    #34528992
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Kachalov
- по вводу данных и их отображению: все что пользователь отправит через поля формы - это строки (единственное исключение это тэг input типа file, но это в любом случае отдельная песня), соответственно никаких проблем с выводом полученных от клиента данных назад в форму быть не должно
да кстати, а как поступать с файлами?
...
Рейтинг: 0 / 0
16.05.2007, 13:17:53
    #34529043
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
LINUXER
да кстати, а как поступать с файлами?
- как правило никак (можно увидеть в большинстве сайтов). Иногда если файл успешно загрузился а ошибка произошла в каком то другом поле, выводят чекбокс "заменить" рядом с полем для ввода файла. Если клиент не поставит галочку, то сохраняется уже загруженый ранее файл, а если поставит, то файл либо удалится, либо будет заменен новым.
...
Рейтинг: 0 / 0
16.05.2007, 14:45:45
    #34529399
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить информацию в форме после неудачного сабмита
Kachalov
- такой вариант плох тем, что он усложняет структуру взаимодействия View и Controller-а. Мне кажется логика их взаимодействия должна быть совершенно одинаковой для всех страниц сайта, в противном случае потом придется долго вспоминать, где и что делается. Но тут Вам решать. Прежде чем что то делать советую ознакомится (хотя бы в общих чертах) с логикой и принципами работы популярных у web-разработчиков фреймворков (типа Struts и т. п.), это позволит почерпнуть здравые идеи и более разумно организовать собственный код

В моем случае этот вариант сработает, но, конечно, необходимо следовать общим принципам web-программирования. Поэтому буду придерживаться рекомендациям специалистов. К сожалению, не всегда это удается, поскольку мало времени, и иногда на ум приходят совершенно бредовые, но рабочие рабочие идеи.
Kachalov
- по вводу данных и их отображению: все что пользователь отправит через поля формы - это строки (единственное исключение это тэг input типа file, но это в любом случае отдельная песня), соответственно никаких проблем с выводом полученных от клиента данных назад в форму быть не должно

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


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