Chapitre 3. Développement d'applications avec JBoss EAP

3.1. Vue d'ensemble

Ce guide fournit des informations sur le démarrage d'applications de développement à l'aide de Red Hat JBoss Developer Studio et des exemples de quickstart de JBoss EAP 7.

Red Hat JBoss Developer Studio est un environnement de développement intégré (IDE) basé sur Eclipse et intégrant les plug-ins de développement d'application de JBoss. JBoss Developer Studio peut vous assister avec le développement de votre application, avec la disponibilité des assistants de JBoss et avec l'abilité de déployer des applications vers des serveurs JBoss EAP. Plusieurs exemples de codes de quickstart sont fournis avec JBoss EAP 7 pour aider les utilisateurs à écrire des applications avec les différentes technologies Java EE 7.

3.2. Configurer l'environnement de développement

Il est recommandé d'utiliser JBoss Developer Studio 11.0 ou version ultérieure avec JBoss EAP 7.1.

  1. Téléchargez et installez JBoss Developer Studio.

    Pour plus d'informations, consultez la section Installing JBoss Developer Studio Stand-alone Using the Installer (Installation de JBoss Developer Studio Stand-alone à l'aide du programme d'installation) du Guide d'installation de JBoss Developer Studio.

  2. Configurez le serveur JBoss EAP dans JBoss Developer Studio.

    Pour plus d'informations, consultez la section Using Runtime Detection to Set Up JBoss EAP from within the IDE (Utilisation de la détection d'exécution pour configurer JBoss EAP à partir de l'IDE) du guide Getting Started with JBoss Developer Studio Tools (Prise en main de JBoss Developer Studio Tools).

3.3. Utilisation des exemples de quickstart

Les exemples de Quickstart fournis avec JBoss EAP sont des projets Maven.

3.3.1. Maven

Apache Maven est un outil d'automation de builds distribuées, utilisé en développement Java pour créer, gérer et générer des projets de logiciels. Maven utilise des fichiers de configuration nommés Project Object Model, ou POM, pour définir des projets et gérer le processus de build. Les POM décrivent le module et les dépendance du composant, et les sorties sont sous forme de fichier XML. Cela garantit que le projet soit construit de façon correcte et uniforme.

Maven y parvient en utilisant un référentiel. Un référentiel Maven stocke les bibliothèques, plug-ins et autres artefacts de la build. Le référentiel public par défaut est Maven 2 Central Repository, mais les référentiels peuvent être privés et internes à une entreprise dans le but de partager des artefacts communs au sein d'équipes de développeurs. Les référentiels sont également disponibles auprès de tierces parties. Pour plus d'informations, voir le projet Apache Maven et le guide Introduction aux référentiels.

JBoss EAP inclut un référentiel Maven contenant les prérequis que les développeurs Java EE utilisent généralement pour créer des applications sur JBoss EAP.

Pour obtenir des informations supplémentaires sur la façon d'utiliser Maven avec JBoss EAP, consultez la section Using Maven with JBoss EAP (Utilisation de Maven avec JBoss EAP) du Guide de développement de JBoss EAP.

3.3.2. Utilisation de Maven avec des Quickstarts

Les artefacts et dépendances nécessaires pour créer et déployer des applications vers JBoss EAP 7 sont hébergés sur un référentiel public. En commençant par les quickstarts de JBoss EAP 7, il n'est plus nécessaire de configurer votre fichier settings.xml de Maven pour utiliser ces référentiels lors de la création des quickstarts. Les référentiels Maven sont désormais configurés dans les fichiers POM de projet de quickstart. Cette méthode de configuration est fournie pour faciliter le quickstart mais n'est généralement pas recommandée pour les projets de production car votre build peut être ralenti.

Red Hat JBoss Developer Studio inclut Maven. Il est donc inutile de le télécharger et de l'installer séparément. Il est recommandé d'utiliser JBoss Developer Studio version 11.0 ou ultérieure.

Si vous souhaitez utiliser la ligne de commande Maven pour créer et déployer vos applications, vous devez tout d'abord télécharger Maven à partir du projet Apache Maven et l'installer à l'aide des instructions fournies dans la documentation Maven.

3.3.3. Télécharger et exécuter les quickstarts

3.3.3.1. Télécharger les quickstarts

JBoss EAP contient une bonne série d'exemples de code quickstart (démarrage rapide) conçus pour aider les utilisateurs à commencer à rédiger des applications en utilisant différentes technologies Java EE 7. Les quickstarts peuvent être téléchargés à partir du portail client Red Hat.

  1. Se connecter au Portail Clients de Red Hat.
  2. Cliquer sur Téléchargements.
  3. À partir de la liste Téléchargements de produits, cliquer sur Red Hat JBoss Enterprise Application Platform.
  4. Sélectionnez 7.1 dans le menu déroulant Version.
  5. Recherchez l'entrée Red Hat JBoss Enterprise Application Platform 7.1.0 Quickstarts dans le tableau et cliquez ensuite sur Download.
  6. Enregistrer le fichier ZIP sur le répertoire souhaité.
  7. Veuillez extraire le fichier ZIP.

3.3.3.2. Exécuter les quickstarts dans JBoss Developer Studio

Une fois les quickstarts téléchargés, ceux-ci peuvent être importés dans JBoss Developer Studio et déployés vers JBoss EAP.

Importer un quickstart dans JBoss Developer Studio

Chaque quickstart est fourni avec un fichier POM qui contient des informations de projet et de configuration. À l'aide de ce fichier POM, vous pouvez facilement importer le quickstart dans JBoss Developer Studio.

Important

Si votre dossier de projet quickstart se situe dans l'espace de travail IDE, lorsque vous l'importez dans JBoss Developer Studio, l'IDE génère un nom de projet non valide et un nom d'archive WAR. N'oubliez pas que votre dossier de projet quickstart doit être situé en dehors de l'espace de travail IDE avant de commencer.

  1. Démarrer JBoss Developer Studio.
  2. Sélectionner FileImport.
  3. Sélectionner MavenProjets Maven existants, puis cliquer sur Suite.

    Figure 3.1. Importer les projets Maven existants

    The *Import* window.
  4. Naviguer vers le répertoire de quickstart souhaité (par exemple le quickstart helloworld) puis cliquer sur OK. Le champ de la liste Projects se remplit avec le fichier pom.xml du projet de quickstart sélectionné.

    Figure 3.2. Sélectionner les projets Maven

    The *Maven Projects* selection window.
  5. Cliquer sur Finish.

Exécuter le quickstart helloworld

Le quickstart helloworld est une manière simplifiée de vérifier que le serveur JBoss EAP est configuré et exécuté correctement.

  1. Si vous n'avez pas encore défini de serveur, ajoutez le serveur JBoss EAP à JBoss Developer Studio. Reportez-vous à la section Using Runtime Detection to Set Up JBoss EAP from within the IDE (Utilisation de la détection d'exécution pour configurer JBoss EAP à partir de l'IDE) du guide Getting Started with JBoss Developer Studio Tools (Prise en main de JBoss Developer Studio Tools).
  2. Cliquez avec le bouton droit de la souris sur le projet helloworld dans l'onglet Project Explorer et sélectionnez ensuite Run AsRun on Server.

    Figure 3.3. Run As - Run on Server

    The *Run As* -> *Run on Server* screen capture.
  3. Sélectionnez le serveur JBoss EAP 7.1 dans la liste des serveurs, puis cliquez sur Next.

    Figure 3.4. Run on Server

    The *Run on Server* window.
  4. Le Quickstart helloworld est déjà répertorié comme devant être configuré sur le serveur. Cliquez sur Finish pour le déployer.

    Figure 3.5. Modifier les ressources configurées sur le serveur

    The *Add and Remove Resources* window.
  5. Vérifier les résultats.

    • Dans l'onglet Server, l'état du serveur JBoss EAP 7.1 est alors défini sur Started.
    • L'onglet Console montre des messages détaillant le démarrage du serveur JBoss EAP et le déploiement du quickstart helloworld.

      WFLYUT0021 : contexte web enregistré : /helloworld
      WFLYSRV0010 : "helloworld.war" déployé (runtime-name : "helloworld.war")
    • L'application helloworld est disponible à l'adresse http://localhost:8080/helloworld et affiche le texte Hello World!.

Pour plus d'informations sur le Quickstart helloworld, reportez-vous à la section Explore the helloworld Quickstart (Explorer le Quickstart Helloworld).

Exécuter le quickstart bean-validation

Certains quickstarts, comme bean-validation quickstart, ne fournissent pas de couche d'interface utilisateur, mais fournissent des tests Arquillian pour démontrer la fonctionnalité à la place.

  1. Importer le quickstart bean-validation dans JBoss Developer Studio.
  2. Dans l'onglet Servers, cliquez avec le bouton droit de la souris sur le serveur et sélectionnez ensuite Start pour démarrer le serveur JBoss EAP. Si l'onglet Servers n'est pas visible ou si vous n'avez pas encore défini de serveur, ajoutez le serveur JBoss EAP à JBoss Developer Studio. Reportez-vous à la section Using Runtime Detection to Set Up JBoss EAP from within the IDE (Utilisation de la détection d'exécution pour configurer JBoss EAP à partir de l'IDE) du guide Getting Started with JBoss Developer Studio Tools (Prise en main de JBoss Developer Studio Tools).
  3. Cliquez avec le bouton droit de la souris sur le projet bean-validation dans l'onglet Project Explorer et sélectionnez ensuite Run AsMaven Build.
  4. Saisir ce qui suit dans le champ de saisie Goals puis cliquer sur Run.

    clean verify -Parq-remote

    Figure 3.6. Modifier la configuration

    The *Edit Configuration* window.
  5. Vérifier les résultats.

    L'onglet Console affiche les résultats des tests Arquillian bean-validation :

    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running org.jboss.as.quickstarts.bean_validation.test.MemberValidationTest
    Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.189 sec
    
    Results :
    
    Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
    
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------

3.3.3.3. Exécuter les Quickstarts à partir de la ligne de commande

Vous pouvez facilement créer et déployer des quickstarts à partir de la ligne de commande en utilisant Maven. Si vous n'avez pas encore installé Maven, voir le projet Apache Maven pour le télécharger et l'installer.

A README.md file is provided at the root directory of the quickstarts that contains general information about system requirements, configuring Maven, adding users, and running the quickstarts.

Chaque quickstart contient son propre fichier README.md fournissant les instructions spécifiques et les commandes Maven qui servent à exécuter ce quickstart.

Exécuter le quickstart helloworld à partir de la ligne de commandes

  1. Vérifier le fichier README.md dans le répertoire racine du quickstart helloworld.
  2. Démarrer le serveur JBoss EAP.

    $ EAP_HOME/bin/standalone.sh
  3. Navuguez dans le répertoire quickstart helloworld.
  4. Construire et déployer le quickstart à l'aide de la commande Maven fournie dans le fichier README.md du quickstart.

    $ mvn clean install wildfly:deploy
  5. L'application helloworld est désormais disponible à l'adresse http://localhost:8080/helloworld et affiche le texte Hello World!.

3.4.  Analyse des exemples Quickstart

3.4.1. Découvrir le Quickstart HelloWorld

Le Quickstart helloworld vous montre comment déployer un servlet simple sur JBoss EAP. La logique métier est encapsulée dans un service, qui est fourni en tant que bean CDI (Contexts and Dependency Injection) et injecté dans le servlet. Ce Quickstart constitue un point de départ pour être sûr que vous avez configuré et démarré correctement votre serveur.

Vous trouverez des informations détaillées sur la création et le déploiement de ce Quickstart à l'aide de la ligne de commande dans le fichier README.html situé à la racine du répertoire du Quickstart helloworld. Cette rubrique vous explique comment utiliser Red Hat JBoss Developer Studio pour exécuter le Quickstart. Nous partons du principe que vous avez installé Red Hat JBoss Developer Studio, configuré Maven, et importé et exécuté avec succès le Quickstart helloworld.

Conditions préalables
Observer la structure du répertoire

Le code du Quickstart helloworld est disponible dans le répertoire QUICKSTART_HOME/helloworld/. Le Quickstart helloworld se compose d'un servlet et d'un bean CDI. Il contient également un fichier beans.xml dans le répertoire WEB-INF/ de l'application, dont le numéro de version est 1.1 et le bean-discovery-mode est défini sur all. Ce fichier marqueur identifie le fichier WAR en tant qu'archive bean, et indique à JBoss EAP de rechercher des beans dans cette application et d'activer le bean CDI.

Le répertoire src/main/webapp/ contient les fichiers nécessaires au Quickstart. Tous les fichiers de configuration de cet exemple sont situés dans le répertoire WEB-INF/, à l'intérieur de src/main/webapp/, y compris le fichier beans.xml. Le répertoire src/main/webapp/ contient également un fichier index.html, qui utilise une redirection meta refresh simple pour rediriger le navigateur de l'utilisateur vers le servlet, situé à l'adresse suivante : http://localhost:8080/helloworld/HelloWorld. Aucun fichier web.xml n'est nécessaire pour le Quickstart.

Examiner le code

La déclaration de paquet et les importations ont été exclues de ces listes. La liste complète est disponible dans le code source du Quickstart.

  1. Vérifiez le code HelloWorldServlet.

    Le fichier HelloWorldServlet.java se trouve dans le répertoire src/main/java/org/jboss/as/quickstarts/helloworld/. Ce servlet envoie les informations au navigateur.

    Exemple : code de classe HelloWorldServlet

    42 @SuppressWarnings("serial")
    43 @WebServlet("/HelloWorld")
    44 public class HelloWorldServlet extends HttpServlet {
    45
    46     static String PAGE_HEADER = "<html><head><title>helloworld</title></head><body>";
    47
    48     static String PAGE_FOOTER = "</body></html>";
    49
    50     @Inject
    51	   HelloService helloService;
    52
    53     @Override
    54     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    55         resp.setContentType("text/html");
    56         PrintWriter writer = resp.getWriter();
    57         writer.println(PAGE_HEADER);
    58         writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>");
    59         writer.println(PAGE_FOOTER);
    60         writer.close();
    61     }
    62
    63 }

    Tableau 3.1. Infos HelloWorldServlet

    LigneRemarque

    43

    Il vous suffit simplement d'ajouter l'annotation @WebServlet et de fournir un mappage vers une URL utilisée pour accéder au servlet.

    46-48

    Chaque page web a besoin d'HTML formé correctement. Ce Quickstart utilise les Strings statiques pour écrire les sorties minimum de l'en-tête et du pied de page.

    50-51

    Ces lignes injectent le bean CDI HelloService qui génère le message proprement dit. À condition que l'API de HelloService ne soit pas modifié, cette méthode permettra de modifier l'implémentation de HelloService ultérieurement sans devoir changer la couche d'affichage.

    58

    Cette ligne appelle le service pour générer le message "Hello World", et l'écrire dans la requête HTTP.

  2. Vérifiez le code HelloService.

    Le fichier HelloService.java se trouve dans le répertoire src/main/java/org/jboss/as/quickstarts/helloworld/. Ce service renvoie simplement un message. Aucun enregistrement d'annotations ou XML n'est requis.

    Exemple : code de classe HelloService

    public class HelloService {
    
        String createHelloMessage(String name) {
            return "Hello " + name + "!";
        }
    }

3.4.2. Découvrir le Quickstart numberguess

Le Quickstart numberguess vous montre comment créer et déployer une application non persistante simple sur JBoss EAP. Les informations sont affichées à l'aide d'une vue JSF et la logique métier est encapsulée dans deux beans CDI. Dans le Quickstart numberguess, vous disposez de dix tentatives pour deviner un nombre entre 1 et 100. Après chaque tentative, le système vous indique si votre proposition est trop basse ou trop haute.

Le code du Quickstart numberguess est disponible dans le répertoire QUICKSTART_HOME/numberguess/, où QUICKSTART_HOME est le répertoire dans lequel vous avez téléchargé et décompressé les Quickstarts JBoss EAP. Le Quickstart numberguess se compose de plusieurs beans, fichiers de configuration et vues Facelets (JSF). Il est, en outre, empaqueté sous la forme d'un module WAR.

Vous trouverez des informations détaillées sur la création et le déploiement de ce Quickstart à l'aide de la ligne de commande dans le fichier README.html situé à la racine du répertoire du Quickstart numberguess. Dans les exemples suivants, Red Hat JBoss Developer Studio est utilisé pour exécuter le Quickstart.

Conditions préalables
  • Installez JBoss Developer Studio. Pour plus d'informations, consultez la section Installing JBoss Developer Studio Stand-alone Using the Installer (Installation de JBoss Developer Studio Stand-alone à l'aide du programme d'installation) du Guide d'installation de JBoss Developer Studio.
  • Exécutez le Quickstart numberguess. Pour plus d'informations, reportez-vous à la section Run the Quickstarts in JBoss Developer Studio (Exécution des Quickstarts dans JBoss Developer Studio) et remplacez helloworld par numberguess dans les instructions.
  • Vérifiez que le Quickstart numberguess a été déployé correctement sur JBoss EAP en ouvrant un navigateur web et en accédant à l'application à l'adresse suivante : http://localhost:8080/numberguess.
Examiner les fichiers de configuration

Tous les fichiers de configuration de cet exemple se trouvent dans le répertoire QUICKSTART_HOME/numberguess/src/main/webapp/WEB-INF/ du Quickstart.

  1. Examinez le fichier faces-config.xml.

    Ce Quickstart utilise la version JSF 2.2 du nom de fichier faces-config.xml. Une version normalisée de Facelets est le gestionnaire de vues par défaut dans JSF 2.2 ; aucune configuration n'est donc requise. Ce fichier se compose uniquement de l'élément racine. Il s'agit simplement d'un fichier marqueur utilisé pour indiquer que JSF doit être activé dans l'application.

    <faces-config version="2.2"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
          http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
    
    </faces-config>
  2. Examinez le fichier beans.xml.

    Le fichier beans.xml contient le numéro de version 1.1 et le bean-discovery-mode est défini sur all. Il s'agit d'un fichier marqueur qui identifie le fichier WAR en tant qu'archive bean, et indique à JBoss EAP de rechercher des beans dans cette application et d'activer le bean CDI.

    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
          http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
        bean-discovery-mode="all">
    </beans>
Note

Ce Quickstart ne nécessite pas de fichier web.xml.

3.4.2.1. Examiner le code JSF

JSF utilise l'extension .xhtml pour les fichiers sources, mais génère les vues rendues avec l'extension .jsf. Le fichier home.xhtml se trouve dans le répertoire src/main/webapp/.

Exemple : code de source JSF

19<html xmlns="http://www.w3.org/1999/xhtml"
20	xmlns:ui="http://java.sun.com/jsf/facelets"
21	xmlns:h="http://java.sun.com/jsf/html"
22	xmlns:f="http://java.sun.com/jsf/core">
23
24	<head>
25	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
26	<title>Numberguess</title>
27	</head>
28
29	<body>
30	<div id="content">
31		<h1>Guess a number...</h1>
32		<h:form id="numberGuess">
33
34		<!-- Feedback for the user on their guess -->
35	<div style="color: red">
36		<h:messages id="messages" globalOnly="false" />
37		<h:outputText id="Higher" value="Higher!"
38 		  rendered="#{game.number gt game.guess and game.guess ne 0}" />
39		<h:outputText id="Lower" value="Lower!"
40		   rendered="#{game.number lt game.guess and game.guess ne 0}" />
41	</div>
42
43	<!-- Instructions for the user -->
44	<div>
45	I'm thinking of a number between <span
46	id="numberGuess:smallest">#{game.smallest}</span> and <span
47	id="numberGuess:biggest">#{game.biggest}</span>. You have
48	#{game.remainingGuesses} guesses remaining.
49	</div>
50
51	<!-- Input box for the users guess, plus a button to submit, and reset -->
52	<!-- These are bound using EL to our CDI beans -->
53	<div>
54	Your guess:
55	<h:inputText id="inputGuess" value="#{game.guess}"
56		required="true" size="3"
57		disabled="#{game.number eq game.guess}"
58		validator="#{game.validateNumberRange}" />
59		<h:commandButton id="guessButton" value="Guess"
60			action="#{game.check}"
61			disabled="#{game.number eq game.guess}" />
62	</div>
63	<div>
64	<h:commandButton id="restartButton" value="Reset"
65	action="#{game.reset}" immediate="true" />
66	</div>
67	</h:form>
68
69	</div>
70
71	<br style="clear: both" />
72
73	</body>
74</html>

Les numéros de ligne suivants correspondent à ceux qui sont affichés lors de la consultation du fichier dans JBoss Developer Studio.

Tableau 3.2. Infos JSF

LigneRemarque

36-40

Voici les messages qui peuvent être envoyés par l'utilisateur : "Higher!" et "Lower!"

45-48

Au fur et à mesure que l'utilisateur devine, l'étendue des nombres qu'ils devinent se rétrécit. Cette phrase change pour s'assurer qu'ils connaissent la portée d'une tentative valide.

55-58

Ce champ d'entrée est lié à une propriété de bean qui utilise une expression de valeur.

58

On utilise une liaison de validateur pour s'assurer que l'utilisateur ne mette pas le nombre qu'il devine en dehors de la limite. Si le validateur n'était pas présent, l'utilisateur peut deviner un nombre en dehors de la limite.

59-61

Il doit y avoir un moyen pour que l'utilisateur envoie le nombre qu'il devine au serveur. Ici, on associe une méthode d'action sur le bean.

3.4.2.2. Examiner les fichiers de classe

Tous les fichiers sources du Quickstart numberguess se trouvent dans le répertoire QUICKSTART_HOME/numberguess/src/main/java/org/jboss/as/quickstarts/numberguess/. La déclaration de paquetage et les importations ont été exclues de ces listes. La liste complète est disponible dans le code source du Quickstart.

  1. Vérification du code du qualificateur Random.java

    Un qualificateur est utilisé pour supprimer toute ambiguïté entre deux beans réunissant les conditions nécessaires pour une injection en fonction de leur type. Pour plus d'informations sur les qualificateurs, reportez-vous à la section Use a Qualifier to Resolve an Ambiguous Injection (Utilisation d'un qualificateur pour résoudre une injection ambiguë) du Guide de développement de JBoss EAP. Le qualificateur @Random est utilisé pour l'injection d'un nombre aléatoire.

    @Target({ TYPE, METHOD, PARAMETER, FIELD })
    @Retention(RUNTIME)
    @Documented
    @Qualifier
    public @interface Random {
    
    }
  2. Vérification du code du qualificateur MaxNumber.java

    Le qualificateur @MaxNumber est utilisé pour injecter le nombre maximum autorisé.

    @Target({ TYPE, METHOD, PARAMETER, FIELD })
    @Retention(RUNTIME)
    @Documented
    @Qualifier
    public @interface MaxNumber {
    }
  3. Vérification du code Generator.java

    La classe Generator crée le nombre aléatoire au moyen d'une méthode producteur, exposant ainsi le nombre maximum autorisé via celle-ci. Cette classe étant basée sur l'étendue de l'application, vous recevez à chaque fois le même nombre aléatoire.

    @SuppressWarnings("serial")
    @ApplicationScoped
    public class Generator implements Serializable {
    
        private java.util.Random random = new java.util.Random(System.currentTimeMillis());
    
        private int maxNumber = 100;
    
        java.util.Random getRandom() {
            return random;
        }
    
        @Produces
        @Random
        int next() {
            // a number between 1 and 100
            return getRandom().nextInt(maxNumber - 1) + 1;
        }
    
        @Produces
        @MaxNumber
        int getMaxNumber() {
            return maxNumber;
        }
    }
  4. Vérification du code Game.java

    La classe Game basée sur la session constitue le point d'entrée principal de l'application. Elle est chargée de configurer ou de réinitialiser le jeu, de collecter et de valider les propositions de l'utilisateur, et de fournir des commentaires à l'utilisateur avec un FacesMessage. Elle utilise la méthode de cycle de vie postérieure à la construction (PostConstruct) pour initialiser le jeu en récupérant un nombre aléatoire du bean @Random Instance<Integer>.

    Notez l'annotation @Named dans cette classe. Cette annotation n'est nécessaire que si vous souhaitez que le bean soit accessible à une vue JSF en utilisant le langage d'expression (EL) ; dans ce cas #{game}.

    @SuppressWarnings("serial")
    @Named
    @SessionScoped
    public class Game implements Serializable {
    
        /**
         * The number that the user needs to guess
         */
        private int number;
    
        /**
         * The users latest guess
         */
        private int guess;
    
        /**
         * The smallest number guessed so far (so we can track the valid guess range).
         */
        private int smallest;
    
        /**
         * The largest number guessed so far
         */
        private int biggest;
    
        /**
         * The number of guesses remaining
         */
        private int remainingGuesses;
    
        /**
         * The maximum number we should ask them to guess
         */
        @Inject
        @MaxNumber
        private int maxNumber;
    
        /**
         * The random number to guess
         */
        @Inject
        @Random
        Instance<Integer> randomNumber;
    
        public Game() {
        }
    
        public int getNumber() {
            return number;
        }
    
        public int getGuess() {
            return guess;
        }
    
        public void setGuess(int guess) {
            this.guess = guess;
        }
    
        public int getSmallest() {
            return smallest;
        }
    
        public int getBiggest() {
            return biggest;
        }
    
        public int getRemainingGuesses() {
            return remainingGuesses;
        }
    
        /**
         * Check whether the current guess is correct, and update the biggest/smallest guesses as needed. Give feedback to the user
         * if they are correct.
         */
        public void check() {
            if (guess > number) {
                biggest = guess - 1;
            } else if (guess < number) {
                smallest = guess + 1;
            } else if (guess == number) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Correct!"));
            }
            remainingGuesses--;
        }
    
        /**
         * Reset the game, by putting all values back to their defaults, and getting a new random number. We also call this method
         * when the user starts playing for the first time using {@linkplain PostConstruct @PostConstruct} to set the initial
         * values.
         */
        @PostConstruct
        public void reset() {
            this.smallest = 0;
            this.guess = 0;
            this.remainingGuesses = 10;
            this.biggest = maxNumber;
            this.number = randomNumber.get();
        }
    
        /**
         * A JSF validation method which checks whether the guess is valid. It might not be valid because there are no guesses left,
         * or because the guess is not in range.
         *
         */
        public void validateNumberRange(FacesContext context, UIComponent toValidate, Object value) {
            if (remainingGuesses <= 0) {
                FacesMessage message = new FacesMessage("No guesses left!");
                context.addMessage(toValidate.getClientId(context), message);
                ((UIInput) toValidate).setValid(false);
                return;
            }
            int input = (Integer) value;
    
            if (input < smallest || input > biggest) {
                ((UIInput) toValidate).setValid(false);
    
                FacesMessage message = new FacesMessage("Invalid guess");
                context.addMessage(toValidate.getClientId(context), message);
            }
        }
    }