martes, 12 de mayo de 2020

Instalando Payara Server con Eclipse IDE

Oracle detuvo el soporte comercial para GlassFish hace unos años, en respuesta la comunidad libre al mismo estilo de MariaBD con MySQL creo Payara, que es un servidor de aplicaciones Java EE de código abierto que se bifurcó en 2014. De esta manera, las compañías que anteriormente usaban GlassFish comercialmente podrían cambiar sin esfuerzo a Payara y continuar disfrutando del soporte comercial. Gracias al soporte comercial para clientes comerciales que anteriormente usaban GlassFish, el software del servidor de aplicaciones Payara se puede corregir y mejorar continuamente.

Descargar Payara Server

Ingresar a su página web: https://www.payara.fish/  y buscar la sección de descargas donde se debe elegir la opción de Payara Server Full, lo bueno es que es gratis.

Se obtendrá un archivo comprimido .zip que se debe descomprimir en el disco. Eso es todo.

Pasos para configurar en Eclipse

Desde el Marketplace de Eclipse descargamos e instalamos el GlassFish Tool o Payara Tool, con ambos se puede realizar la configuración. En este caso se emplea la segunda opción, el proceso es prácticamente el mismo.



Se crea un nuevo servidor siguiendo esta secuencia



Se selecciona la opción Server



En la selección se marca Payara, si usan el GlassFish Tool se debe ubicar en Oracle. Colocar un nombre, en este caso Payara5



Ingresar la ubicación donde está descomprimido el archivo descargado.



Verificar los siguientes datos, no es necesario realizar cambios, darle clic a finalizar.



En la pestaña de Servers se puede ubicar el nuevo servidor, para iniciarlo solo le damos clic derecho y la opción Start o Iniciar.



El servidor se iniciará



Para probar un proyecto se debe ejecutar en un servidor como se indica a continuación:


Si todo fue correctamente instalado y configurado se iniciará en el navegador el proyecto

Fuentes:

  • Schotlz, B. y Tijms, A. (2018). The Definitive Guide to JSF in Java EE 8:Building Web Applications with JavaServer Faces. United States of America: Apress.


viernes, 1 de mayo de 2020

Polimorfismo

Dentro de las características del paradigma de la programación orientada a objetos una de ellas es el polimorfismo.

Dentro de JAVA esta característica permite que un objeto interactúe de forma diferente en relación de los parámetros con los que un método es invocado o mediante especialización de un método que es heredado, de ahí la estrecha relación entre el polimorfismo y la herencia.


Polimorfismo por parámetros

Se produce cuando existen funciones con el mismo identificador en una misma clase donde se diferencian por la cantidad y/o nombre de parámetros

package entidades;

public class Calculadora{
 
 public Calculadora(){
  //Constructor
 }
 
 public Double procesar(Double a){
  return a*2;
 }
 
 public Double procesar(Double a, Double b){
  return a*b;
 }
 
 public Double procesar(Double a, Double b, Double c){
  return a+b+c;
 } 
}


Polimorfismo por inclusión

Se produce mediante el uso de interfaces, de forma que las clases especializadas desconocen la implementación de las funciones entre ellas.

package entidades;

public abstract class AbstractCalculadora{ 
 public Double procesar(); 
}


package entidades;

public class Calculadora extends AbstractCalculadora{ 
 private Double a;
 private Double b;
 private Double c;
 
 public Calculadora(Double a, Double b, Double c){
  this.a=a;
  this.b=b;
  this.c=c;  
 }
 
 @Override
 public Double procesar(){
  return a+b+c;
 }
}


Fuentes:

  • Flanagan, D. (2002). JAVA IN A NUTSHELL Desktop Quick Reference (4a ed.). England: Pearson Education.


Clases y métodos abstractos

Método abstracto

Java nos permite definir un método sin implementarlo declarando el método con el modificador abstracto. Un método abstracto no tiene cuerpo; simplemente tiene una definición de firma seguida de un punto y coma.

// Ejemplo de método abstracto
public abstract String saludo();


Clase abstracta

Una clase abstracta es aquella cuya implementación es incompleta y no puede ser instanciada. Cualquier clase con uno o más métodos abstractos debe declararse abstracta.

// Ejemplo de clase abstracta

public abstract class SerVivo{
   //Atributos

   //Métodos

}


Consideraciones

  • Cualquier clase con un método abstracto se abstrae automáticamente y debe declararse como tal.
  • La clase abstracta no puede ser instanciada.
  • Una subclase de una clase abstracta se puede instanciar solo si invoca a cada uno de los métodos abstractos de su superclase y proporciona una implementación para todos ellos. Dicha clase a menudo se denomina subclase concreta, para enfatizar el hecho de que no es abstracta.
  • Si una subclase de una clase abstracta no implementa todos los métodos abstractos que hereda, esa subclase es en sí misma abstracta.
  • Los métodos estáticos, privados y finales no pueden ser abstractos, ya que estos tipos de métodos no pueden ser anulados por una subclase. Del mismo modo, una clase final no puede contener ningún método abstracto.
  • Una clase puede declararse abstracta incluso si en realidad no tiene ningún método abstracto. Declarar dicho resumen de clase indica que la implementación está de alguna manera incompleta y está destinada a servir como una superclase para una o más subclases que completarán la implementación. Tal clase no puede ser instanciada.


Ejemplo en código

Se creó dos clases, una abstracta llamada "Figura" y otra común llamada "Cuadrado", la primera tiene dos métodos abstractos y es la superclase de la segunda, esto implica que los dos métodos se deben implementar en la clase hija o subclase.
package entidades;

public abstract class Figura {
 
 public abstract Double area();
 public abstract Double perimetro();

}


package entidades;

public class Cuadrado extends Figura{
 private Double lado;
 
 public Cuadrado(Double lado) {
  super();
  this.lado = lado;
 }

 @Override
 public Double area() {
  return Math.pow(lado, 2);
 }

 @Override
 public Double perimetro() {  
  return 4*lado;
 }

 public Double getLado() {
  return lado;
 }

 public void setLado(Double lado) {
  this.lado = lado;
 } 
 
}

package test;

import entidades.Cuadrado;

public class Ejecutor {
 public static void main(String[] args) {
  Cuadrado cuadrado = new Cuadrado(3d);
  System.out.println("Medida del lado: " + cuadrado.getLado().toString());
  System.out.println("Área: " + cuadrado.area().toString());
  System.out.println("Perímetro: " + cuadrado.perimetro().toString());
 }
}

Salida:

Medida del lado: 3.0
Área: 9.0
Perímetro: 12.0

Esquema del proyecto:



Fuentes:

  • Flanagan, D. (2002). JAVA IN A NUTSHELL Desktop Quick Reference (4a ed.). England: Pearson Education.


lunes, 27 de abril de 2020

Reutilización de código aplicando herencia en POO

En java podemos implementar herencia simple de la siguiente manera para optimizar la reutilización de código:

Diagrama UML

Supongamos que tenemos 3 clases que comparten tanto atributos como métodos, si construimos la clase para cada uno de ellos tendríamos código repetido.



Podemos representar lo mismo abstrayendo una clase base que concentre los atributos y métodos que se repetirán en las demás clases derivadas.


Codificación

Clase base:
package dto;

public class Personas {
 protected Integer id;
 protected String nombre;
 protected String apellidos;
 protected String correo;
 protected String telefono;

 public Personas() {
 }

 public Personas(Integer id, String nombre, 
   String apellidos, String correo, String telefono) {
  this.id = id;
  this.nombre = nombre;
  this.apellidos = apellidos;
  this.correo = correo;
  this.telefono = telefono;
 } 
 
 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getNombre() {
  return nombre;
 }

 public void setNombre(String nombre) {
  this.nombre = nombre;
 }

 public String getApellidos() {
  return apellidos;
 }

 public void setApellidos(String apellidos) {
  this.apellidos = apellidos;
 }

 public String getCorreo() {
  return correo;
 }

 public void setCorreo(String correo) {
  this.correo = correo;
 }

 public String getTelefono() {
  return telefono;
 }

 public void setTelefono(String telefono) {
  this.telefono = telefono;
 }

 public void logIn() {

 }

 public void logOut() {

 }
}

Clases derivadas:
package dto;

public class Clientes extends Personas{

 private String pais;
 
 public Clientes() {
  super();
 }

 public Clientes(Integer id, 
   String nombre, 
   String apellidos, 
   String correo, 
   String telefono, 
   String pais) {
  super(id, nombre, apellidos, correo, telefono);
  this.pais = pais;
 }

 public String getPais() {
  return pais;
 }

 public void setPais(String pais) {
  this.pais = pais;
 }
 
 public void comprar() {
  
 }

}








Creando una clase en Java

En el paradigma de la programación orientada a objetos (POO) existen diversos principios como la abstracción, polimorfismo, persistencia, etc. que requieren de objetos para llevar a cabo sus cometidos. Estos objetos deben ser creados a partir de una plantilla que son las clases. Por lo tanto, para crear un objeto es necesario haber definido una clase.

  • Para ver información sobre la programación orientada a objetos has clic aquí.
  • Para ver información sobre la definición y conceptos de clases y objetos has clic aquí.

Vamos a definir una situación donde debemos crear un programa para una veterinaria, en la cuál se atenderá múltiples animales, entre ellos a los perros y nos centraremos en este tipo de animales (obviaremos conceptos de herencia por ahora).

Definimos que cada perro debe tener un identificador único que podemos llamar "idPerros" el DNI de su propietario, el nombre del perro y un campo con toda su descripción (ahí podemos colocar color, raza, tamaño, peso, etc). Por motivos de simplificación de código vamos a juntar todas esas características en un solo atributo. Además, debemos definir el nombre de la clase que puede ser "Perro" o "Perros".

Teniendo así el siguiente código:
package dto; //Ubicación en el proyecto

/* Nombre de la clase*/
public class Perros {   

   /* Atributos */
   private Integer idPerro;
   private String dniPropietario;
   private String nombre;
   private String descripcion; 

   /* Método constructor */
   public Perros() {
   }

   /* Métodos Setter y Getter */
   public Integer getIdPerro() {
      return idPerro;
   }
   public void setIdPerro(Integer idPerro) {
      this. idPerro = idPerro;
   }
   public String getDniPropietario() {
      return dniPropietario;
   }
   public void setDniPropietario(String dniPropietario) {
      this. dniPropietario = dniPropietario;
   }
   public String getNombre() {
      return nombres;
   }
   public void setNombre(String nombre) {
      this.nombre = nombre;
   }
   public String getDescripcion() {
      return descripcion;
   }
   public void setDescripcion(String descripcion) {
      this. descripcion = descripcion;
   }
}

Se aprecia que tenemos un método constructor sin parámetros, por lo que al crear un objeto (instanciar) este tendrá su contenido vacío y mediante los métodos "set" le asignaremos valores a sus atributos para luego llamarlos mediante los métodos "get". Aquí observamos, además, el principio de encapsulamiento donde tenemos niveles de acceso "privados" y "públicos".

Herencia

La herencia es una de las características de la POO (programación orientada a objetos), pero no es exclusiva de los lenguajes de programación orientados a objetos. Consiste en que una clase recibe los atributos y métodos de otra clase en este sentido se tiene:
  • Clase base, clase padre o superclase que "hereda" sus atributos y métodos a otra clase.
  • Clase derivada, clase hija o subclase que "hereda" sus atributos y métodos de otra clase.

Los objetivos de emplear la herencia en la programación es la reutilización de código (clic aquí para ver un ejemplo de reutilización de código en un caso práctico), especialización de clases (principio abierto/cerrado) y aprovechar las ventajas el polimorfismo (característica más importante en los lenguajes OO), de esta manera se aumenta la productividad en la etapa de desarrollo produciendo programas con alta fidelidad y eficiencia. Además, se reduce el esfuerzo necesario para el mantenimiento del programa luego de su implementación.

Herencia simple

La herencia simple es aceptada por Java y se produce cuando una o más clases heredan métodos y atributos de otra única clase. Es decir existe una sola clase base y una o más clases derivadas. La palabra reservada en el lenguaje java para indicar herencia es "extends".

Consideraciones

  • En el momento de programar, nos daremos con la sorpresa que los constructores no se heredan y para hacer uso de ellos se debe emplear el método "super" en el constructor de la clase derivada.
  • Si aplicamos herencia, es una buena práctica hacer un llamado al constructor de la clase base (método "super")
  • La clase derivada hereda todos los métodos de la clase base, pero no puede acceder directamente a los atributos, pues tienen un nivel acceso "privado".
  • Para que los métodos de una superclase sean accesibles por una subclase se deben modificar sus niveles de acceso a "protegido" o "público".
  • Se pueden refinar los métodos en las clases hijas si el método tiene el mismo nombre en la clase hija y la clase padre.
  • Se puede llamar dentro de un método de la clase derivada el de la clase base mediante "super"
  • El modificados "final" en la clase base tiene diversos comportamientos según donde sea aplicado
    • En una variable, la convierte en una constante
      • Ejemplo: protected final String NOMBRE = "Jhon";
    • En un método, evita que pueda ser redefinido en la clase derivada.
    • En la clase (Ejemplo: public final class Autor {/* ... */}) evita que la clase pueda ser una clase padre, sería como la última clase hija en la jerarquía de clases.

Ejemplo

Supongamos una clase "Vehiculos" y una clase "Automoviles", donde "Automoviles" va heredar de la clase "Vehiculos":

Código de "Vehiculos"
package dto;

public class Vehiculos {

 private String nombre;
 private Double costo;
 private String marca;

 public Vehiculos(String nombre) {
  this.nombre = nombre;
 }

 public String getNombre() {
  return nombre;
 }

 public void setNombre(String nombre) {
  this.nombre = nombre;
 }

 public Double getCosto() {
  return costo;
 }

 public void setCosto(Double costo) {
  this.costo = costo;
 }

 public String getMarca() {
  return marca;
 }

 public void setMarca(String marca) {
  this.marca = marca;
 } 
}

Código de "Automoviles"
package dto;

public class Automoviles extends Vehiculos {

 private String modelo;
 private Float cilindrada;

 public Automoviles() {
    super("Automovil");
 }

 public String getModelo() {
    return modelo;
 }

 public void setModelo(String modelo) {
    this.modelo = modelo;
 }

 public Float getCilindrada() {
    return cilindrada;
 }

 public void setCilindrada(Float cilindrada) {
    this.cilindrada = cilindrada;
 }

 @Override
 public String toString() {
    return String.format(
     "Tipo de vehículo: %s\nMarca: %s\nModelo: %s\nCilindrada: %.2f\nCosto: $%.2f",
     getNombre(),getMarca(), modelo, cilindrada, getCosto());
 }
}

Ejecución
package test;

import dto.Automoviles;

public class Ejecutor {

 public static void main(String[] args) {
  Automoviles a = new Automoviles();
  a.setModelo("Elantra");
  a.setMarca("Hyundai");
  a.setCilindrada(16.4f);
  a.setCosto(25000d);
  System.out.println(a.toString());
 }
}

Estructura de los archivos:

Salida:

Tipo de vehículo: Automovil
Marca: Hyundai
Modelo: Elantra
Cilindrada: 16.40
Costo: $25000.00


Herencia múltiple

La herencia múltiple se da cuando una clase hija puede tener más de una clase padre, esto no es soportado de manera nativa por Java debido al problema del diamante y consideraciones que los desarrolladores del lenguaje, pues causaba más problemas que soluciones su uso. Por ello, para poder aplicar una herencia múltiple se considera dos tipos: a) herencia múltiple de implementación de clases (usando extends) y b) la herencia múltiple con implementación de tipos (empleando interfaces). La primera no es soportada por Java, pero la segunda sí mediante el uso de interfaces y la palabra reservada "implements", así ingresamos a la vez al mundo del polimorfismo (otra de las características de la POO y principal ventaja de los lenguajes de este tipo frente a otros por su facilidad de implementar).

Consideremos el siguiente caso donde la clase "Automoviles" debe heredar tanto de "Vehiculos" como de la clase "Activos". Podemos considerar crear una interfaz llamada "Activos" donde definimos los atributos que serían simplemente constantes y los métodos simplemente declarados, pero no implementados.

sábado, 28 de marzo de 2020

Contenedor Web

Un contenedor web es el encargado de administrar el ciclo de vida de los Servlets en las aplicaciones Java EE, asignar una URL a cada uno de estos en particular. Además, se encarga de garantizar quienes requieren del Servlet mediante la URL tengan los derechos de acceso correctos.

Un contenedor web en esta perspectiva se encarga de manejar solicitudes de los Servlets y de los archivos de páginas de servidor Java (JSP). Además, administra las solicitudes de archivos que incluyen código del lado del servidor.

Un contenedor web crea instancias de Servlet, mediante la carga y descarga de servlets, creando y gestionando objetos de solicitud y respuesta.


Como se aprecia en la imagen, una típica forma de aplicaciones Java EE, donde existe un repositorio de datos que la Aplicación Java EE emplea para generar una vista al cliente. Podemos ver en este caso el todo.

Los Contenedores Web o "Web Container" están dentro del servidor. El servidor se encarga de manejar los pedidos y respuestas HTTP, dentro de este. El contenedor web se encarga de la comunicación del Servlet y los JSP. Como se aprecia en la siguiente imagen.




Se aprecia en la imagen que el cliente realiza una petición a través claro de la interfaz del programa que puede ser un JSP, este instancia a la capa de modelo (que podría ser un DAO) y realiza operaciones con la fuente de datos dependiendo de la petición y se carga información en el JSP que es posteriormente mostrado al cliente.