jueves, 6 de agosto de 2015

Glassfish y la consola de Administración

Bienvenidos a nuevo post, esta vez, hablaré un poco acerca del servidor de aplicaciones Glassfish.

Trataremos principalmente estos temas:
  • Iniciar el servidor Glassfish
  • Abrir la consola de Administración del servidor
  • Desplegar nuestra aplicación en dicho servidor
  • Poner una contraseña a la consola de administración
  • Detener el servidor
Nota: Si las imagenes de este post no se ven, inténtalo con otro navegador.

3.1. Iniciar el servidor Glassfish.

Primero, para ejecutar los comandos que se exponen a continuación, debes defirnir en la variable PATH de tu equipo, la ruta donde se encuentra instalado el servidor Glassfish + la carpeta bin. En mi caso sería:
;C:\Archivos de programa\sges-v3\bin
(Nota el punto y coma al inicio)
Ahora, abre la consola de comandos de tu sistema operativo y escribe "asadmin", obtendrás algo asi:
C:\Documents and Settings\Usuario> asadmin
Utilice "exit" para salir y "help" para obtener ayuda en línea
asadmin >
Si te sale, el típico mensaje de "asadmin no se reconoce como un comando interno o externo", fue porque no configuraste bien el PATH, así que simplemente abre "asadmin.bat" que está en la carpeta bin donde está instalado Glassfish.
Ahora, escribimos el comando "start-domain domain1":
asadmin > start-domain  domain1
Esperando inicio del DAS .........
El comando start-domain se ha ejecutado correctamente.
asadmin >
Con eso hemos iniciado correctamente el servidor.

3.2. La consola de Administración.

Si has ejecutado correctamente los comandos de la sección 3.1, escribe en tu navegador la siguiente URL:
http://localhost:4848
inicio de sesión
El usuario y la contraseña para iniciar sesión son:
Usuario: admin
Contraseña: adminadmin
Se abrirá la "consola" de administracón de Glassfish:
consola de glassfish
Ahora ya podemos desplegar la aplicación que hicimos en el pasado post..

3.3. Desplegar .WAR en el servidor

En el menú izquierdo de la consola de administración, dirígete a Aplicaciones:
menu
Ahora, da clic en el boton Implementar:
boton
Cargamos el archivo ".war" al servidor con el botón "Seleccionar Archivo" y luego das clic en "Aceptar" en la parte superior:
cargar war
Ahora, ya está instalado, da clic en Iniciar y verás algo como esto:
iniciar
inciado

3.4. Cambiar la contraseña.

Para cambiar la contraseña simplemente en el menú ve a "Enterprise Server":
menu2
Vé a la pestaña "Contraseña del Administrador" e ingresa la nueva contraseña, guardas los cambios:
nueva

3.5. Detener el servidor.

Vé a la consola de comandos, y escribe stop-domain domain1:
asadmim > stop-domain domain1
Esperando a que se detenga el dominio ...
El comando stop-domain se ha ejecutado correctamente.
asadmin >

Bueno, eso es todo por ahora, comentarios, sugerencias y criticas son bienvenidas

Error The module has not been deployed [netbeans+glassfish]

Si les salen el mensaje de Error The module has not been deployed [netbeans+glassfish], pues veran que es glassfish.
1- entrar mediante consola al directorio de instalacion de glassfish/bin
2- ejecutar: asadamin start-domain, esto inicia glassfish.
3- tipear en el browser http://localhost:4848, en la izquierda hacer click en Domain, luego click en el botón "Administrator Password". Hay que poner una clave. Guardar.
4- Esos mismos datos hay que ponerlos en Netbeans, configurando el server glassfish. Hay que entrar por el menú Tools/Servers, ahi aparece para ingresar user name y password.

Ahora funciona.

Validar si un dato es numérico en Java

Navegando por los diferentes foros de la red me encuentro con la siguiente pregunta. ¿Cómo puedo validar si un dato es numerico en Java? A uno le puede parecer una pregunta muy básica y típica de alguien que ni siquiera se ha leido la documentación, pero la cuestión es que es una duda que existe.
De hecho, la gente busca el método isNumeric(String). Que, a día de hoy, no existe dentro de las APIs deJava, si bien, si que existe en algunas otras librerias de renombre, como puede ser en Apache Commons, en concreto org.apache.commons.lang.StringUtils.isNumeric().
Y es que en muchos casos nos vamos a encontrar con origenes de datos, donde de una forma explicita no vengan definidos como numeros. Esta claro que una base de datos que alberga enteros lleva la validación implicita, que un WebService (o un simple método Java) identificará los campos como numéricos,... Pero que sucede si estamos leyendo un fichero. Este de forma implicita no lleva ninguna validación. Es en este tipo de casos donde será bueno el realizar este tipo de validaciones. (Cierto es que podríamos realizar una lectura directa sobre enteros).
Para poder resolver esta duda la idea es la siguiente. Partimos de las dos siguientes variables:
  1. String cadenaUno = "1234";
  2. String cadenaDos = "No soy un numero";
Ahora tenemos que codificar el método isNumeric(String), el cual podemos utilizar a posteriori para validar las cadenas. Esto lo haremos de la siguiente forma:
  1. if (Comunes.isNumeric(cadenaUno))
  2. System.out.println(cadenaUno + " es un numero");
  3. else
  4. System.out.println(cadenaUno + " NO es un numero");
  5.  
  6. if (Comunes.isNumeric(cadenaDos))
  7. System.out.println(cadenaDos + " es un numero");
  8. else
  9. System.out.println(cadenaDos + " NO es un numero");
El método isNumeric(string) se apoyará en la clase Integer. La idea consiste en transformar la cadena en un número. En el caso de que resulte bien, es que la cadena es un número (obvio), si falla, es que nuestra cadena no será un número.
isNumeric será un método estático de la clase Comunes. Es por ello que su utilización es la de Comunes.isNumeric(String).
El método de Integer que nos permite transformarlo en numerico es .parseInt(String). Si va bien devuelve el entero, sino genera la excepción NumberFormatException. De esta forma nuestro método quedará de la siguiente forma:
  1. private static boolean isNumeric(String cadena){
  2. try {
  3. Integer.parseInt(cadena);
  4. return true;
  5. } catch (NumberFormatException nfe){
  6. return false;
  7. }
  8. }
Este método es válido para ciertos propositos, pero no tenemos que olvidar que existen números más grandes que deberían de ser tratados con clases como Long o Double. Es decir, que nuestro método isNumeric(String) podría ser un poco más complejo.
Desde aquí animo a que alguien genere la posibe implementación, y lo publicaremos en Linea de Codigo.

Vídeos sobre Java Básico


Convertir String a int en Java y viceversa

A continuación unas pequeñas recetas de java para pasar de cadena a entero o de entero a cadena.

Para convertir un String (cadena) a int (entero) hay que emplear el método estático de la clase Integer, parseInt

Ejemplo:


String enteroString = "5";
int entero = Integer.parseInt(enteroString);


Para convertir int(entero) a String sólo debemos hacer una llamada al método estático de la clase Integer, toString

Ejemplo:


int entero = 1;
String enteroString = Integer.toString(entero);



Análogamente para pasar de cadena a double tenemos el método Double.parseDouble

Ejemplo:


double aDouble = Double.parseDouble(aString);


o al revés (double a string) llamamos al método Double.toString

Ejemplo:


double d = 8342342;
System.out.println(Double.toString(d));


Tanto la clase Integer con la clase Double se encuentran en el package java.lang. Atención int y double son tipos primitivos del lenguaje java. Integer y Double son clases que representan estos tipos primitivos y le añaden más funcionalidades. Como por ejemplo las que acabamos de ver.

JSP - Generación de Páginas Dinámicas

Las páginas JSP son páginas HTML que se procesan dentro del web-container antes de ser enviadas al cliente que las requiere.

Para comenzar vemos que en un JSP podemos escribir scripts en Java. Se los llama scriptles y se escriben dentro de <% ... %>.

Para comenzar... nada mejor que analizar un holaMundo.jsp.



Dentro de un scriptlet podemos utilizar ciertos objetos que están definidos implicitamente como por ejemplo el objeto out.
Las JSP deben estar dentro del directorio de la aplicación web o en subdirectorios de este. En nuestro caso deben estar en el directorio hmapp.

Veamos otro ejemplo.



Pero podemos separar el código Java del código HTML simplemente abriendo y cerrando los scriptlets convenientemente.

Si estando en html necesitamos mostrar el valor de una variable Java podemos utilizar una expresión <%=...%>.



Vemos como abrimos y cerramos los scriptles para pasar de Java a HTML y de HTML a Java. Para mostrar el valor de la variable i(estando en HTML) utilizamos la expresión <%=i%>.

Podemos resumir los conocimientos sobre JSP aprendidos hasta aquí con las siguientes tablas.



Parámetros

Las páginas JSP pueden recibir parámetros. Los parámetros siempre son valores String y son pasados a la página por nombre.

Veamos el ejemplo de los números parametrizando la cantidad de números a mostrar.



Al invocar esta página debemos indicar el nombre de parámetro y su valor en el URL así:
http://localhost:8080/hmapp/numeros.jsp?n=20

Vemos que luego del recurso (en este caso la página numeros.jsp), los parámetros se indican despues del caracter “?”. El formato es:nomParam=Valor y si hubiera varios parámetros se los separa con “&”.

Modificaremos el ejemplo anterior para indicar desde hasta que números mostrar en la página.



Ahora debemos pasarle dos parámetros al momento de invocar la página JSP:

http://localhost:8080/SZ_ZWEB0/numeros.jsp?desde=20&hasta=40


Actualicemos la tabla de resumen de objetos implícitos y elementos de JSP:



Formularios

Para mejorar la aplicación anterior podemos desarrollar una página inicial que tenga un formulario con dos campos: desde y hasta de forma tal que el submit del formulario envie los valores tipeados en los campos como parámetros a la página numeros.jsp.



Cuando presionemos el botón “Enviar” la página invocará a numeros.jsp
(form action=“numeros.jsp”) pasándole como parámetro los valores que contengan los controles (input type =“text”) desde y hasta. Justamente el atributo name del control indica que nombre de parámetro se utilizará para enviar el valor.

El resultado es:



Incluir Páginas 

JSP permite construir páginas complejas a partir de la inclusión de otras más pequeñas y simples de resolver. Esto es una opción fundamental para desarrollar páginas.

Modificaremos la aplicación anterior para que se vea así:


Debemos modificar la página index.jsp para que incluya a la páginanumeros.jsp. Para esto utilizaremos la sentencia .



La salida de la página incluida (numeros.jsp) aparecerá exactamente donde esté la sentencia .

Veamos la página numeros.jsp modificada para ser incluida en la página principal.



Notemos que ahora la página numeros.jsp no tiene los tags html ybodyEsto es porque está incluida dentro de otra página que (probablemente) ya tendrá estos tags.


La Sesión Web

La sesión es el recurso que tenemos (como programadores web) para identificar a un cliente dentro de nuestra aplicación.

Por cada cliente (usuario) que accede a nuestra aplicación web el container le asigna un sessionId único para toda la corrida de la aplicación.

Recordemos que HTTP funciona en modo request/response. Esto significa que el cliente (navegador) envia un request (pidiendo una página jsp) y el container le envia como respuesta un response.


Lo anterior implica que la única comunicación que existe entre el navegador y el server es el request/response. No vuelve a haber otra comunicación hasta el próximo request y su correspondiente response.

La sesión nos permite contener los objetos relacionados a cada usuariode la aplicación.

Veamos un ejemplo:



En esta página basicamente seteamos en la sesión (como atributo) un objeto Date inicializado con la fecha y hora actual.

El if( d==null ) es para verificar que el objeto sea seteado solo la primera vez que el usuario ingresa a la página (esto es obsoleto, luego lo reemplazaremos por un session listener).

En la otraPagina.jsp simplemente tomamos de la sesión el atributo “fechahora” y lo mostramos.



Notemos que para desarrollar este ejemplo utilizamos el objeto implícito session y un nuevo elemento de JSP: una directiva <%@ ... %>. Con las directivas podemos (entre otras cosas) importar paquetes Java.

Actualicemos la tabla de resumen:



Session Listener

El manejo que hicimos en el ejemplo anterior (controlar “la primera vez” con un if) no es el más prolijo ni tampoco el más seguro.

Que pasa si por algún motivo el usuario accede directamente a la segunda página? La salida será: “Yo recuerdo que usted llego a las:null”.

J2ee permite definir listeners “clases que escuchan”. En particular los session listeners son clases que escuchan eventos web.

Los session listeners son clases java que implementan la interfaceHttpSessionListener y están registradas (como listeners) en el web.xmlde la aplicación web. Luego el container los notifica cada vez que se crea una sesión y cada vez que se destruye.

Implementaremos el ejemplo anterior utilizando el session listenerEscuchaSession.java

Paso 1 (de 3): Escribir la clase EscuchaSession.java que implementa HttpSessionListener.



Paso 2 (de 3): Modificar el archivo web.xml para registrar la clase como listener.



Paso 3 (de 3): Modificar la página index.jsp. Simplemente podemos tomar de la sesión el objeto fechahora y utilizarlo.



Antes de que el usuario acceda a cualquier página el container invocará al método sessionCreated() del listener EscuchaSession.

Entonces en nuestra página simplemente tomamos el objeto fechahora de la sesión y lo utilizamos. No necesitamos verificar si existe o no porque estamos seguros de que existe.

El container nos garantiza que cada vez que se cree una sesión, primero se notificará al listener.


Implementando un Changuito de Compras

Desarrollaremos la siguiente aplicación.



La funcionalidad de esta aplicación es simple. El usuario ingresa un ítem y presiona el botón “Agregar”. Luego el ítem se incorpora a la lista. Los ítems pueden eliminarse clickeando en el link [Borrar].


Análisis

Tendremos dos páginas: index.jsp y listaItems.jsp. La primera tendrá el formulario (para que el usuario tipee el ítem) e incluirá a la segunda.

Los items que vaya acumulando cada usuario los mantendremos en un Vector en la sesión.

Para simplificar el desarrollo y hacer el código más simple y claro introduciremos el concepto de páginas de presentación y páginas de proceso. Veamos el gráfico:



Vemos que el action del formulario envia la información a una página que llamaremos agregaItemPRO.jsp. Esta página recibe el ítem como parámetro y debe agregarlo al vector de ítems que está publicado en la sesión. Luego “forwardea” a la página principal (index.jsp).

La página listaItems.jsp toma el vector de la sesión, lo itera y muestra la lista de ítems.

Por último, los links deben enviar como parámetro (a la páginaborraItemPRO.jsp) la posición del ítem a borrar. Esta página recibe ese valor, toma el vector de la sesión y le elimina el elemento en la posición indicada. Luego forwardea a la página principal.

Las páginas agregaItemPRO.jsp y borraItemPRO.jsp son páginas de proceso porque simplemente procesan los datos y luego forwardean a la página de presentación (en este caso: index.jsp).

Las páginas de proceso solo tienen código Java. Más adelante veremos como aplicando el patrón de diseño MVC (Model View Controller) estas páginas serán reemplazadas por clases Java.











Debemos agregar a la tabla de elementos JSP el objeto implícitopageContext.




Ciclo de Vida de las Páginas JSP

Las páginas JSP son servlets. El container convierte el código JSP en un código Java correspondiente a un servlet equivalente, lo compila y lo instancia. Este proceso lo realiza cada vez que se verifique que la fecha/hora del .class sea menor que la fecha/hora del .JSP.

Una vez que el servlet está generado entonces responde al ciclo de vida de los servlets.

Los servlets se instancian y la instancia permanece activa hasta que el container decida bajarla.

Una misma instancia es capáz de atender varios requerimientos. Esto hace que las variables de instancia tengan un efecto de “persistencia”. Sin embargo, esta misma característica hace que las variables de instancia sean variables compartidas entre los diferentes usuarios que acceden al servlet (o JSP que es lo mismo).

El siguiente gráfico explica lo anterior.



Vemos que una misma instancia del servlet atiende más de un request aún si los request provienen de diferentes usuarios (sesiones, host, etc).


Declaraciones <%! ... %>

Con las declaraciones podemos definir variables de instancia y métodos en las páginas JSP.



Ahora podemos probar de acceder a esta página desde diferentes navegadores y veremos como se incrementa el contador.

El siguiente ejemplo muestra como podemos utilizar las expresiones para definir métodos.



Obviamente no es la idea programar métodos en las páginas JSP, pero a veces ayudan a procesar Strings, fechas, etc.