Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Первый сервлет

Сервлет — 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/hello
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Content-Length: 31

Привет от блога!

Полный адрес складывается из трёх частей: сервер localhost:8080, корень приложения /blog из server.xml и путь сервлета /hello.

Методы HTTP

Для каждого метода HTTP у HttpServlet есть свой метод-обработчик:

Метод HTTPМетод сервлета
GETdoGet
POSTdoPost
PUTdoPut
DELETEdoDelete

Переопределяйте только те, которые нужны. На остальные сервер ответит сам.

Шаблоны адресов

ШаблонКакие адреса подходят
/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/hello
HTTP/1.1 405 Method Not Allowed

Если форма или клиент отправляет POST, добавьте в сервлет метод doPost.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.