Задача про «Написать сервлет, который будет обрабатывать запросы на /mirror»

На обучающей платформе Stepik я прохожу разные бесплатные курсы по программированию. Завершив с отличием «Java. Базовый курс» решил пройти курс «Разработка Web сервиса на Java (Часть 1)» восьмилетней давности. Простейшие серверы на фреймворках Питона и C# я уже запускал. Ну а про Java говорят, что backend для серьёзных приложений или систем чуть ли не основное её назначение. Начал смотреть лекции. Спикер объясняет теорию, практических заданий нет. Как всегда для него всё просто, для ученика по большей части непонятно. В конце 1 модуля супер задание «Написать сервлет, который будет обрабатывать запросы на /mirror».

Первые неудачные попытки написать сервлет

Лектор предлагает разработку вести в IDE IntelliJ IDEA от JetBrains. Хорошо. У меня стоит версия от 21 года и я в ней уже ранее что-то делал на Java и Kotlin. По опыту работы с разными продуктами от JetBrains можно ожидать любые сюрпризы. Во всех проектах используется много библиотек, версии которых постоянно обновляются и могут не «дружить» друг с другом. IDE сама много подсказывает, подключает и подгружает. Но в процессе компиляции могут вываливаться ошибки, которые иногда ставят в тупик. Если коротко, процесс сборки приложения даже по готовым исходникам не гарантирует результат. На лекциях процесс создания проекта был практически пропущен. Сказано только, что применим Maven. Там есть более 20-ти разновидностей готовых шаблонов (в моёй версии IDE). Про то, какой из них выбрать или не выбирать никакой сказано не было. Повторение за лектором результата не дало.

Далее были скачены проекты тестирующего приложения HW01 и пример автора с Github. Авторский пример не собирался — что-то опять с версиями зависимостей. Подставляя варианты из комментариев сервер запустить все же удалось. Но результат выполнения запроса был не совсем тот, потому что 2 метода выбрасывали исключения. Ну неужели всё так плохо? Как backend сервера всё-таки разрабатывают на Java?!

Реализация функционала сервера на фреймворке Spring

Погуглив по запросу «пример web сервер на java backend», я увидел статью «Пишем свой первый сервер на Java и Spring Boot«. Бегло просмотрев её, решил попробовать что-то повторить по неё. Как и в статье для создания Spring Boot проекта, перейдем на страницу https://start.spring.io/ и выбираем необходимую в нашем случае зависимость: Spring Web. Подробнее на рис. 1. 

spring initializer
Рис. 1 Инициализация фреймворка Spring

Проверяем или выставляем галочки по пункту 1. Кликаем по «ADD …» (п. 2) и выбираем из списка зависимость Spring Web (п. 3). Далее выбираем формат пакета Jar и нажимаем кнопку (п. 4) для генерации кода. В загрузках получаем папку проекта Demo. Копируем её куда Вам удобно, загружаем в IDE, компилируем и запускаем сервер. Как ни странно, всё компилируется и запускается с первого раза. В соответствии со статьей, создаем класс GreetingController и копируем в него код из блока ниже.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/greet")
public class GreetingController {

    @GetMapping
    public String greet() {
        return "Hello";
    }
}

Компилируем и запускаем ещё раз. Перейдя в браузере на страницу http://localhost:8080/greet, мы видим, как и ожидалось, hello ! Начало обнадёживает. Теперь по нашему заданию нужно сделать «зеркало» значения параметра «key». Добавляем ещё один класс MirrorController и пишем там код как в блоке ниже:

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mirror")
public class MirrorController {

    @GetMapping
    public String mirror(@RequestParam("key") String name) {
        return name;
    }
}

@RequestMapping(«/mirror«) будет обрабатывать запросы страницы mirror. В одноимённую функцию передаём значение параметра с именем «key» — переменная name. Как и положено зеркалу, функция возвращает строку name. Компилируем, запускаем сервер и переходим в браузер для проверки нужного запроса. Смотри рис. 2 ниже. Всё работает как надо: в запросе key=Alex (п. 1) и на странице тоже Alex (п. 2).

frontend
Рис. 2 Запрос и ответ сервера в браузере.

Итак, требуемый функционал сервера реализован. Далее начинаем выполнять инструкцию по реализации проверки.

Выполнение проверки и получение требуемого результата

Первое, что надо сделать, это добавить вывод строки «Server started» при запуске сервера. Это требование системы проверки. Добавим строку кода ниже в функции main после запуска сервера (смотри рис. 3 п. 2) .

java.util.logging.Logger.getGlobal().info("Server started");

Теперь после успешного запуска (порт 8080) (смотри рис. 3 п. 1) сервер выведет нужное сообщение (смотри рис. 3 п. 3).

Второе, что надо сделать, это собрать проект сервера в формате jar. Если Вы не знаете как это сделать, то можно воспользоваться рекомендациями статьи <Как создать исполняемый jar в Intellij IDEA>. В каталоге «out» после Build -> Build Artifact будет лежать файл demo.jar — исполняемый файл проекта нашего сервера. Смотри рис. 3 ниже (п. 4):

В соответствии с инструкцией переименовываем его в server.jar и копируем в каталог тестирующего проекта HW01. (смотри рис. 4 п. 1 и 3). В комментариях настоятельно рекомендуют увеличить задержку при старте до 8000 — сделаем это (смотри рис. 4 п. 2).

result testing
Рис. 4 Выполнение тестирующего приложения.

Третье и последнее. Запускаем tester.jar на выполнение. В консоли видим, что «Test passed» и копируем ключ-результат, чтобы вставить его в поле для ответа на платформе Stepik. Отправляем на проверку и получаем свои «законные» 53 балла !

Заключение

Возможно, плохой идеей было начать прохождение курса 8-ми летней давности. Последнее обновление было в 2023 году, но видео пока все старые. Если у Вас достаточно времени, то общение с IDE приносит много радости при преодолении всех её заморочек при неприятии старых проектов. Удачи в обучении !

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *