Capítulo 3. Desarrollo de aplicaciones mediante JBoss EAP


3.1. Visión General

En esta guía se proporciona información sobre cómo iniciar las aplicaciones de desarrollo con la ayuda de Red Hat JBoss Developer Studio y los ejemplos de inicio rápido de JBoss EAP 7.

Red Hat JBoss Developer Studio es un entorno de desarrollo integrado basado en Eclipse (IDE) que integra plugins de desarrollo de aplicaciones JBoss. JBoss Developer Studio puede ayudarlo a desarrollar la aplicación con la disponibilidad de asistentes específicos de JBoss y la capacidad para implementar aplicaciones para servidores JBoss EAP. Se proporcionan muchos ejemplos de código de inicio rápido JBoss EAP 7 para ayudar a los usuarios a iniciar la escritura de aplicaciones mediante diferentes tecnologías diferentes de Java EE 7.

3.2. Configuración del entorno de desarrollo

Se recomienda usar JBoss Developer Studio 11.0 o posterior con JBoss EAP 7.1.

  1. Descargue e instale JBoss Developer Studio.

    Para obtener instrucciones, consulte Instalación del servidor autónomo JBoss Developer Studio usando el instalador en la Guía de instalación de JBoss Developer Studio.

  2. Configure el servidor JBoss EAP en JBoss Developer Studio.

    Para obtener instrucciones, consulte Uso de la detección del tiempo de ejecución para configurar JBoss EAP desde dentro de IDE en la guía Introducción a las herramientas de JBoss Developer Studio.

3.3. Cómo usar ejemplos de inicios rápidos

Los ejemplos de inicio rápido proporcionados con JBoss EAP son proyectos Maven.

3.3.1. Acerca de Maven

Apache Maven es una herramienta de automatización de construcción distribuida , que se utiliza en el desarrollo de aplicaciones Java para crear, administrar y construir proyectos software. Maven usa archivos de configuración estándares llamados Modelo de objetos de proyecto (conocidos como POM, por sus siglas en inglés) para definir proyectos y administrar el proceso de construcción. Los POM describen las dependencias de componentes y módulos, el orden de construcción y los destinos para el empacado del proyecto resultante y la salida mediante un archivo XML. Esto asegura que el proyecto sea construido de una manera correcta y uniforme.

Maven logra esto con la ayuda de un repositorio. Un repositorio almacena bibliotecas, complementos y otros artefactos de la construcción. El repositorio público predeterminado es el Maven 2 Central Repository, aunque los repositorios pueden ser privados e internos dentro de una compañía con una meta para compartir artefactos comunes entre los equipos de desarrollo. Los repositorios también están disponibles de terceras partes. Para obtener más información, consulte el proyecto Apache Maven y la guía de Introducción a repositorios.

JBoss EAP incluye el repositorio Maven, el cual contiene requerimientos que los desarrolladores de Java EE suelen emplear para construir aplicaciones en JBoss EAP.

Para obtener más información sobre cómo utilizar Maven con JBoss EAP, consulte la sección Uso de Maven con JBoss EAP en la Guía de desarrollo de JBoss EAP.

3.3.2. Uso de Maven con Quickstarts

Los artefactos y dependencias necesarias para construir e implementar aplicaciones para JBoss EAP 6 se alojan en un repositorio público. Para comenzar por los inicios rápidos de JBoss EAP 7, ya no necesita configurar su archivo settings.xml de Maven para poder usar dicho repositorio durante la creación de los inicios rápidos. Los repositorios Maven ahora están configurados en los archivos POM del proyecto de inicios rápidos. Este método de configuración se proporciona para facilitarle el inicio con Quickstarts, sin embargo, no es recomendable para proyectos de producción debido a que puede demorar la construcción.

Red Hat JBoss Developer Studio incluye Maven; por lo tanto, no es necesario descargarlo o instalarlo por separado. Se recomienda usar una versión 11.0 o posterior de JBoss Developer Studio.

Si su plan es usar la línea de comandos Maven para construir e implementar sus aplicaciones, entonces primero descargue Maven desde el proyecto Apache Maven e instálelo siguiendo las instrucciones provistas en la documentación de Maven.

3.3.3. Descargar y ejecutar los Quickstarts

3.3.3.1. Descargar los Quickstarts

JBoss EAP viene junto con una serie completa de ejemplos de inicio rápido diseñados para ayudar a los usuarios a empezar a escribir aplicaciones usando la tecnología de Java EE 7. Los inicios rápidos pueden ser descargados desde el Portal del cliente de Red Hat.

  1. Ingrese al Portal del cliente de Red Hat.
  2. Haga clic en Downloads.
  3. En la lista Product Downloads, haga clic en Red Hat JBoss Enterprise Application Platform.
  4. Seleccione 7.1 en el menú desplegable Version (Versión).
  5. Busque la entrada Red Hat JBoss Enterprise Application Platform 7.1.0 Quickstarts en la tabla y haga clic en Download (Descargar).
  6. Guarde el archivo ZIP para el directorio deseado.
  7. Extraer el archivo ZIP.

3.3.3.2. Ejecutar los Quickstarts en JBoss Developer Studio

Cuando haya cargado los inicios rápidos, se pueden importar al JBoss Developer Studio y desplegar para JBoss EAP.

Importe un Quickstart en JBoss Developer Studio

Cada inicio rápido se distribuye con un archivo POM (Modelo de objetos de proyectos) que contiene información de configuración y del proyecto. Al usar este archivo POM, puede importar fácilmente el inicio rápido en JBoss Developer Studio.

Importante

Si su carpeta de proyectos de inicios rápidos se localiza dentro del espacio de trabajo IDE cuando lo importa a JBoss Developer Studio, el IDE genera un nombre de proyecto inválido y el nombre de archivador WAR. Verifique si su carpeta de proyecto de inicios rápidos se localiza fuera del espacio de trabajo IDE antes de comenzar.

  1. Inicie JBoss Developer Studio.
  2. Seleccione File Import.
  3. Seleccione Maven Existing Maven Projects, luego haga clic en Next.

    Figura 3.1. Importación de proyectos existentes de Maven

    The *Import* window.
  4. Navegue al directorio de inicio rápido (por ejemplo el inicio rápido helloworld), y haga clic en OK. La caja de listas Projects se generará con el archivo pom.xml del proyecto de inicio rápido seleccionado.

    Figura 3.2. Seleccione proyectos Maven

    The *Maven Projects* selection window.
  5. Haga clic en Finish.

Ejecute el inicio rápido helloworld

La ejecución del inicio rápido helloworld es una forma fácil de verificar que el servidor JBoss EAP está configurado y está ejecutándose correctamente.

  1. Si aún no definió un servidor, añada el servidor JBoss EAP a JBoss Developer Studio. Consulte Uso de la detección del tiempo de ejecución para configurar JBoss EAP desde dentro de IDE en la guía Introducción a las herramientas de JBoss Developer Studio.
  2. Haga clic en el proyecto helloworld en la pestaña Project Explorer (Explorador de proyectos) y seleccione Run As (Ejecutar como) Run on Server (Ejecutar en el servidor).

    Figura 3.3. Ejecutar como - Ejecutar en servidor

    The *Run As* -> *Run on Server* screen capture.
  3. Seleccione el servidor JBoss EAP 7.1 desde la lista de servidores y haga clic en Next (Siguiente).

    Figura 3.4. Ejecute en el servidor

    The *Run on Server* window.
  4. El inicio rápido helloworld ya figura como configurado en el servidor. Haga clic en Finish (Finish) para implementar el inicio rápido.

    Figura 3.5. Modifique los recursos configurados en el servidor

    The *Add and Remove Resources* window.
  5. Verifique los resultados

    • En la pestaña Server (Servidor), el estado del servidor JBoss EAP 7.1 cambia a Started (Iniciado).
    • La pestaña Console muestra mensajes que detallan el inicio del servidor JBoss EAP y la implementación de inicio rápido helloworld.

      WFLYUT0021: Registered web context: /helloworld
      WFLYSRV0010: Deployed "helloworld.war" (runtime-name : "helloworld.war")
    • La aplicación helloworld está disponible en http://localhost:8080/helloworld y muestra el texto Hello World! (¡Hola, mundo!).

Para obtener más detalles sobre el inicio rápido helloworld, consulte Exploración del inicio rápido helloworld.

Ejecute el inicio rápido bean-validation

Algunos inicios rápidos tales como bean-validation, no proporcionan una capa de interfaz de usuario y en su lugar, proporcionan pruebas Arquillian para demostrar la funcionalidad.

  1. Importe el inicio rápido bean-validation a JBoss Developer Studio.
  2. En la pestaña Servers (Servidores), haga clic derecho en el servidor y elija Start (Inicio) para iniciar el servidor JBoss EAP. Si no ve una pestaña Servers (Servidores) o aún no definió un servidor, añada el servidor JBoss EAP a JBoss Developer Studio. Consulte Uso de la detección del tiempo de ejecución para configurar JBoss EAP desde dentro de IDE en la guía Inicio de las herramientas de JBoss Developer Studio.
  3. Haga clic derecho en el proyecto bean-validation en la pestaña Project Explorer (Explorador de proyectos) y seleccione Run As (Ejecutar como) Maven Build.
  4. Entre lo siguiente en el campo de entrada Goals y luego haga clic en Run.

    clean verify -Parq-remote

    Figura 3.6. Modifique la configuración

    The *Edit Configuration* window.
  5. Verifique los resultados

    La pestaña Console muestra los resultados de las pruebas 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. Ejecute los Inicios rápidos mediante la línea de comandos

Puede construir e implementar fácilmente los inicios rápidos desde la línea de comandos usando Maven. Si aún no tiene instalado Maven, por favor consulte el proyecto Apache Maven para descargarlo e instalarlo.

Se proporciona un archivo README.md en el directorio raíz de los inicios rápidos que contiene información general sobre los requisitos del sistema, configuración de Maven, adición de usuarios y ejecución de los inicios rápidos.

Cada inicio rápido contiene su propio archivo README.md que proporciona instrucciones específicas y los comandos Maven para ejecutarlo.

Ejecute el Quickstart helloworld desde la línea de comandos

  1. Revise el archivo README.md en el directorio raíz del inicio rápido helloworld .
  2. Inicie el servidor JBoss EAP

    $ EAP_HOME/bin/standalone.sh
  3. Navegue al directorio de inicio rápido helloworld.
  4. Compile e implemente el inicio rápido mediante el comando de Maven provisto en el archivo README.md del inicio rápido.

    $ mvn clean install wildfly:deploy
  5. La aplicación helloworld está disponible en http://localhost:8080/helloworld y muestra el texto Hello World! (¡Hola, mundo!).

3.4. Revisar los ejemplos de inicios rápidos

3.4.1. Exploración del inicio rápido helloworld

El inicio rápido helloworld le muestra cómo implementar un servlet simple en JBoss EAP. La lógica empresarial está encapsulada en un servicio, el cual se ofrece como un bean de Inyección de contextos y dependencia (CDI) y se inyecta en el Servlet. El inicio rápido es un punto de partida para asegurarse de haber configurado e iniciado su servidor correctamente.

Las instrucciones detalladas para compilar e implementar este inicio rápido mediante la línea de comando se puede encontrar en el archivo README.html en la raíz del directorio de inicio rápido helloworld. Este tema le explica cómo usar Red Hat JBoss Developer Studio para ejecutar el inicio rápido y asume que usted ha instalado Red Hat JBoss Developer Studio, configurado Maven, e importado y ejecutado correctamente el inicio rápido helloworld.

Prerrequisitos
Examine la estructura del directorio

El código para el inicio rápido helloworld se puede encontrar en el directorio QUICKSTART_HOME/helloworld/. El inicio rápido helloworld está compuesto por un Servlet y un bean de CDI. También contiene un archivo beans.xml en el directorio WEB-INF/ de la aplicación, cuyo número de versión es 1.1, y un bean-discovery-mode de all. Este archivo marcador identifica el WAR como un archivo bean y le ordena a JBoss EAP que busque beans en esta aplicación y que active la CDI.

El directorio src/main/webapp/ contiene los archivos para el inicio rápido. Todos los archivos de configuración de este ejemplo se encuentran en el directorio WEB-INF/ dentro de src/main/webapp/, incluido el archivo beans.xml. El directorio src/main/webapp/ también incluye un archivo index.html, que usa una simple actualización meta para redirigir el navegador del usuario al Servlet, el cual se localiza en http://localhost:8080/helloworld/HelloWorld. El inicio rápido no requiere un archivo web.xml.

Examine el código

La declaración del paquete y las importaciones se han excluido de este listado. El listado completo está disponible en el código fuente del inicio rápido.

  1. Revise el código HelloWorldServlet.

    El archivo HelloWorldServlet.java se encuentra en el directorio src/main/java/org/jboss/as/quickstarts/helloworld/. Este servlet envía la información al navegador.

    Ejemplo: Código de clase 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 }

    Tabla 3.1. Detalles de HelloWorldServlet
    LíneaNota

    43

    Todo lo que debe hacer es añadir la anotación @WebServlet y proporcionar una asignación a una URL usada para acceder al servlet.

    46-48

    Toda página web necesita HTML formado de manera correcta. Este inicio rápido usa cadenas estáticas para escribir la salida de pie de página y de encabezados mínimos.

    50-51

    Estas líneas inyectan el bean de CDI HelloService, el cual genera el propio mensaje. Mientras no alteremos la API de HelloService, este enfoque nos permite alterar la implementación de HelloService posteriormente, sin modificar la capa de vista.

    58

    Esta línea llama al servicio para generar el mensaje "Hello World" y escribirlo en la petición HTTP.

  2. Revise el código HelloService.

    El archivo HelloService.java está localizado en el directorio src/main/java/org/jboss/as/quickstarts/helloworld/. Este servicio simplemente devuelve un mensaje. No se necesita registro de XML o anotación.

    Ejemplo: Código de clase HelloService

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

3.4.2. Explore el inicio rápido de numberguess

El inicio rápido numberguess le explica cómo crear e implementar una aplicación no persistente simple en JBoss EAP. La información se muestra usando una vista JSF y la lógica empresarial se encapsula en dos beans de CDI. En el inicio rápido numberguess, tiene diez intentos de adivinar un número entre 1 y 100. Después de cada intento, se le indica si su tentativa fue muy alta o muy baja.

El código para el inicio rápido numberguess se puede encontrar en el directorio QUICKSTART_HOME/numberguess/, donde QUICKSTART_HOME es el directorio en el que descargó y descomprimió los inicios rápidos de JBoss EAP. El inicio rápido numberguess está compuesto por un número de beans, archivos de configuración, y vistas de Facelets (JSF), y viene empaquetado como un módulo WAR.

Las instrucciones detalladas para desarrollar e implementar este inicio rápido usando la línea de comando se pueden encontrar en el archivo README.html en la raíz del directorio de inicio rápido numberguess. Los siguientes ejemplos usan Red Hat JBoss Developer Studio para ejecutar el inicio rápido.

Prerrequisitos
Examine los archivos de configuración

Todos los archivos de configuración para este ejemplo se localizan en el directorio QUICKSTART_HOME/numberguess/src/main/webapp/WEB-INF/ del inicio rápido.

  1. Examine el archivo faces-config.xml.

    Este inicio rápido usa la versión JSF 2.2 del nombre del archivo faces-config.xml. El controlador de vista predeterminado en JSF 2.2 es una versión estandarizada de Facelets, por lo que no necesita configuración. Este archivo consiste del elemento raíz solamente y es simplemente un archivo marcador para indicar que JSF se debe habilitar en la aplicación.

    <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. Examine el archivo beans.xml.

    El archivo beans.xml cuenta con un número de versión 1.1 y un bean-discovery-mode de all. Este archivo marcador identifica el WAR como un archivo bean y le ordena a JBoss EAP que busque beans en esta aplicación y que active la 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>
Nota

El inicio rápido no necesita el archivo web.xml.

3.4.2.1. Examine el código JSF

JSF usa la extensión del archivo .xhtml para archivos de origen, pero entrega las vistas mostradas con la extensión .jsf. El archivo home.xhtml se localiza en el directorio src/main/webapp/.

Ejemplo: Código de origen 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>

Los siguientes números de línea corresponden a los que se ven al visualizar el archivo en JBoss Developer Studio.

Tabla 3.2. Detalles de JSF
LíneaNota

36-40

Estos son los mensajes que se pueden enviar al usuario: "Higher!" y "Lower!"

45-48

Cuando el usuario empieza a adivinar, el rango de números se empieza a volver más pequeño. Esta oración cambia para asegurarse de que sepan el rango válido de números a adivinar.

55-58

Este campo de entrada está enlazado a una propiedad bean usando una expresión de valor.

58

Un enlace validador se utiliza para asegurarse de que el usuario no ingrese de manera accidental un número por fuera del rango de adivinanza. Si el validador no está presente entonces puede que el usuario use un intento por fuera de los límites de la adivinanza.

59-61

Debe haber una manera de que el usuario envíe su intento al servidor. Aquí enlazamos a un método de acción al bean.

3.4.2.2. Examine los archivos de clases

Todos los archivos de origen del inicio rápido numberguess se pueden encontrar en el directorio QUICKSTART_HOME/numberguess/src/main/java/org/jboss/as/quickstarts/numberguess/. La declaración del paquete y las importaciones se han excluido de este listado. El listado completo está disponible en el código fuente del inicio rápido.

  1. Revise el Código del calificador Random.java.

    Se utiliza un calificador para eliminar la ambigüedad entre dos beans, cuando ambos son eligibles para inyección según su tipo. Para obtener más información sobre los calificadores, consulte Usar un calificador para resolver una inyección ambigua en la Guía de desarrollo de JBoss EAP. El calificador @Random se usa para inyectar un número aleatorio.

    @Target({ TYPE, METHOD, PARAMETER, FIELD })
    @Retention(RUNTIME)
    @Documented
    @Qualifier
    public @interface Random {
    
    }
  2. Revise el Código del calificador MaxNumber.java.

    El calificador @MaxNumber se usa para inyectar la cantidad máxima permitida.

    @Target({ TYPE, METHOD, PARAMETER, FIELD })
    @Retention(RUNTIME)
    @Documented
    @Qualifier
    public @interface MaxNumber {
    }
  3. Revise el Código Generator.java.

    La clase Generator crea el número aleatorio a través de un método de productor, exponiendo el máximo número posible a través de este. Esta clase tiene el alcance de la aplicación, por lo que no obtiene un número aleatorio diferente cada vez.

    @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. Revise el Código Game.java.

    La clase Game con alcance de la sesión es el principal punto de entrada de la aplicación. Es responsable de configurar o reconfigurar el juego, capturar y validar los intentos del usuario, y proporcionar una retroalimentación al usuario mediante un FacesMessage. Usa el método de ciclo de vida posterior al desarrollo para iniciar el juego, obteniendo un número aleatorio del bean @Random Instance<Integer>.

    Observe la anotación @Named en la clase. Esta anotación solo es requerida cuando desea que el bean sea accesible a una vista JSF mediante el lenguaje de expresión (Expression Language, EL), en este caso, #{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);
            }
        }
    }
Red Hat logoGithubRedditYoutubeTwitter

Aprender

Pruebe, compre y venda

Comunidades

Acerca de la documentación de Red Hat

Ayudamos a los usuarios de Red Hat a innovar y alcanzar sus objetivos con nuestros productos y servicios con contenido en el que pueden confiar. Explore nuestras recientes actualizaciones.

Hacer que el código abierto sea más inclusivo

Red Hat se compromete a reemplazar el lenguaje problemático en nuestro código, documentación y propiedades web. Para más detalles, consulte el Blog de Red Hat.

Acerca de Red Hat

Ofrecemos soluciones reforzadas que facilitan a las empresas trabajar en plataformas y entornos, desde el centro de datos central hasta el perímetro de la red.

© 2024 Red Hat, Inc.