Ну пойдем.
1) Сервлет - не аналог CGI, и не аналог PHP
Если уж говорить про аналоги, то ближе всего это FastCGI, но тоже очень далеко.
В отличии от CGI/FastCGI - это ресурс, который:
- имеет четко заданный жизненный цикл с сохранением состояний на приложение, сессию, запрос
- имеет ресурсы, передаваемые ему сервером приложения (авторизация, внешние ресурсы, ресурсы приложения, ресурсы запроса, ресурсы сессии)
- может включать в себя так называемые фильтры пре/пост обработки
- может взаимодействовать с ресурсами приложения и контейнера
В рамках сравнения с PHP, сервлет не имеет встроенного языка шаблонов. И прямой аналог этомы - JSP, которые компилируются перед исполнением в тот же сервлет.
2) Сервлет - строительный кирпичик для контейнеров web-приложений.
Другими словами, есть контейнер (web) приложений, который реализует жизненный цикл сервлетов и фактически является web-сервером, в котором и живут эти web-приложения, обмениваются ресурсами и их используют.
3) Напрямую на сервлетах сейчас достаточно редко пишут, хотя по быстрому набросать websocket очень даже можно. Обычно используют фреймфорки типа spring, javalin, jooby, vaadin, wicklets, tapesty и т.д. (их сотни под разные нужды и задачи!). Все эти фреймворки (библиотеки и обертки) делают удобным работу с API сервлетов, языками шаблонов (их тоже - десятки) и взаимедействием с ресурсами.
4) Кроме сервлетов, есть еще куча всего, что можно сделать без создания сервлета, но получить полноценный web (хотя внутри это все будет обернуто в сервлет скорее всего).
5) кроме сервлетов появились и новые фреймворки, расчитанные на микросервисы, и не обеспечивающие спецификацию сервлетов, например jooby, javalin и т.д.
Вот код простого, боевого, приложения, в котором уже есть web-сервер, держащий нагрузку в несколько тысяч RPS.
import io.javalin.Javalin;
public class HelloWorld {
public static void main(String[] args) {
Javalin app = Javalin.create().start(7000);
app.get("/", ctx -> ctx.result("Hello World"));
}
}