Обработка форм в веб-приложении для большинства веб-разработчиков напоминает хлеб с маслом. Это не будет много пользы, если мы не сможем захватить ввод данных пользователем и обработать его. Поэтому я включил простой FormServlet в мой пример сервлета3, который продемонстрировал несколько часто используемых входов форм, с которыми вы можете столкнуться. Вот как это выглядит:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
package zemian.servlet3example.web; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import zemian.service.logging.Logger; @WebServlet ( "/form" ) public class FormServlet extends HtmlWriterServlet { private static final Logger LOGGER = new Logger(FormServlet. class ); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HtmlWriter html = createHtmlWriter(req, resp); String message = getMessage(req); html.header() .h( 1 , "User Data Form" ) .p(message) .println( "<form method='post' action='form'>" ) .println( "<p/>Username: <input type='text' name='username'/>" ) .println( "<p/>Password: <input type='password' name='password'/>" ) .println( "<p/>Choose a country: <select name='country' size='1'>" ) .println( "<option default='true'>US</option>" ) .println( "<option>China</option>" ) .println( "<option>Korea</option>" ) .println( "</select>" ) .println( "<p/>Skills set: <input type='checkbox' name='skills' value='Java'/> Java" ) .println( "<input type='checkbox' name='skills' value='Java EE'/>Java EE" ) .println( "<input type='checkbox' name='skills' value='MySQL Database'/> MySQL Database" ) .println( "<p/>Notes: <textarea name='notes' cols='50' rows='3'></textarea>" ) .println( "<p/><input type='submit' value='Submit'/>" ) .println( "</form>" ) .println(html.link( "Back to Home" , "/index" )) .footer(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { LOGGER.info( "Processing form." ); Form form = new Form(); form.setUsername(req.getParameter( "username" )); form.setPassword(req.getParameter( "password" )); form.setNotes(req.getParameter( "notes" )); form.setCountry(req.getParameter( "country" )); String[] skills = req.getParameterValues( "skills" ); skills = (skills == null ) ? new String[ 0 ] : skills; form.setSkills(Arrays.asList(skills)); req.setAttribute( "message" , "Processed: " + form); doGet(req, resp); } private String getMessage(HttpServletRequest req) { String message = (String)req.getAttribute( "message" ); if (message == null ) { message = "" ; } return message; } } |
Как обычно, большинство форм отображаются с запросом http GET, а затем обрабатываются с помощью действия POST. Присмотритесь поближе и обратите внимание на то, как сервлет обрабатывает входные данные с единичными или множественными значениями. Они существуют, потому что форма HTML может позволить пользователям выбирать несколько значений из одного входного тега / виджета.
Один из распространенных шаблонов, который делают разработчики при обработке форм, — это захват входных данных в «объект команды», «объект переноса» или (в моем примере) объект «форма»; так что данные могут быть переданы на другой уровень вашего приложения для дальнейшей обработки. Это хороший дизайн, потому что он отделяет зависимости веб-слоя от сервисных уровней бэкэнд-уровня.
Другая часто встречающаяся область обработки форм — это проверка данных. Если вы захватите ваши данные как объект формы, то у вас, скорее всего, будет два уровня проверок. Один уровень — это когда вы извлекаете его сразу из http-запроса (обычно из ввода String), тогда вы можете проверить, является ли это обязательное поле или необязательным, является ли значение String конвертируемым в ожидаемый и желательный тип (целое число или дату и т. Д.). ). Второй уровень проверки может быть ниже на уровне службы, где у вас уже есть объект формы, построенный с правильными типами, но их значения могут быть недопустимыми в соответствии с требованиями вашего приложения. Наиболее распространенные недействительные данные связаны с тем, что они не соответствуют ограничениям базы данных и, следовательно, не могут их сохранить. Я не привел приведенный выше пример проверки, но вы можете легко улучшить сервлет и дополнительно изучить его самостоятельно.
Я хотел бы упомянуть еще одну заметку. Существует множество веб-фреймворков Java, которые уделяют большое внимание обработке форм, и они должны помочь вам легче разрабатывать приложения с меньшим количеством дублирующегося кода. Обычно это делается с очень конкретной моделью и стилем программирования, которые во многих случаях защищают вас от полного просмотра объекта HttpServletRequest. Все это хорошо (при условии, что фреймворк хорошего качества), но имейте в виду, что в большинстве случаев возникает проблема, в основном на уровне фреймворка или, что более вероятно, в вашем собственном коде, который использует фреймворк. И тогда вы будете тратить большую часть своего времени на отладку, изучая специфический для фреймворка домен, а не уровень спецификаций сервлета.
Для моего примера я стараюсь сосредоточиться только на EE API, поэтому я буду держаться подальше от любых дополнительных платформ, кроме стандартного API. Если вы новичок, я настоятельно рекомендую вам изучить API сервлетов и посмотреть, как обрабатывается форма, это дает вам более четкое представление о том, как поступают данные в веб-приложении. Если вы загляните дальше в стек Java EE, то на самом деле у него уже есть инфраструктура, которая называется JSF как часть стандартов EE 6. Это дизайн, чтобы помочь построить веб-страницы как модель компонентов; и это позволяет вам захватывать данные формы и автоматически связываться с объектом bean-компонента намного более плавным и интегрированным способом. JSF достойна своей темы для будущих сообщений.
Ссылка: | EE Servlet 3: Простая обработка форм от нашего партнера JCG Земьяна Дена в блоге A Programmer’s Journal . |