В прошлой статье Создание сервлетов для чайников. Пошаговое руководство я описал, как создать сервлеты и попытался объяснить, как это работает. В этой статье мы научим наши сервлеты работать с UI через HTTP-запросы GET и POST.
На самом деле, этих запросов намного больше, но для чистоты эксперимента мы разберём только два основных.
GET — обрабатывает адресную строку, которая получается при вызове сервлета. Например, site.com/example?action=test&id=10&admin=true
POST — обрабатывает загруженный контент (картинку, файл, строки, объектные данные
В Java-сервлете запросы POST и GET обрабатывают соответствующие методы doPost(); и doGet().
Для чистоты объяснения принципов обработки запросов мы создадим:
простой объект класса Bot, который будет иметь имя, серийник и id
страницу, на которую мы будем выводить данные объекта
страницу, на которой мы будем менять данные объекта
сервлет, который будет обрабатывать соответствующие запросы
Создаём класс Bot с тремя полями, а также, геттерами, сеттерами и перегруженным toString():
package ru.javawebinar.topjava.model;
/**
* Класс Bot.
*
* Created by promoscow on 26.07.17.
*/
public class Bot {
private Integer id;
private String name;
private String serial;
public Bot(String name, String serial, Integer id) {
this.name = name;
this.serial = serial;
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSerial() {
return serial;
}
public void setSerial(String serial) {
this.serial = serial;
}
@Override
public String toString() {
return "Bot{" +
"id=" + id +
", name='" + name + ''' +
", serial=" + serial +
'}';
}
}
Пометим сервлет в xml-документе web.xml:
botServlet
web.BotServlet
0
botServlet
/bot
Пишем вот такую страницу bot.jsp (пока просто копируем, потом разберём):
Bot info
ID: ${bot.id} | Name: ${bot.name} | Serial number: ${bot.serial}
обрабатывает аргумент «bot», при чём мы даём понять, что это объект класса Bot. ${bot.name} и прочие подобные — это переменные, которые мы берём из полученного в аргументе объекта (это будет в сервлете).
Отметим, что ссылка Update переводит на адрес bot?action=update содержит данные для GET-запроса.
Также, у нас будет страница, которая отправляет изменённые данные бота (update.jsp):
Мы также получаем данные бота и вставляем их в поля, меняем их и отправляем изменённые данные в POST-запросе. Отметим, что POST-запрос инициируется через отправку формы
, где method=«post» означает, что данные формы попадут в POST, а action=«bot?action=submit» означает, что после отправки формы произойдёт переход по адресу bot?action=submit
Разберём для наглядности одно поле формы:
По нажатию кнопки Save все введённые данные будут отправлены в метод doPost() нашего сервлета. В данной строчке, мы задаём новый id.
Имя атрибута формы: «id» (name=«id»), значение, которое мы передадим — поле id объекта bot (${bot.id}), также, мы вносим в поле имеющееся значение, полученное в атрибуте «bot» (placeholder="${bot.id}).
Поскольку задачей этой статьи является описание работы POST- и GET-запросов, я объясняю смысл кода строк вскользь. Более подробно атрибуты страниц можно изучить в Справочнике по HTML.
Ну и давайте добавим самую примитивную страницу index.html, содержащую единственную ссылку на страницу bot:
Сервлет содержит 3 метода: init(), doGet() и doPost().
init() — вызывается при первой инициализации сервлета и единожды исполняет написанный в нём код. В нашем случае, создаётся экземпляр класса Bot.
doGet() — обрабатывает запрос GET.
doPost() — обрабатывает запрос POST.
Теперь мы по цепочке пройдём логику выполнения приложения и разберём, что как работает.
Итак, загружаем проект в Tomcat. Перед нами — одинокая ссылка «Bot». Нажимаем её.
Мы переходим в сервлет BotServlet. Метод doGet() исполняется всегда (ведь адресная строка есть всегда), метод doPost() исполняется только по запросу (у нас он есть —