
Rife2 est un cadre complet, sans déclaration, pour créer rapidement et sans effort les applications Web avec Java moderne.
Rife2 est construit sur les fondements du cadre original de rif qui était populaire de 2002 à 2010. Depuis lors, le monde et le java ont changé et de nombreuses API rives originales pourraient enfin être remplacées par du java pur, no-xml, no-yaml, ne laissant que du code expressif de type type.
Rife2 conserve la plupart des fonctionnalités d'origine et en ajoute de nouvelles, pour une fraction de l'empreinte et avec une productivité des développeurs encore plus grande qu'auparavant. Rife2 est créé par Geert Bevin, l'un des premiers champions et conférenciers de Java lors de nombreuses conférences Java.
Astuce: Si vous utilisez IntelliJ Idea comme IDE, envisagez d'installer le plug-in Rife2 Idea.
Cela améliorera considérablement votre expérience de codage.
Ceci est un tutoriel rapide, la documentation complète contient beaucoup plus d'informations.
Les Javadocs Rife2 complètent la documentation avec beaucoup plus de détails.
Une question fréquemment posée est: "Pourquoi choisir Rife2 plutôt que d'autres cadres populaires"?
La réponse courte est que Rife2 est différent , il est conçu pour créer rapidement des applications Web avec de petites équipes. Il a contesté et contestera toujours le statu quo. Il n'est pas destiné à remplacer les cadres de niveau d'entreprise comme Spring ou JEE, bien que je l'ai utilisé pour les applications d'entreprise. Rife2 exploite la puissance de la plate-forme Java pour les applications Web que vous écririez généralement avec les langages de script. La productivité et la maintenabilité sont essentielles, et vous constaterez que vous obtenez 90% du travail effectué pour 10% de l'effort et que vous pouvez toujours vous intégrer à d'autres bibliothèques et cadres Java où vous en avez besoin.
Rife2 a des fonctionnalités qui, après 20 ans, ne peuvent toujours pas être trouvées ailleurs:
Contenance Web, moteur de modèle bidirectionnel, système de métadonnées centrées sur le bean, pile complète sans dépendances, constructeurs SQL basés sur les métadonnées, cadre de gestion de contenu, support complet de localisation, abstraction des ressources, planificateur de type Cron persistant, moteur de workflow basé sur les continuations.
La plupart de ces fonctionnalités ont résisté à l'épreuve du temps et, après 20 ans, s'avèrent toujours être de grands choix pour le développement d'applications Web. Rife2 a appris des décennies d'expérience et améliore ces caractéristiques originales à bien des égards.
Rife2 a également des fonctionnalités qui ont été adoptées par d'autres, mais qui manquent généralement de commodité de l'intégration serrée tout au long d'une pile complète.
Par exemple: les tests hors contact peuvent analyser la structure des modèles résultants sans avoir à analyser le HTML, le système d'authentification est construit à partir de toutes les autres pièces de la file d'attente et s'intègre de manière transparente dans votre application Web, les URL sont générées à partir de la configuration que vous avez créée sans le risque de devenir un formateur logique, les modèles logiques, sont vraiment contenus et contenus et peuvent générer un formateur logique (jon, xml, xml, xml, axé en contenu pure et contenu HTML, SVG, SQL), ... et bien plus encore.
Rife2 est la pilule rouge , prête à vous montrer à quelle profondeur le terrier du lapin peut aller, si vous êtes prêt!
C'est ainsi que vous commencez avec un site 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 ());
}
} La méthode main tourne dans le serveur de jetée intégré intégré, afin que vous puissiez immédiatement commencer à coder. La même classe HelloWorld peut être ajoutée en tant que valeur de paramètre à votre web.xml , nécessitant des modifications absolues sans modification entre votre code entre le développement et la production.
Les tests hors contact sont un citoyen de première classe dans Rife2, interagissant directement avec votre classe Site pour simuler les interactions complètes de demande-réponse, sans avoir à faire tourner un conteneur de servlet.
C'est ainsi que vous pouvez tester l'exemple ci-dessus avec Junit 5:
class HelloTest {
@ Test void verifyHelloWorld () {
var m = new MockConversation ( new HelloWorld ());
assertEquals ( "Hello World" , m . doRequest ( "/hello" ). getText ());
}
}L'un des aspects les plus fragiles du développement d'applications Web est de taper des liens et des URL en tant que littéraux de texte, sans rien garantir qu'ils restent corrects lorsque vos itinéraires changent ou lorsque vous déploiez votre application dans différents contextes d'application Web. L'API de routage de Rife2 permet de générer correctement tous les liens de votre application sans aucun effort en votre nom.
Ajoutons une nouvelle route qui contient un lien HTML vers la route Hello World précédente.
Vous pouvez voir que les itinéraires n'ont pas à être créés à l'intérieur de la méthode setup() , mais peuvent également être créés dans le cadre de la construction de votre Site , permettant aux itinéraires d'être stockés dans les champs.
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 ());
}
}Nous pouvons maintenant tester cela en tant que tel:
class HelloTest {
@ Test void verifyHelloLink () {
var m = new MockConversation ( new HelloLink ());
assertEquals ( "Hello World" , m . doRequest ( "/link" )
. getParsedHtml (). getLinkWithText ( "Hello" )
. follow (). getText ());
}
}L'élan principal qui m'a fait créer Rife2, était le moteur de gabarit unique de Rife.
Les modèles de Rife2 contiennent deux concepts principaux:
Votre code Java composera la disposition finale en attribuant et en ajoutant des blocs, et en mettant des données dans des valeurs. Réécrivons l'exemple HelloLink ci-dessus avec un modèle.
Dans cet exemple, aucune manipulation de modèle n'est encore effectuée en Java.
Au lieu de cela, il introduit la balise de valeur {{v route:hello/}} , qui sera automatiquement remplacée par l'URL de l'itinéraire disponible avec ce nom de champ dans votre Site actif.
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 ());
}
} Avec HelloTemplate.html être:
<!DOCTYPE html >
< html lang =" en " >
< body >
< a href =" {{v route:hello/}} " > Hello </ a >
</ body >
</ html >Notez que Rife2 transforme en interne vos modèles en classes Java en générant des bytecodes optimisés.
Cela se produit à la volée pendant le développement. Pour la production, les modèles peuvent être pré-compilés, ce qui les rend incroyablement rapides.
Changeons l'exemple plus et créons un seul itinéraire qui peut répondre aux demandes get et post .
get affichera un formulaire avec un seul bouton pour cliquer.post recevra la soumission du formulaire et affiche 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 ());
}
} Avec HelloForm.html étant:
<!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 >Remarque: que la balise
route:valeur de ce qui précède a été divisée enroute:action:etroute:inputs:, générant des entrées de formulaire HTML cachées pour les paramètres au lieu de paramètres de chaîne de requête.
Vous pouvez voir que le modèle contient toutes les pièces pour créer les deux pages:
contentformtextEn Java, nous attribuons simplement l'un ou l'autre bloc à la valeur, selon ce que nous voulons afficher.
Un autre avantage est que les étiquettes de modèle de Rife2 peuvent être des commentaires HTML, ce qui les rend complètement invisibles. Cela vous permet de travailler sur votre conception HTML comme d'habitude et de prévisualiser le fichier de modèle avec un navigateur ordinaire.
Enfin, incluons un test pour cette fonctionnalité:
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 ());
}
}Merci d'avoir lu jusqu'à la fin!
Ce n'était qu'une introduction rapide à votre appétit, Rife2 est livré avec un manuel complet et facile à lire avec de nombreux exemples et des explications pragmatiques.
Si vous avez des questions, des suggestions, des idées ou vous voulez simplement discuter, n'hésitez pas à poster sur les forums ou à nous rejoindre sur Discord.
En savoir plus dans la documentation complète et Rife2 Javadocs.