Первый сервлет
Сервлет — Java-класс, который принимает HTTP-запрос и формирует ответ. Это самый нижний уровень веба в Jakarta EE: на сервлетах построены и Jakarta REST, и Faces. Сегодня сервлеты редко пишут для каждой страницы, но понимать их нужно — так видно, как запрос вообще попадает в ваш код.
Создание сервлета
Создайте файл src/main/java/com/example/blog/HelloServlet.java:
// src/main/java/com/example/blog/HelloServlet.java
package com.example.blog;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("text/plain; charset=UTF-8");
response.getWriter().println("Привет от блога!");
}
}Класс наследует HttpServlet, а аннотация @WebServlet("/hello") привязывает его к адресу /hello внутри приложения. Метод doGet вызывается на каждый GET-запрос: он задаёт тип ответа и пишет текст через getWriter().
Проверка
Если сервер запущен командой liberty:dev, он подхватит новый класс сам. Откройте адрес в браузере или вызовите его через curl:
curl -i http://localhost:8080/blog/helloHTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Content-Length: 31
Привет от блога!
Полный адрес складывается из трёх частей: сервер localhost:8080, корень приложения /blog из server.xml и путь сервлета /hello.
Методы HTTP
Для каждого метода HTTP у HttpServlet есть свой метод-обработчик:
| Метод HTTP | Метод сервлета |
|---|---|
| GET | doGet |
| POST | doPost |
| PUT | doPut |
| DELETE | doDelete |
Переопределяйте только те, которые нужны. На остальные сервер ответит сам.
Шаблоны адресов
| Шаблон | Какие адреса подходят |
|---|---|
/hello | Только /hello |
/posts/* | /posts, /posts/1, /posts/1/edit |
*.txt | Любой адрес, который кончается на .txt |
Несколько адресов перечисляют в фигурных скобках: @WebServlet({"/hello", "/hi"}).
Жизненный цикл
Сервер создаёт один объект сервлета на всё приложение и вызывает его из разных потоков — по потоку на запрос. Поэтому в полях сервлета нельзя хранить данные конкретного запроса: два посетителя одновременно перезапишут значения друг друга. Всё, что относится к запросу, держите в локальных переменных метода.
Частая ошибка
Отправить запрос методом, который сервлет не обрабатывает. У HelloServlet есть только doGet, поэтому POST-запрос получит ответ 405 Method Not Allowed:
curl -i -X POST http://localhost:8080/blog/helloHTTP/1.1 405 Method Not Allowed
Если форма или клиент отправляет POST, добавьте в сервлет метод doPost.