¿Es posible crear una aplicación web Java sin servlets?

Una aplicación web solo significa una aplicación que puede usarse sobre el protocolo HTTP. En el caso más simple (pero también el más difícil de implementar), solo debe ser capaz de aceptar conexiones TCP en el puerto 80, luego analizar la solicitud, redactar una respuesta y enviarla de vuelta.

En el caso menos simple, podría usar algo como inetd en Linux para hacer la conexión de red en entrada / salida estándar (los comandos para escribir en la consola y leer desde ella).

O, como sugirió Alan Mellor, puede hacer que un servidor web haga el manejo y análisis de la conexión por usted, y tome los parámetros que necesita sobre la entrada estándar (y envíe la respuesta sobre la salida estándar), como el funcionamiento de los scripts CGI.

En última instancia, HTTP es solo un protocolo basado aproximadamente en texto que se puede manejar de la manera que desee (no está realmente basado en texto, en realidad es un protocolo binario, pero en muchos casos puede tratarlo como basado en texto).

Algo divertido que puedes probar: si tienes telnet o netcat, y conoces el protocolo HTTP, ¡puedes navegar por la web sin un navegador web! Simplemente conéctese a algún servidor, escriba los encabezados, presione dos veces volver y lea la respuesta.

Algunos de los nuevos marcos de API web / RESTful para Java no utilizan servlets en absoluto.

Ratpack: aplicaciones HTTP esbeltas y potentes para JVM, utiliza Netty

El próximo lanzamiento de Spring 5 tiene el marco WebFlux que también puede usar diferentes adaptadores para Netty, o usar Servlets.

JSF 2.0 es el marco web predeterminado para Java EE 6. Es un marco flexible basado en componentes que facilita una arquitectura MVC. Tiene soporte AJAX listo para usar . Hay un montón de suites de componentes de terceros, la mejor por mucho es PrimeFaces.

A diferencia de las versiones anteriores, no utiliza JSP . Utiliza su propio servlet (FacesServlet) y viene con su propio motor de plantillas, facelets.

La especificación está avanzando. JSF 2.2 se incluirá en la especificación Java EE 7. Una actualización intermedia, JSF 2.1, se lanzó hace algún tiempo y ya está disponible en la última versión estable de GlassFish.

Lo que distingue a JSF 2 de JSP es que JSP debe aumentarse con marcos de terceros para proporcionar una arquitectura MVC, mientras que JSF 2 le ofrece la vista y las capas de controlador listas para usar. Combine eso con EJB, JPA y CDI (todo en Java EE 6) y no tendrá absolutamente ninguna necesidad de marcos de terceros como Spring, Struts o Wicket.

La mayoría de las aplicaciones web en las que he trabajado tienen un backend de Java que está completamente abstraído del front-end.

Es simplemente un servidor API que se ejecuta en algún lugar. Todo lo que tengo son las URL de cada API. Utilizo esas URL para hacer llamadas desde mi aplicación web front-end para realizar operaciones CRUD.

Entonces la respuesta es sí, es posible. Ni siquiera tiene que tocar los servlets.

Puede incrustar el servidor web de muelle en la aplicación, colocar un proxy detrás (nginx) para recursos estáticos en voila. Este es el enfoque utilizado en muchos idiomas, incluido Go.

Podría implementar un servidor HTTP en Java que también contendría la lógica de su aplicación.