Bot

Работа с сервлетами для чайников. GET / POST

В прошлой статье Создание сервлетов для чайников. Пошаговое руководство я описал, как создать сервлеты и попытался объяснить, как это работает. В этой статье мы научим наши сервлеты работать с UI через HTTP-запросы GET и POST.

На самом деле, этих запросов намного больше, но для чистоты эксперимента мы разберём только два основных.

  • GET — обрабатывает адресную строку, которая получается при вызове сервлета. Например, site.com/example?action=test&id=10&admin=true
  • POST — обрабатывает загруженный контент (картинку, файл, строки, объектные данные), в общем, всё, что можно передать через HTTP
  • простой объект класса Bot, который будет иметь имя, серийник и id
  • страницу, на которую мы будем выводить данные объекта
  • страницу, на которой мы будем менять данные объекта
  • сервлет, который будет обрабатывать соответствующие запросы
/** * Синглтон-класс Bot. * Для чистоты эксперимента это будет синглтон. * * Created by promoscow on 26.07.17. */ public class Bot < private Integer id; private String name; private String serial; private static Bot ourInstance = new Bot(); public static Bot getInstance() < return ourInstance; >private Bot() < >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 botServlet web.BotServlet 0  botServlet /bot 

Пишем вот такую страницу bot.jsp (пока просто копируем, потом разберём):

        

Bot info

ID: $ | Name: $ | Serial number: $ Update

Эта страница выводит нам данные бота.

обрабатывает аргумент «bot», при чём мы даём понять, что это объект класса Bot. $ и прочие подобные — это переменные, которые мы берём из полученного в аргументе объекта (это будет в сервлете).

Отметим, что ссылка Update переводит на адрес bot?action=update содержит данные для GET-запроса.

Также, у нас будет страница, которая отправляет изменённые данные бота (update.jsp):

       
ID:
" placeholder="$" />
Name:
" placeholder="$" />
Serial number:
" placeholder="$" />

Мы также получаем данные бота и вставляем их в поля, меняем их и отправляем изменённые данные в POST-запросе. Отметим, что POST-запрос инициируется через отправку формы

где method=«post» означает, что данные формы попадут в POST, а action=«bot?action=submit» означает, что после отправки формы произойдёт переход по адресу bot?action=submit

Разберём для наглядности одно поле формы:

По нажатию кнопки Save все введённые данные будут отправлены в метод doPost() нашего сервлета. В данной строчке, мы задаём новый id.

Ну и давайте добавим самую примитивную страницу index.html, содержащую единственную ссылку на страницу bot:

Мы закончили с jsp / html и можем перейти, наконец, к моему любимому Java-коду.

import model.Bot; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Bot Servlet class. * * Created by promoscow on 26.07.17. */ public class BotServlet extends HttpServlet < private Bot bot; @Override public void init(ServletConfig config) throws ServletException < super.init(); bot = new Bot("Amigo", "228274635", 1); >@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < System.out.println("Enter doGet"); String action = request.getParameter("action"); request.setAttribute("bot", bot); switch (action == null ? "info" : action) < case "update": request.getRequestDispatcher("/update.jsp").forward(request, response); break; case "info": default: request.getRequestDispatcher("/bot.jsp").forward(request, response); break; >> @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < System.out.println("Enter doPost"); request.setCharacterEncoding("UTF-8"); String action = request.getParameter("action"); if ("submit".equals(action)) < bot.setId(Integer.parseInt(request.getParameter("id"))); bot.setName(request.getParameter("name")); bot.setSerial(request.getParameter("serial")); >request.setAttribute("bot", bot); request.getRequestDispatcher("/bot.jsp").forward(request, response); > >

Сервлет содержит 3 метода: init(), doGet() и doPost().

init() — вызывается при первой инициализации сервлета и единожды исполняет написанный в нём код. В нашем случае, создаётся экземпляр класса Bot.

doGet() — обрабатывает запрос GET.

doPost() — обрабатывает запрос POST.

Теперь мы по цепочке пройдём логику выполнения приложения и разберём, что как работает.

Итак, загружаем проект в Tomcat. Перед нами — одинокая ссылка «Bot». Нажимаем её.

Мы переходим в сервлет BotServlet. Метод doGet() исполняется всегда (ведь адресная строка есть всегда), метод doPost() исполняется только по запросу (у нас он есть —

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < //просто выводим в консоль, что мы заходили в метод doGet System.out.println("Enter doGet"); //здесь мы уже начинаем работать с адресной строкой. в ссылке "bot?action=update" (bot.jsp, 20 строчка) после вопросительного знака идут пары ключ-значение, разделённые знаком &. у нас есть пара action=update. Вызываем значение (параметр) по ключу action, у нас это update и заносим результат в String. String action = request.getParameter("action"); //загодя вносим в запрос атрибут, при исполнении сервлета он будет отправлен в целевую строку. атрибут вносится вместе с ключом. в нашем случае, мы вносим объект bot со всеми его полями как атрибут и задаём ключ "bot", по которому мы потом вызовем данные объекта в jsp-странице request.setAttribute("bot", bot); switch (action == null ? "info" : action) < //если параметр имеет значение update (action=update), мы отправляемся на строку /update.jsp, где будем изменять данные бота (и отправляем туда атрибут bot) case "update": request.getRequestDispatcher("/update.jsp").forward(request, response); break; //если параметр пустой (action == null ? "info"), отправляемся на страницу bot.jsp, где мы увидим данные бота (и по дефолту тоже) case "info": default: request.getRequestDispatcher("/bot.jsp").forward(request, response); break; >>

Как видите, метод doGet() работает с адресной строкой, извлекает из неё атрибуты и обрабатывает их. Инструментарий метода doGet() велик, например, в строке может содержаться ?action=update&id=23847&admin=true (к примеру), мы можем извлечь id, отправить на доработку робота с полем id, равным 23847 и сделать его админом.

Поскольку в index.html атрибут адресной строки по ссылке имеет значение update, мы исполняем эту часть кода doGet():

request.setAttribute("bot", bot); request.getRequestDispatcher("/update.jsp").forward(request, response);

— добавляем атрибут с объектом bot и ключом «bot» и отправляем всё это на страницу /update.jsp

В странице update.jsp мы вносим новые значения в формы, соответствующие полям класса Bot и отправляем всё по адресу «bot?action=submit». Повторю — в этой статье не ставится задача разбирать тэги jsp/html, для этого есть Справочник по HTML.

Итак, мы нажимаем кнопку «Save». Поскольку форма содержит method=«post» action=«bot?action=submit», мы обрабатываем данные, полученные в форме, в методе doPost(). В этом методе можно как обрабатывать входящие данные, так и извлекать атрибуты адресной строки.

@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < System.out.println("Enter doPost"); //правилом хорошего кода будет задать кодировку UTF-8 — в метод могут приходить параметры, скажем, на кириллице (опять же, мы можем дать нашему боту кириллическое имя) request.setCharacterEncoding("UTF-8"); //извлекаем значение параметра action и сохраняем в Stiring, как мы это делали в методе doGet() String action = request.getParameter("action"); //если action=submit, назначаем нашему боту новые значения, которые мы получили в метод. это делается также, извлекая параметры. у каждого параметра из формы есть своё имя, по этому имени мы извлекаем значение (например, в разбираемой выше строчке формы update.jsp name="id" value=$мы задаём нашему боту новый id, извлекая его в строчке bot.setId(Integer.parseInt(request.getParameter("id"))); if ("submit".equals(action)) < bot.setId(Integer.parseInt(request.getParameter("id"))); bot.setName(request.getParameter("name")); bot.setSerial(request.getParameter("serial")); >//опять запихиваем объект bot в атрибут и возвращаемся на страницу /bot.jsp, где наблюдаем изменения request.setAttribute("bot", bot); request.getRequestDispatcher("/bot.jsp").forward(request, response); >

Вот и вся статья. Мы отработали в сервлете запросы POST и GET через соответствующие методы doPost() и doGet().

Целью статьи является создание понимания у начинающих разработчиков JavaEE, как работают запросы в сервлетах и по какой логике выстраивается работа с этими запросами в Java-коде.

Это вторая моя статья на тему сервлетов, запуск первого сервлета мы разбирали в статье Создание сервлетов для чайников. Пошаговое руководство

Источник

Читайте также:  Переменные php post пример
Оцените статью