
Rife2 es un marco de pila, sin declaración, para crear aplicaciones web con Java moderna.
Rife2 se basa en los cimientos del marco original de Rife que fue popular desde 2002-2010. Desde entonces, el mundo y Java han cambiado y muchas de las API Rife originales finalmente podrían reemplazarse por Java Pure, No-XML, No-Yaml, dejando solo un código expresivo de tipo seguro.
Rife2 conserva la mayoría de las características originales y agrega otras nuevas, para una fracción de la huella y con una productividad de desarrollador aún mayor que antes. Rife2 es creado por Geert Bevin, uno de los primeros campeones y oradores de Java en muchas conferencias de Java.
Consejo: si usa la idea IntelliJ como su IDE, considere instalar el complemento Rife2 Idea.
Mejorará enormemente su experiencia de codificación.
Este es un tutorial rápido, la documentación completa contiene mucha más información.
Los Javadocs Rife2 complementan la documentación con muchos más detalles.
Una pregunta frecuente es: "¿Por qué elegir Rife2 sobre otros marcos populares"?
La respuesta corta es que RIFE2 es diferente , está diseñado para crear aplicaciones web rápidamente con equipos pequeños. Ha desafiado y siempre desafiará el status quo. No está destinado a reemplazar marcos de nivel empresarial como Spring o JEE, aunque lo he usado para aplicaciones empresariales. Rife2 aprovecha el poder de la plataforma Java para aplicaciones web que generalmente escribiría con idiomas de secuencias de comandos. La productividad y la capacidad de mantenimiento son clave, y encontrará que obtiene el 90% del trabajo realizado para el 10% del esfuerzo, y aún puede integrarse con otras bibliotecas y marcos de Java donde lo necesita.
Rife2 tiene características que después de 20 años aún no se pueden encontrar en otro lugar:
Continuaciones web, motor de plantilla bidireccional, sistema de metadatos centrados en frijoles, pila completa sin dependencias, constructores SQL basados en metadatos, marco de gestión de contenido, soporte de localización completa, abstracción de recursos, programador de cron persistido, motor de flujo de trabajo basado en continuaciones.
La mayoría de estas características han resistido la prueba del tiempo y después de 20 años todavía son excelentes opciones para el desarrollo de aplicaciones web. Rife2 ha aprendido de décadas de experiencia y mejora estas características originales de muchas maneras.
Rife2 también tiene características que han sido adoptadas por otros, pero que generalmente carecen de la conveniencia de la estrecha integración a lo largo de una pila completa.
For instance: out-of-container tests can analyze the structure of the resulting templates without having to parse HTML, the authentication system is built from all the other pieces of the full-stack and seamlessly integrates into your web application, URLs are generated from the configuration you created without the risk of becoming stale, the logic-less templates are really purely content driven and can generate any text-based format (JSON, XML, HTML, SVG, SQL), ... y mucho más.
Rife2 es la píldora roja , lista para mostrarle lo profundo que puede ir la madriguera del conejo, ¡si está preparado para ello!
Así es como comienzas con un sitio Hello World .
public class HelloWorld extends Site {
public void setup () {
get ( "/hello" , c -> c . print ( "Hello World" ));
}
public static void main ( String [] args ) {
new Server (). start ( new HelloWorld ());
}
} El método main gira el servidor de jetty integrado integrado, de modo que pueda comenzar inmediatamente a codificar. La misma clase HelloWorld se puede agregar como un valor de parámetro para su web.xml , lo que requiere cambios absolutos en su código entre el desarrollo y la producción.
Las pruebas fuera del contenedor son un ciudadano de primera clase en RIFE2, que interactúa directamente con su clase Site para simular las interacciones completas de respuesta a la respuesta, sin tener que girar un contenedor de servlet.
Así es como podría probar el ejemplo anterior con Junit 5:
class HelloTest {
@ Test void verifyHelloWorld () {
var m = new MockConversation ( new HelloWorld ());
assertEquals ( "Hello World" , m . doRequest ( "/hello" ). getText ());
}
}Uno de los aspectos más frágiles del desarrollo de aplicaciones web es escribir enlaces y URL como literales de texto, sin nada que garantice que sigan siendo correctos cuando sus rutas cambian o cuando implementa su aplicación en diferentes contextos de aplicaciones web. La API de enrutamiento de RIFE2 permite que todos sus enlaces de aplicación se generen correctamente sin ningún esfuerzo en su nombre.
Agreguemos una nueva ruta que contiene un enlace HTML hacia la ruta anterior de Hello World.
Puede ver que las rutas no tienen que crearse dentro del método setup() , pero también se puede crear como parte de la construcción de su Site , lo que permite almacenar las rutas en los campos.
public class HelloLink extends Site {
Route hello = get ( "/hello" , c -> c . print ( "Hello World" ));
Route link = get ( "/link" , c -> c . print ( "<a href='" + c . urlFor ( hello ) + "'>Hello</a>" ));
public static void main ( String [] args ) {
new Server (). start ( new HelloLink ());
}
}Ahora podemos probar esto como tal:
class HelloTest {
@ Test void verifyHelloLink () {
var m = new MockConversation ( new HelloLink ());
assertEquals ( "Hello World" , m . doRequest ( "/link" )
. getParsedHtml (). getLinkWithText ( "Hello" )
. follow (). getText ());
}
}El impulso principal que me hizo crear Rife2, fue el motor de plantilla único de Rife.
Las plantillas de Rife2 contienen dos conceptos principales:
Su código Java componerá el diseño final asignando y agregando bloques, y poniendo los datos en valores. Reescribamos el ejemplo HelloLink anterior con una plantilla.
En este ejemplo, todavía no se realiza la manipulación de la plantilla en Java.
En su lugar, presenta la etiqueta de valor {{v route:hello/}} , que se reemplazará automáticamente con la URL de la ruta disponible con ese nombre de campo en su Site activo.
public class HelloTemplate extends Site {
Route hello = get ( "/hello" , c -> c . print ( "Hello World" ));
Route link = get ( "/link" , c -> c . print ( c . template ( "HelloTemplate" )));
public static void main ( String [] args ) {
new Server (). start ( new HelloTemplate ());
}
} Con HelloTemplate.html siendo:
<!DOCTYPE html >
< html lang =" en " >
< body >
< a href =" {{v route:hello/}} " > Hello </ a >
</ body >
</ html >Tenga en cuenta que Rife2 transforma internamente sus plantillas en clases de Java generando bytecode optimizado.
Esto sucede sobre la marcha durante el desarrollo. Para la producción, las plantillas pueden ser precompiladas, lo que las hace increíblemente rápidas.
Cambiemos el ejemplo un poco más y creemos una ruta única que pueda responder a las solicitudes de get y post .
get mostrará un formulario con un solo botón para hacer clic.post recibirá el envío y la pantalla del formulario Hello World . public class HelloForm extends Site {
Route hello = route ( "/hello" , c -> {
var t = c . template ( "HelloForm" );
switch ( c . method ()) {
case GET -> t . setBlock ( "content" , "form" );
case POST -> t . setBlock ( "content" , "text" );
}
c . print ( t );
});
public static void main ( String [] args ) {
new Server (). start ( new HelloForm ());
}
} Con HelloForm.html siendo:
<!DOCTYPE html >
< html lang =" en " >
< body >
<!--v content/-->
<!--b form-->
< form action =" {{v route:action:hello/}} " method =" post " name =" hello " >
<!--v route:inputs:hello/-->
< input type =" submit " name =" Submit " >
</ form >
<!--/b-->
<!--b text--> < p id =" greeting " > Hello World </ p > <!--/b-->
</ body >
</ html >Nota: Que la etiqueta
route:Valor de lo anterior se ha dividido enroute:action:yroute:inputs:, Generación de entradas de formulario HTML ocultas para parámetros en lugar de parámetros de cadena de consulta.
Puede ver que la plantilla contiene todas las piezas para crear ambas páginas:
contentformtextEn Java, simplemente asignamos cualquier bloque al valor, dependiendo de lo que queramos mostrar.
Otro beneficio es que las etiquetas de plantilla de Rife2 pueden ser comentarios HTML, haciéndolas completamente invisibles. Esto le permite trabajar en su diseño HTML como de costumbre y obtener una vista previa del archivo de plantilla con un navegador normal.
Finalmente, incluamos una prueba para esta funcionalidad:
class HelloTest {
@ Test void verifyHelloForm () {
var m = new MockConversation ( new HelloForm ());
var r = m . doRequest ( "/hello" ). getParsedHtml ()
. getFormWithName ( "hello" ). submit ();
assertEquals ( "Hello World" , r . getParsedHtml ()
. getDocument (). body ()
. getElementById ( "greeting" ). text ());
}
}¡Gracias por leer hasta el final!
Esta fue simplemente una introducción rápida a su apetito, Rife2 viene con un manual integral y fácil de leer con muchos ejemplos y explicaciones pragmáticas.
Si tiene alguna pregunta, sugerencia, ideas o simplemente quiere chatear, no dude en publicar en los foros o unirse a nosotros en Discord.
Lea más en la documentación completa y Javadocs Rife2.