Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Java Spring
  3. Intégration JSF2
Extrait - Java Spring Le socle technique des applications Jakarta EE (4e édition)
Extraits du livre
Java Spring Le socle technique des applications Jakarta EE (4e édition) Revenir à la page d'achat du livre

Intégration JSF2

Introduction

Les interventions en mission peuvent amener à travailler avec des applications JSF2. JSF2 est le standard de remplacement de JSP. Il est cependant toujours fourni avec Jakarta EE 9 avec la version JSF 3.0 (https://jakarta.ee/specifications/faces/). La version 4.0 est en cours de développement pour la version Jakarta EE 10.

Dans ce chapitre nous n’abordons que JSF2 pour permettre au lecteur de faire de la maintenance ou d’intervenir sur des projets de migration. Il n’y a plus de nouveaux projets qui utiliseraient Spring en conjonction des nouvelles versions de JSF (3 et 4).

Nous n’aborderons JSF2 que partiellement, nous ne rappellerons que les éléments principaux pour comprendre comment l’intégrer avec Spring. JSF2 est en effet un ensemble assez complexe qui demanderait un livre entier pour décrire tous les détails de son fonctionnement.

Vous pouvez vous référer à cet ouvrage : JSF 2 avec Eclipse Développement d’applications web avec Java Server Faces (2e édition) de François-Xavier Sennesal aux Éditions ENI.

Nous verrons d’abord l’implémentation standard Mojorra. Nous observons actuellement une certaine tendance pour la migration des applications JSF2 vers Angular. En effet, les nouvelles applications utilisent généralement un framework Single Page Application comme Angular, ReactJS ou VueJS. L’utilisation d’Angular...

Mojarra

Mojarra est l’implémentation standard. JSF2 remplace les JSP pour avoir une approche composant.

L’idée principale est d’exposer directement des beans (JSF) "managés" dans les vues. De la même façon, la notion de contrôleur est simplifiée. L’objectif est de masquer la complexité mais cela reste cependant assez délicat à mettre en œuvre.

Mojarra est disponible ici : https://github.com/javaserverfaces/mojarra. Une version plus moderne est accessible ici : https://github.com/eclipse-ee4j/mojarra.

La dernière version 2 nécessite :

  • Java 1.8

  • Servlet 3.0 (4.0 recommandé)

  • EL 3.0

  • CDI 1.2 (2.0 recommandé) ou Spring

  • JSTL 1.2

  • JSONP 1.1 (si <f:websocket> est utilisé)

  • BV 1.1 (si <f:validateBean> ou <f:validateWholeBean> est utilisé alors la version 2.0 est recommandée).

images/11RI01.png

Architecture

La configuration se base sur le fichier web.xml et le fichier faces-config.xml.

Les dernières versions 2 des frameworks permettent de se passer de ces fichiers via les annotations comme nous le verrons dans un exemple.

Sous une vision simpliste :

  • La requête arrive au contrôleur.

  • Le contrôleur valide les données.

  • S’il y a des erreurs, la page en cours est retournée avec les erreurs.

  • Sinon il cherche la vue correspondant à la réponse.

  • La vue interroge les beans managés présents dans la page ; ces beans sont soit des données métier, soit des services.

  • La couche métier et/ou DAO renvoie les données à la page.

  • La page est ensuite rendue.

Il est possible de court-circuiter des étapes lors des appels AJAX. Il faut considérer qu’il y a un contexte sur le serveur. Ce contexte est en relation avec la page. Il contient la structure de la page au niveau des composants avec les données métier (services et data). La page modifie le contexte puis le retourne. Le contexte retourné peut être valide ou invalide du point de vue de la validité des données modifiées. Les données ne peuvent être enregistrées que si le modèle est valide.

Il faudra éviter d’avoir des rollbacks venant d’une interruption lors de la mise à jour en base car cela corrompt le contexte....

Cycle de vie

Le cycle de vie décrit les étapes faites par le contrôleur. Il est possible de tracer dans quelle étape on se trouve pour un traitement donné en activant la log.

Cycle de vie :

images/11RI03.png

Les termes sont en anglais car ils apparaissent tels quels dans la configuration et les logs.

1. Requête

Il s’agit d’une requête HTTP. La requête contient les données nécessaires à JSF pour gérer son cycle de vie. On y retrouve des éléments sur le contexte associé à la requête.

2. Restore View ou Reconstruct Component Tree

À partir de la session, le serveur retrouve le contexte associé à la session et recompose l’arborescence des composants de la page.

3. Apply Request Value

On extrait de la requête HTTP les valeurs des données qui correspondent aux composants. Nous utilisons des convertisseurs pour adapter le format des données qui sont passées sous forme de chaînes de caractères dans la requête. Nous aurons donc des convertisseurs à créer.

4. Perform Validation

Il s’agit d’une phase cruciale : nous utilisons les validateurs enregistrés dans les composants pour valider les données de la page en cours. Il est possible avec JSF2 de valider les données dans les pages avant de soumettre le formulaire. Il faut tout de même valider les données côté serveur pour éviter les problèmes.

La validation des données peut souvent être déléguée d’une part au service pour les questions métier et d’autre part à l’ORM de la couche domaine pour une validation directe sur les beans du modèle. La validation peut induire un décalage entre le contexte correspondant à la page et le contexte JSF serveur qui lui est en phase avec le contexte de l’ORM. Il faut alors veiller que toutes les données soient validées avant de demander une mise à jour.

Il est possible de valider partiellement les données pour les données présentes sur plusieurs vues. On ne valide alors que les données de la vue que l’on affiche.

En cas d’erreur...

Intégration Spring

Le bean managé par JSF devient un bean Spring.

@Component("messageBackingBean") 
@Scope("request") 
public class MessageBackingBean { 
   private Message message = new Message(); 
   private List<Message> messages; 
   @Autowired 
   private MessageDao messageDao; 
 
   public String getMessage() { 
      return "Bonjour !"; 
   } 
   public Message getMessage() { 
      return message; 
   } 
   public void saveMessage() { 
      messageDao.save(message); 
      message = new Message(); 
      invalidateMessages(); 
   } 
   private void invalidateMessages() { 
      messages = null; 
   } 
   public List<Message> getMessages() { 
      if (messages == null) { 
         messages = messageDao.list(); 
      } 
      return...

Points clés

  • JSF2 est très simple à utiliser.

  • Spring s’interface facilement avec JSF2.

  • Nous pouvons utiliser JSF2 pour les applications Spring MVC.