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.
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.
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.
- Ingrese al Portal del cliente de Red Hat.
- Haga clic en Downloads.
- En la lista Product Downloads, haga clic en Red Hat JBoss Enterprise Application Platform.
- Seleccione 7.1 en el menú desplegable Version (Versión).
- Busque la entrada Red Hat JBoss Enterprise Application Platform 7.1.0 Quickstarts en la tabla y haga clic en Download (Descargar).
- Guarde el archivo ZIP para el directorio deseado.
- 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.
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.
- Inicie JBoss Developer Studio.
-
Seleccione File
Import. Seleccione Maven
Existing Maven Projects, luego haga clic en Next. Figura 3.1. Importación de proyectos existentes de Maven
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 archivopom.xml
del proyecto de inicio rápido seleccionado.Figura 3.2. Seleccione proyectos Maven
- 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.
- 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.
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
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
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
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 textoHello World!
(¡Hola, mundo!).
-
En la pestaña Server (Servidor), el estado del servidor JBoss EAP 7.1 cambia a
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.
-
Importe el inicio rápido
bean-validation
a JBoss Developer Studio. - 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.
-
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. 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
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
-
Revise el archivo
README.md
en el directorio raíz del inicio rápido helloworld . Inicie el servidor JBoss EAP
$ EAP_HOME/bin/standalone.sh
- Navegue al directorio de inicio rápido helloworld.
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
-
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
- 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.
-
Ejecute el inicio rápido
helloworld
. Para obtener instrucciones, consulte Ejecutar los inicios rápidos en JBoss Developer Studio. -
Verifique que el inicio rápido
helloworld
se haya implementado correctamente en JBoss EAP; para ello, abra un explorador web y acceda a la aplicación en http://localhost:8080/helloworld.
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.
Revise el código
HelloWorldServlet
.El archivo
HelloWorldServlet.java
se encuentra en el directoriosrc/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ínea Nota 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.
Revise el código
HelloService
.El archivo
HelloService.java
está localizado en el directoriosrc/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
- 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.
-
Ejecute el inicio rápido
numberguess
. Para obtener instrucciones, consulte Ejecutar los inicios rápidos en JBoss Developer Studio y reemplacehelloworld
connumberguess
en las instrucciones. -
Verifique que el inicio rápido
numberguess
se haya implementado correctamente en JBoss EAP abriendo un explorador web y accediendo a la aplicación en esta URL: http://localhost:8080/numberguess.
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.
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>
Examine el archivo
beans.xml
.El archivo
beans.xml
cuenta con un número de versión 1.1 y unbean-discovery-mode
deall
. 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>
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.
Línea | Nota |
---|---|
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.
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 { }
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 { }
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; } }
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 unFacesMessage
. 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); } } }