Persistencia de datos con Sqlite implementando JDBC.

Introducción

Hablar acerca de persistencia de datos con Sqlite, es considerar que la mayoría de aplicaciones requieren almacenar información. El objetivo puede ser la toma de decisiones, como es el caso de programas empresariales; o para mantener persistente una configuración de la misma aplicación. Podríamos requerir que esta información se almacene al lado del cliente o del servidor. En este artículo veremos cómo persistir nuestro datos del lado del cliente utilizando SQLite con Java.  Ahora que sabemos qué es SQLite y hemos dado nuestros primeros pasos con Maven, vamos a crear un pequeño proyecto en Java. A este proyecto lo nombraremos “jsqlite”. En él podremos hacer persistencia de datos con Sqlite implementando o utilizando JDBC puro.

El proyecto “jsqlite” estará desarrollado en Java y tendrá las siguientes características:

  • Portable
  • Lo podremos ejecutar desde una terminal
  • Creará la base de datos en el caso que no existiera.
  • Creará una tabla en el caso que no existiera.
  • También podremos agregar, listar, borrar y actualizar registros.
  • Está basado en patrones de diseño MVC y Singleton.

¿Qué es JDBC?

Java Database Connectivity es una API de Java con una colección de interfaces y clases. Nos ayuda a que los programas Java accedan a sistemas de gestión de bases de datos.
Las aplicaciones desarrolladas en Java, mediante las interfaces y clases estándar de JDBC, pueden hacer consultas escritas en el lenguaje de consulta estructurada (SQL). ¿Quieres saber más?

Desarrollo de jsqlite (Nuestro Proyecto).

Iniciamos el proyecto de persistencia de datos con Sqlite.

Iniciamos creando la estructura de directorios base. Utilizando Maven digitamos desde la terminal la siguiente instrucción:

mvn archetype:generate  -DgroupId=ni.jug -DartifactId=jsqlite -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Nos quedará la siguiente estructura de directorios:

. 
├── pom.xml 
└── src 
   ├── main 
   │   └── java 
   │       └── ni 
   │           └── jug 
   │               └── App.java 
   └── test 
       └── java 
           └── ni 
               └── jug 
                   └── AppTest.java

Crearemos las carpetas controller, view y model dentro de la carpeta main/java/ni/jug/

mkdir main/java/ni/jug/util
mkdir main/java/ni/jug/controller
mkdir main/java/ni/jug/view
mkdir main/java/ni/jug/model

Modificación el pom.xml

Modificamos el archivo pom.xml, agregamos la dependencia para el driver de SQLite. También agregamos el plugin maven-assembly-plugin para la construcción del jar y agregamos la propiedad para que al momento de compilar Maven utilice la versión de Java 11. Nos quedará de la siguiente manera:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ni.jug</groupId>
    <artifactId>jsqlite</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>jsqlite</name>
    <url>http://maven.apache.org</url>
    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
      <dependency>
         <groupId>org.xerial</groupId>
         <artifactId>sqlite-jdbc</artifactId>
         <version>3.28.0</version>
      </dependency>
    </dependencies>
   <build>
     <plugins>
        <!-- Configuracion del plugin para contruccion del jar -->
        <plugin>
           <artifactId>maven-assembly-plugin</artifactId>
           <version>3.1.1</version>
           <configuration>
              <!-- Le decimos a maven que agrege en el manifiesto cual es la clase que contiene el metodo main -->
               <archive>
                  <manifest>
                     <addClasspath>true</addClasspath>
                     <mainClass>ni.jug.App</mainClass>
                  </manifest>
                </archive>
                <!-- Le decimos a maven que incluya las dependencia en el jar -->
                <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
              </configuration>
             <executions>
                <execution>
                   <id>assemble-all</id>
                    <phase>package</phase> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                 </execution>
              </executions>
            </plugin>
        </plugins>
   </build>
   <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <maven.compiler.source>11</maven.compiler.source>
         <maven.compiler.target>11</maven.compiler.target>
    </properties>
</project>

Conexión con la base de datos.

Vamos a crear un clase con el nombre ConnectionBD y estará ubicada en main/java/ni/jug. Esta clase hará la conexión a la base de datos. Aunque SQLite soporta que múltiples procesos lean la base de datos, solo puede haber un proceso de escritura, por lo utilizaremos el patrón de diseño Singleton para evitar múltiples conexiones a la base de datos.

package ni.jug;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * Establece la conexion con la base de datos y nos devuelve la conexion por el metodo
 * @author gacs
 */
public class ConnectionBD {
    private static ConnectionBD connectionBD=null;    //inilicializamos la clase de conexion 
    private final String strUrl;                      //Almacena la direccion de la base de datos
    private final String strDriver ;                  //Almacena el driver de conexion
    private static Connection conn=null;
    private ConnectionBD() {
    	this.strDriver="org.sqlite.JDBC"; //Driver de conexion
    	strUrl="jdbc:sqlite:var/db/mybd.db"; //Parametros de conexion de conexion
    	setConnection(); //Establece la conexion y la almacena en la propiedad conn
	}
    public static Connection getConnection(){
           if(connectionBD==null)
        	   connectionBD=new ConnectionBD(); 
           return conn;
    }
    /**
     * metodo de conexion con la base de datos
     * Almacena la conexion en la propiedad conn
     */
    private void setConnection() {
        try {
            Class.forName(strDriver);
            conn=DriverManager.getConnection(strUrl);
        }catch(ClassNotFoundException | SQLException e){
               System.err.println(e);
        }		   
  }
}

Crearemos la carpeta ../var/db dentro la carpeta donde hemos creado el proyecto, al mismo nivel de la carpeta src y del archivo pom.xml. La estructura de directorio se verá así:

.
├── src
│   ├── main
│   │   └── java
│   │       └── ni
│   │           └── jug
│   │               ├── controller
│   │               ├── model
│   │               ├── util
│   │               └── view
│   └── test
│       └── java
│           └── ni
│               └── jug
└── var
    └── db

Persistiendo datos con el patrón de diseño MVC.

Modelo

Crearemos una clase que nos servirá de modelo. Esta clase tendrá el nombre de Persona y estará ubicada en la carpeta main/java/ni/jug/model. A continuación el código que contiene la clase Persona:

package ni.jug.model;
/**
 * Clase modelo Persona 
 * @author gacs
 *
 */
public class Persona {
	private int id;
	private String nombre;
	private String apellido;
	private String sexo;
    public Persona() {
	}
	public Persona(int id, String nombre, String apellido, String sexo) {
		this.id = id;
		this.nombre = nombre;
		this.apellido = apellido;
		this.sexo = sexo;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNombre() {
		return nombre;
	}
	public String getNombreCompleto() {
		return nombre+" "+apellido;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getApellido() {
		return apellido;
	}
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
	public String getSexo() {
		return sexo;
	}
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Persona other = (Persona) obj;
		if (id != other.id)
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "[ "+id+"  "+  nombre +"  "+apellido + "  "+  sexo + "]";
	}
}

 

Vistas

Crearemos ahora las clases que nos darán la vista de los datos, como también las vistas que interactúan con el usuario. Estas clases estarán ubicadas en la carpeta main/java/ni/jug/view. Las clases que utilizaremos como vista son:

  • NewPersona: Esta clase se utiliza para que el usuario agregue un nuevo registro en la tabla persona.
  • ListPersona: Lista los registro de la tabla persona.
  • EditPersona: Con esta clase podremos editar y modificar un registro de la tabla persona.
  • DeletePersona: Con esta clase podremos borrar un registro almacenado en la tabla persona.

NewPersona.

package ni.jug.view;
import java.util.Scanner;
import ni.jug.model.Persona;
import util.Input;
/**
 * Agrega registro a la tabla
 * @author gacs
 *
 */
public class NewPersona {
	private Persona pm; 
	public NewPersona(Persona pm) {
            this.pm = pm;
	}
	/**
	 * Este metodo es llamado por el controlador
	 */ 
    public void setRegister() {
        Scanner reg = Input.getInstance();
        System.out.println( "Nombre:" );
        pm.setNombre(reg.next());
        System.out.println( "Apellido:" );
        pm.setApellido(reg.next());
        System.out.println( "Sexo:" );
        pm.setSexo(reg.next());
    }
}

ListPersona.

package ni.jug.view;
import java.io.IOException;
import java.util.List;
import ni.jug.model.Persona;
/**
 * Lista los registro de la tabla
 * @author gacs
 *
 */
public class ListPersona {
    public void sayRegisters(List a) 
    {
        System.out.println(" Id "+"  -- Nombre --   "+" -- Apellido -- "+" - Sexo - ");
	a.forEach(p ->{
            System.out.println(p.toString());	
	});
        try
        {
            System.out.println("\n\n  Presione ENTER..");
            System.in.read();
	}
	catch(IOException exe)
	{
            System.out.printf("Error?");
	}
    }
	public void sayRegister(Persona a) 
	{
		System.out.println(" Id "+"  -- Nombre --   "+" -- Apellido -- "+" - Sexo - ");
		System.out.println(a.toString());	
	}
}

EditPersona.

package ni.jug.view;
import java.util.Scanner;
import ni.jug.model.Persona;
import util.Input;
public class EditPersona {
	
    public int getRegister() {
        int register;
        Scanner r= Input.getInstance();
        System.out.print("Digite el Id del registro a modificar :");
        register=r.nextInt();
        return register;
    }	
    public void postRegister(Persona a) {
        Scanner r= Input.getInstance();
        System.out.println("Registro a modificar");
        System.out.println("Id      :"+a.getId());
        System.out.println("Apellido  :"+a.getApellido());
        a.setApellido(r.next());
        System.out.println("Nombre  :"+a.getNombre());
            a.setNombre(r.next());
        System.out.println("Sexo    :"+a.getSexo());
           a.setSexo(r.next());
    }
}

DeletePersona.

package ni.jug.view;
import java.util.Scanner;
import ni.jug.model.Persona;
import util.Input;
public class DeletePersona {
	
	public int getRegister() {
		int register;
		Scanner r= Input.getInstance();
		System.out.println("Digite el registro a eliminar");
		register=r.nextInt();
		return register;
	}
	public boolean postRegister(Persona a) {
		Scanner r= Input.getInstance();
		System.out.println("Se borra el registro");
		System.out.println("Id      :"+a.getId());
		System.out.println("Nombre  :"+a.getNombreCompleto());
		System.out.println("Sexo    :"+a.getSexo());
		System.out.print("Desear eliminar este registro ?[S/N]");
		String bln=r.next();
		return bln.equalsIgnoreCase("S");
	}
}

Clase util Input.

Vamos a crear una clase llama Input, la cual estará en la carpeta main/java/ni/jug/util . Esta clase devuelve la clase Scanner, la cual es utilizada por las vistas para interactuar con el usuario. El contenido de la clase es el siguiente:

package ni.jug.util;
import java.util.Scanner;
/**
 * Clase de utilidad para las vistas
 * aplicado bajo el modelo singleton
 * @author gacs
 */
public class Input {
	private static Scanner input=null;
	private Input() {
		input=new Scanner(System.in);
	}
	
	public static Scanner getInstance() {
        if(input==null)
     	   		new Input(); 
        return input;
	}
}

Controlador.

Ya tenemos el modelo y las vistas de de nuestro proyecto. Ahora vamos a crear nuestra clase controladora, la que nos hará la persistencia de los datos que suministró el usuario en las vista a través del modelo.  Esta clase tendrá el nombre de PersonaController y estará ubicado en la carpeta main/java/ni/jug/controller, y tendrá el siguiente código:

package ni.jug.controller;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import ni.jug.ConnectionBD;
import ni.jug.model.Persona;
import ni.jug.view.DeletePersona;
import ni.jug.view.EditPersona;
import ni.jug.view.ListPersona;
import ni.jug.view.NewPersona;
/**
 * Clase de control para la tabla persona
 * @author gacs
 */
 public class PersonaController {
	private final String SQLINSERT="INSERT INTO PERSONA VALUES(NULL,?,?,?)";
	private final String SQLQUERY="SELECT Id,Nombre,Apellido,Sexo FROM PERSONA";
	private final String SQLQUERYONE=SQLQUERY+" WHERE Id=?";
	private final String SQLDELETE="DELETE FROM PERSONA WHERE Id=?";
	private final String SQLUPDATE="UPDATE PERSONA SET Nombre=?, Apellido=?,Sexo=? WHERE Id=?";
	private Connection conn;
	public PersonaController() {
		initController();
	}
	/**
	 * Instancia la conexion, crea la tabla si esta no existe
	 */
	
	private void initController() {
		conn=ConnectionBD.getConnection();
		PreparedStatement pst=null;
		String sqlCreate="CREATE TABLE IF NOT EXISTS PERSONA (" + 
				"	Id	integer PRIMARY KEY autoincrement," + 
				"	Nombre	 varchar ( 25 ) NOT NULL," + 
				"	Apellido varchar ( 25 ) NOT NULL," + 
				"	Sexo char  NOT NULL" + 
				"	)";
		try {
			pst=conn.prepareStatement(sqlCreate);
			pst.execute();
	    }catch( SQLException e){
	        System.err.println(e);
	    }finally {
	    	try {
	    		if(pst!=null)
	    			pst.close();
		    }catch( SQLException e){
		        System.err.println(e);
		    }
	    }		   
	}
	
	/**
	 * llama a la vista NewPersona para que el usuario agregue los valores a los campos
	 * luego estos valores se agregan a la tabla
	 */
	public void addRegister() {
		Persona persona=new Persona();
		NewPersona view =new NewPersona(persona);
		view.setRegister();
		PreparedStatement pst=null;
		try {
			pst=conn.prepareStatement(SQLINSERT);
			pst.setString(1, persona.getNombre());
			pst.setString(2, persona.getApellido());
			pst.setString(3, persona.getSexo());
			pst.executeUpdate();
	    }catch( SQLException e){
	        System.err.println(e);
	    }finally {
	    	try {
	    		if(pst!=null)
	    			pst.close();
		    }catch( SQLException e){
		        System.err.println(e);
		    }
	    }		   
	}
/**
 * Extrae los registro de la tabla y los visualiza en pantalla por medio de la vista
 * ListPersona
 */
	public void getRegisters() {
		List personas=new ArrayList<>();
		PreparedStatement pst=null;
		ResultSet rs=null;
		try {
			pst=conn.prepareStatement(SQLQUERY);
			rs=pst.executeQuery();
			while(rs.next()) {
				personas.add(new Persona( rs.getInt("Id"),
						rs.getString("Nombre"),
						rs.getString("Apellido"),
						rs.getString("Sexo")
						));
			}
	    }catch( SQLException e){
	        System.err.println(e);
	    }finally {
	    	try {
	    		if(pst!=null)
	    			pst.close();
	    		if(rs!=null)
	    			rs.close();
		    }catch( SQLException e){
		        System.err.println(e);
		    }
	    }		   
		ListPersona view =new ListPersona();
		view.sayRegisters(personas);
	}	
	
	private Persona getRegister(int a) {
		PreparedStatement pst=null;
		ResultSet rs=null;
		Persona persona=null;
		try {
			pst=conn.prepareStatement(SQLQUERYONE);
			pst.setInt(1, a);
			rs=pst.executeQuery();
			if(rs.next()) {
				persona=new Persona( rs.getInt("Id"),
					rs.getString("Nombre"),
					rs.getString("Apellido"),
					rs.getString("Sexo")
				);
			}
	    }catch( SQLException e){
	        System.err.println(e);
	    }finally {		//Nos aseguramos que se cierre el PreparedStatement y ResultSet al finalizar el metodo
	    	try {
	    		if(pst!=null)
	    			pst.close();
	    		if(rs!=null)
	    			rs.close();
		    }catch( SQLException e){
		        System.err.println(e);
		    }
	    }		   
		
		return persona;
	}
	
	/**
	 * Borra un registro
	 * llama a la vista DeletePersona 
	 * con el metodo get determina el registro que quiere eliminar de la tabla
	 * con el metodo post visualiza el registro a eliminar y pide confirmacion para borrar
	 * 
	 */
    public void deleteRegister() {
	DeletePersona dp=new DeletePersona();
	Persona persona=null;
        int reg;
	PreparedStatement pst=null;
        do {
                reg=dp.getRegister();
                persona=getRegister(reg);
                if(persona.getId()!=reg) {
                        System.out.println("Registro no encontrado!!!");
                }
        }while(persona.getId()!=reg);
	if(dp.postRegister(persona)) {
            try {
		pst=conn.prepareStatement(SQLDELETE);
		pst.setInt(1, persona.getId());
		pst.execute();
            }catch( SQLException e){
	        System.err.println(e);
	    }
            finally {		//Nos aseguramos que se cierre el PreparedStatement al finalizar el metodo
           	try {
                    if(pst!=null)
		    	pst.close();
		}catch( SQLException e){
		        System.err.println(e);
                }
            }		   
	}
    }
	
    public void editRegister() {
        EditPersona edit =new EditPersona();
        Persona persona=null;
        int reg;
        PreparedStatement pst=null;
        do {
                reg=edit.getRegister();
                persona=getRegister(reg);
                if(persona.getId()!=reg) {
                        System.out.println("Registro no encontrado!!!");
                }
        }while(persona.getId()!=reg);
        //Envia el registro para ser modificado 
        edit.postRegister(persona);
        try {
                pst=conn.prepareStatement(SQLUPDATE);
                pst.setString(1, persona.getNombre());
                pst.setString(2, persona.getApellido());
                pst.setString(3, persona.getSexo());
                pst.setInt(4, persona.getId());
                pst.executeUpdate();
        }catch( SQLException e){
            System.err.println(e);
        }
            //Nos aseguramos que se cierre el PreparedStatement al finalizar el metodo
        finally {
            try {
                   if(pst!=null)
                            pst.close();
                }catch( SQLException e){
                    System.err.println(e);
            }
        }		   
    }
}

Clase principal (main class)

Para terminar el desarrollo de nuestro proyecto vamos a modificar la clase App.java, la cual se encuentra en la carpeta main/java/ni/jug. Esta es la primera clase que se iniciará en nuestra aplicación, por lo que en su contenido tendrá el método main. El código de esta clase sea el siguiente:

package ni.jug;
import java.sql.SQLException;
import java.util.Scanner;
import ni.jug.controller.PersonaController;
import ni.jug.util.Input;
/**
 * class main
  * @author gacs
 */
public class App 
{
    public App() {
    	menus();
    }
    public static void main( String[] args )
    {
            App app = new App();
    	System.out.println("Termino");	
    }
	/**
	 * Metodo que proporciona el menu de la aplicacion
	 */
    private void menus() {
    	Scanner menu;
    	menu=Input.getInstance();
    	PersonaController pc = new PersonaController();
        byte op=0;
        do {
            System.out.println( "-- Persistencia con SQLite --" );
            System.out.println( "1. Ingresar" );
            System.out.println( "2. Listar" );
            System.out.println( "3. Borrar" );
            System.out.println( "4. Editar" );
            System.out.println( "0. Salir de la aplicacion" );
            op=menu.nextByte();
            switch (op) {
                case 0:
                    System.out.println( "Saliendo del sistema" );
                    break;
                case 1:
                    pc.addRegister();
                    break;
                case 2:
                    pc.getRegisters();	
                    break;
                case 3:
                    pc.deleteRegister();	
                    break;
                case 4:
                    pc.editRegister();	
                    break;
                default:
                   System.out.println( "Solo puede eligir una de las opciones del menu" );
                    break;
            }
        }while(op!=0);
        menu.close();
   	try {
            ConnectionBD.getConnection().close(); 
	 }catch( SQLException e){
	    System.err.println(e);
	 }		   
    }
}

Hasta aquí ya tenemos finalizado nuestro proyecto, cumpliendo lo básico para persistir nuestros datos en base de datos SQLite por medio de JDBC.

Compilación y ejecución.

Compilando el proyecto.

Para terminar con el desarrollo de nuestro pequeño proyecto de persistencia de datos en  SQLite, procederemos con la compilación. Para ello, nos trasladamos a la carpeta que contiene nuestro proyecto y ejecutamos la siguiente sentencia.

 mvn clean install

Una vez que finalice de compilar, Maven nos habrá creado una carpeta target y en ella unos archivos jar.

target/jsqlite-1.0-SNAPSHOT.jar
target/jsqlite-1.0-SNAPSHOT-jar-with-dependencies.jar

Ejecución de jsqlite.

Para ejecutar nuestro aplicación, desde una terminal correremos el archivo jsqlite-1.0-SNAPSHOT-jar-with-dependencies.jar, con el siguiente sentencia

java -jar target/jsqlite-1.0-SNAPSHOT-jar-with-dependencies.jar

Nos presentará las siguientes pantallas:

 

Ingresamos datos con la opción 1.

Listamos los datos que ingresamos con la opción 2.

Salimos de la aplicación y volvemos a ingresar y listamos los registro que contiene la base de datos para comprobar si está persistiendo nuestra jsqlite.

Buenos, finalizamos y hemos alcanzado nuestro objetivo.

¿Qué les parece? ¿Dejé por fuera algo? ¿No entendiste algo? Déjamelo en los comentarios..

Crear aplicación Web Java desde Eclipse IDE

¿Qué voy a aprender?

En este artículo te voy a mostrar cómo crear un cascarón para una aplicación Web Java monolítica utilizando el IDE Eclipse (descarga Eclipse IDE for Java Developers aquí). Si estas interesado también en aplicaciones de escritorio, te sugiero que revises este otro enlace.

¿Por qué es importante saber cómo crear una aplicación web Java?

Una vez que aprendas este paso, lo siguiente es un mundo de oportunidades, ya que irás aprendiendo cómo desarrollar tus propias aplicaciones web en Java.

¿Qué necesito tener instalado?

  1. Maven.
  2. Eclipse IDE para desarrollo Web.
  3. Java (no seremos exigentes con las versiones, pero preferiblemente de la 8 en adelante).

Generando el proyecto con Eclipse.

New Dynamic Web Java Project

Paso 1: Seleccionar la opción Dynamic Web Project

 

 

 

 

 

 

 

 

 

 

 

 

Rellenando los datos generales del proyecto

  1. Project Name: Nombre del proyecto, recomendable sin espacios. Utiliza guiones para separar las palabras.
  2. Project Location: Ubicación fisica del proyecto.
  3. Target Runtime: Por el momento lo vamos a dejar en blanco.
  4. Dynamic Web Module Version: Seleccionamos la versión 3.0
  5. Configuration: No es requerido.
  6. Desmarcamos la opción “add project to an EAR”.
Paso 2

Paso 2 – Rellenar la Información

Damos clic en el botón Next>

Configurando los directorios fuentes

Por defecto el directorio source, es decir el src, es donde el compilador buscará los archivos .java o fuentes de nuestra aplicación. En esta parte no realizaremos ningún cambio. Clic en Next > :

Paso 3: Configuración de directorios Fuentes

Configurando el WebModule

El paso final es la configuración del WebContent. En este paso se debe especificar el directorio de contenidos. Es aquí donde irán todos nuestros archivos de configuración: archivos estáticos, hojas de estilos, jsp, xhtml, etc.

El valor context root es básicamente cómo llamaremos a nuestra aplicación en el contexto del servidor.

Paso 4: Configuración de WebContent

Paso Final

Ahora solo damos clic en Finish y obtendremos un resultado como el de la imagen:

Estructura del Proyecto

Convirtiendo el proyecto a un proyecto Maven (Opcional).

Este paso puede ser considerado opcional. Sin embargo, dado el ambiente laboral de nuestros días, es casi obligatorio, ya que en la actualidad la mayoria de proyectos utilizan la herramienta Maven para poder manejar sus dependencias (librerías), entre otras cosas interesantes del proyecto.

  1. Damos clic derecho sobre el proyecto.
  2. Seleccionamos la opción Configure. En el submenú elegimos la opción convert to maven project.

Convertir a proyecto maven

Acto seguido, rellenamos la información de la ventana que nos aparece. Los más importantes son:

  1. Group Id: es la nomenclatura base de la paquetería de nuestra aplicación. En este ocasión, nuestros archivos fuentes estarán alojados en la estructura de paquetes org.ni.jug. Es importante saber que este es generalmente  el dominio de nuestra empresa/grupo puesto al revés. En nuestro caso, ni.org.jug en realidad es el nombre de nuestro dominio.
  2. Artifact Id: Ese el nombre que identifica a nuestro proyecto. En este ejemplo, es el mismo que le definimos al inicio.

MetaData de proyecto maven

Si observas al final del proyecto nos agrega un archivo POM, el cual es el archivo de configuración que utilizará Maven para la gestión de nuestro proyecto. Si quieres aprender un poco más de Maven, te recomiendo la entrada [Introducción a Maven].

Resultado Final

El resultado final es un proyecto con la estructura que se muestra en la imagen de abajo. Una vez teniendo esta primera parte, vamos a hacer un despliegue en un servidor de aplicaciones o un contenedor de servlets, el cual veremos con más detalle en otra entrada.

web-project

Estructura del Proyecto

 

Introducción a Maven, primeros pasos.

Introducción

Al desarrollar en java siempre tenemos varias tareas que realizar. Entre las primeras es crear una estructura de directorio para nuestras fuentes y el descargar librerías con las dependencia que utilizaremos en nuestro proyecto.

También tendremos la tarea de compilar nuestro proyecto y asignarle un lugar donde ubicar nuestro archivos compilados (jar, war, etc.).

Para las tareas antes mencionamos y otras que necesitamos al desarrollar proyectos en Java, tenemos la herramienta Apache Maven.

(más…)

Katalon para iniciar en la automatización de TestCase

¿Que es Katalon ?

Katalon Studio es una solución de automatización robusta y gratuita para web-APIs, web y pruebas móviles. Integra todos los componentes necesarios con palabras clave integradas y plantillas de proyectos en un marco de automatización completo. Katalon Studio es fácil de usar para los principiantes, pero ofrece opciones avanzadas para usuarios experimentados. Una comunidad activa de más de 150 países de todo el mundo confía en esta solución, de echo si tu quieres colaborar con el proyecto puedes hacer lo, ya que es una plataforma de código abierto, puedes acceder a sus recursos en su repositorio de Github.

Katalon Studio es una solución de automatización de prueba que aprovecha el motor central de Selenium. Aunque usa varias funciones de Selenium, no es simplemente una envoltura de este.

¿Por que Katalon?

La automatización de pruebas de software generalmente necesita habilidades técnicas y cierto conocimiento sobre la aplicación bajo prueba (AUT) para su aplicación exitosa. El conocimiento sobre las tecnologías relacionadas con AUT no es obligatorio, si no recomendado. Por ejemplo, tener conocimiento de HTML y JavaScript debería ser lo mejor si estas realizando pruebas en la web , si no los tienes es mejor no hacerlas.

Los usuarios de Katalon Studio por lo general podrían ser los testers con conocimientos técnicos limitados. Katalon Studio esconde todas las complejidades técnicas detrás de la escena y proporciona una interfaz de usuario amigable con el modo manual (el usuario puede arrastrar y soltar, seleccionar palabras clave y probar objetos para formar pasos de prueba), pero aún mantiene las herramientas necesarias para usuarios técnicamente más poderosos que pueden excavar más profundo en la codificación con el modo de script que es totalmente compatible con las ventajas para desarrollar (escribir código o programar), como el resaltado de sintaxis, la sugerencia de código y la depuración.

Selenium y Appium son principalmente bibliotecas de pruebas automatizadas que son más adecuadas para testers que poseen buenas habilidades de programación. Normalmente necesitarán usar un IDE como Eclipse o Visual Studio, para importar bibliotecas de Selenium y Appium (y ciertamente sus dependencias) en un proyecto de desarrollo, para instalar marcos de pruebas necesarios como JUnit, NUnit y TestNG antes de comenzar a escribir un caso de prueba.

Despliegue y primeros pasos

La mayoría de los proyectos de código abierto son difíciles de configurar e implementar porque son aportados por muchos desarrolladores y proveedores diferentes que envían su trabajo a un lugar central, es decir, Github. Puede que tenga que compilar todo utilizando el código fuente enviado. Pero incluso si los marcos están empaquetados en un elemento listo para usar como Selenium y Appium, aún debe seguir las pautas técnicas para su API e integrarlos con un IDE y un lenguaje de programación preferido.

Katalon Studio está diseñado como un paquete unificado que incluye casi todas las cosas necesarias, como Java, Android SDK, controladores web para controlar navegadores y dependencias requeridas. Todo lo que tienes que hacer es descargarlo e instalarlo en tu computadora. Algunas cosas para tomar en cuenta son las siguientes:

  • Como Appium se actualiza con frecuencia, Katalon Studio no incluye a Appium.
  • Si estás probando aplicaciones móviles, debes sinstalar Appium, Node.js (en Windows) y XCode (en Mac).
  • Puedes familiarizarse rápidamente con Katalon Studio ya que tiene una interfaz de usuario amigable y proyectos de muestra. La documentación detallada para el usuario (docs.katalon.com) definitivamente te ayudara a pasar rápidamente de las funciones simples a las avanzadas.

Gestión de pruebas y soporte de lenguaje de scripting

Katalon Studio ofrece una interfaz gráfica de usuario rica con menús, vistas de árbol, tablas, etc. para administrar casos de prueba, objetos y archivos de datos. Su compositor de secuencias de comandos con resaltado de sintaxis completa, sugerencia de código y depuración es ideal para los testers que solo quieren arrastrar y soltar o tienen habilidades de programación limitadas.

 

Por desgracia no todo es color de rosa, Katalon Studio utiliza Groovy, un lenguaje construido sobre Java, y tiene que cargar muchas bibliotecas para analizar datos de prueba, probar objetos y registrar. Por lo tanto, puede ser un poco más lento en comparación con Java para casos de prueba largos con cientos de pasos.

Conclusión

Katalon studio es una poderosa herramienta que facilita el primer salto hacia la automatización de casos de pruebas, además tienen muchas cosas que me gustan, como el poder integrar  varios sistemas de administración de pruebas y sistemas de seguimiento de errores, incluido qTest ( https://www.qasymphony.com ) y JIRA para enviar errores, defectos, registros de prueba y resultados de pruebas. también se puede integrar con Kobiton, un laboratorio móvil basado en la nube ( https://kobiton.com ).

Otra cosa que lo hace super genial, es que el equipo de Katalon apoya activamente a los usuarios de forma más regular que las comunidades de Selenium y Appium, a través de su sitio web y foro.

 

Instalando Netbeans en GNU/Linux Debian.

Introducción

Eclipse actualmente es IDE (entorno de desarrollo integrado) preferido por los desarrolladores de Java, pero aquí le ofrecemos otro sabor para degustar: NetBeans. Es un IDE libre y gratuito, desarrollado principalmente para el lenguaje de programación Java, aunque también tiene soporte para otros lenguajes de desarrollo como PHP, C/C++, HTML5. Además, cuenta con numerosos módulos que le ayudan a extender sus capacidades. ¿Quieres saber más?

Instalación.

Desde repositorio.

NetBeans se puede instalar directamente desde el repositorio de Debian con las siguientes sentencias:

sudo apt update #actualizar tabla de paquetes
sudo apt upgrade #actualizar sistema
sudo apt install netbeans #Instala netbeans con sus dependencias.

Debian se caracteriza por ser un sistema muy estable, esto lleva a que sus paquetes no estén en su versión más reciente, pero podemos optar por instalar NetBeans directamente de los desarrolladores descargando el instalador de la pagina oficial.

Desde los desarrolladores.

Primer paso:

Para descargar NetBeans 11 de la página oficial podemos pulsar este enlace o bien podemos descargarlo utilizando la siguiente sentencia desde la terminal del gestor de escritorio que usted esté utilizando.

wget https://www-us.apache.org/dist/incubator/netbeans/incubating-netbeans/incubating-11.0/incubating-netbeans-11.0-bin.zip

Segundo paso:

Descomprimir el archivo descargado del sitio oficial de los desarrolladores. Puedes hacerlo ejecutando la siguiente sentencia desde la terminal:

unzip incubating-netbeans-11.0-bin.zip

Tercer paso:

La carpeta (netbeans) que se descomprimió del incubating-netbeans-11.0-bin.zip,por ser un paquete agregado al sistema desde una fuente de terceros, debe estar en la carpeta /opt (¿Quieres saber más?). Por lo anterior, procedemos a mover la carpeta netbeans al directorio /opt, utilizando la siguiente sentencia desde la terminal:

sudo mv netbeans /opt/

Es recomendable que la carpeta /opt, esté en una partición diferente de la carpeta raíz (/), ya que si haces cambios en el sistema no tendrá que volver instalar NetBeans.

Cuarto paso:

NetBeans requiere del Java Development Kit para que podamos ejecutarlo. La versión que instalamos soporta el OpenJDK 11, el cual viene por defecto en Debian buster.

Procedemos a instalar el OpenJDK 11 desde el repositorio de Debian, ejecutando la siguiente sentencia desde una terminal:

sudo apt update #actualizar tabla de paquetes
sudo apt upgrade #actualizar sistema
sudo apt install default-jdk #Instala java jdk 11 con sus dependencias.

Comprobamos que la versión de Java que se nos instaló sea la versión 11 utilizando la siguiente sentencia desde la terminal:

java --version
openjdk 11.0.4-ea 2019-07-16
OpenJDK Runtime Environment (build 11.0.4-ea+10-post-Debian-1)
OpenJDK 64-Bit Server VM (build 11.0.4-ea+10-post-Debian-1, mixed mode)

Una vez que instalamos y comprobamos la versión correcta de JDK, podemos iniciar NetBeans desde una terminal con la siguiente sentencia:

/opt/netbeans/bin/netbeans

Después de ejecutar la sentencia veremos las siguientes pantallas.

 

 

IDE Netbeans

Agregaremos la ubicación del directorio netbeans a nuestro $PATH para que podamos iniciar el programa sin especificar la ruta absoluta al archivo binario. Modificando con el editor de texto de su preferencia, el archivo ~/.bashrc para el intérprete de órdenes bash (¿Quieres saber más?) el archivo ~/.zshrc para intérprete de órdenes zsh (¿Quiere saber más?), agregamos la siguiente línea al final del archivo y guardamos el cambio.

export PATH=”$PATH: /opt/netbeans/bin”

Reiniciamos el intérprete de órdenes que estemos utilizando, con la siguiente sentencia.

source ~/.bashrc #para el interprete bash

O

source ~/.zshrc #para el interprete zsh

Ahora ya podemos ejecutar NetBeans desde la terminal sin tener que digitar la ruta donde se encuentra el binario.  Sin embargo, puede resultar poco productivo abrir una terminal para ejecutar NetBeans si contamos con un menú  lanzador de aplicaciones. Por lo tanto, agregaremos al menú lanzador de aplicaciones un lanzador para que ejecute NetBeans:

Creamos el archivo /usr/share/applications/netbeans.desktop utilizando nuestro de editor de texto preferido. En el ejemplo utilizo el editor de texto nano de la siguiente manera:

sudo nano /usr/share/applications/netbeans.desktop

Digitamos el siguiente contenido al archivo /usr/share/applications/netbeans.desktop y guardamos la modificación.

[Desktop Entry]
Comment=Ide Netbeans apache
Exec=/opt/netbeans/bin/netbeans
Icon=/opt/netbeans/nb/netbeans.png
Name=NetBeans apache
NoDisplay=false
StartupNotify=true
Categories=GNOME;Application;Development;
Type=Application
StartupNotify=true
Terminal=0

Ahora ya tenemos NetBeans instalado y configurado para ejecutar desde el menú lanzador, en el cual veremos algo así.

Quinto paso [Configuración opcional de Netbeans]:

Para hacer ajustes en NetBeans, tenemos que modificar con nuestro editor de texto preferido el archivo /opt/netbeans/netbeans.conf. Aunque con la configuración que viene con la instalación NetBeans trabaja bien, procuro siempre agregar tres opciones que ayudan a minimizar el tiempo de arranque y dar mejor rendimiento cuando estás trabajando con varios proyectos.

-J-Xms1024m -J-Xmx2048m -J-Xverify:none

Estas opciones se deben agregar a la configuración netbeans_default_options, que se encuentra en el archivo /opt/netbeans/netbeans.conf.

sudo nano /opt/netbeans/netbeans.conf

Agregamos las opciones y guardamos, lo opción de configuración, netbeans_default_options, nos quedaría así:

netbeans_default_options="-J-XX:+UseStringDeduplication -J-Xss2m -J-Xms1024m -J-Xmx2048m -J-Xverify:none -J-Dnetbeans.logger.console=true -J-Djdk.gtk.version=2.2 -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dplugin.manager.check.updates=false -J-Dnetbeans.extbrowser.manual_chrome_plugin_install=yes -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.lang.ref=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.base/java.security=ALL-UNNAMED -J--add-opens=java.base/java.util=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/java.awt=ALL-UNNAMED -J--add-opens=java.desktop/java.awt.event=ALL-UNNAMED -J--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED -J--add-opens=jdk.jshell/jdk.jshell=ALL-UNNAMED -J--add-modules=jdk.jshell -J--add-exports=java.desktop/sun.awt=ALL-UNNAMED -J--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED -J--add-exports=java.desktop/com.sun.beans.editors=ALL-UNNAMED -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-exports=java.desktop/sun.awt.im=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED -J--add-exports=java.management/sun.management=ALL-UNNAMED -J--add-exports=java.base/sun.reflect.annotation=ALL-UNNAMED -J--add-exports=jdk.javadoc/com.sun.tools.javadoc.main=ALL-UNNAMED -J-XX:+IgnoreUnrecognizedVMOptions"

Hasta aquí ya tenemos instalado, configurado NetBeans para ser utilizado en Debian.

Si tienes interés en la instalación de Eclipse, puedes revisar estos artículos:

Instalando Eclipse en Fedora Linux para aplicaciones web

 

 

Preparando el IDE Eclipse para aplicaciones de escritorio.

Introducción

El IDE Eclipse ofrece dos opciones para la creación de aplicaciones de escritorio: la versión RCP, que es un cliente enriquecido, y la versión estándar utilizando SWT y SWING para la creación de aplicaciones de escritorio independientes y a gusto del cliente. 

Para agregar un poco de contexto, el primer set de herramientas GUI de Java se denominó AWT, iniciales de Abstract Window toolkit. Fue incluido como parte de JDK 1.0. Este set fue sucedido por SWING, un set enriquecido en el cual los elementos son hechos todos en Java, sin codigo nativo. 

En cuanto a SWT (Standard Widget Toolkit), fue desarrollado con el proposito de contar con un set de herramientas de interfaz gráfica con apariencia y desempeno nativos.

Estos son los dos paquetes que ofrece el IDE Eclipse para la aplicaciones de escritorio:

Eclipse Java Estandar

Eclipse JAVA RCP and RAP

El que vamos utilizar es la versión JAVA Estándar. Lo haremos así pensando en que solo trabajaremos para aplicaciones de escritorio y aplicaciones java estándar, muy básicas: nada web o de algún otro framework.

Lo primero que haremos será descargar e instalar Eclipse. Si estas usando el sistema operativo Fedora, aquí tienes un artículo que te guiará paso a paso en el proceso de instalacion. Para Windows, deberás descargar el instalador desde los links dados más arriba y seguir las instrucciones de instalación. 

Instalando plugins en el IDE Eclipse

Una vez instalado Eclipse, procedemos a agregar los plugins correspondientes al desarrollo de aplicaciones de escritorio. Usaremos Window Builder, el cual contiene los componentes SWT y Swing Designer.

Iniciamos Eclipse y  buscamos el marketplace o mercado que nos ayudará a buscar los plugins necesarios. Para ello busca la opción “Eclipse MarketPlace” en el menú Help:

IDE Eclipse Marketplace

Ahora buscamos en el Market el plugin “Window builder”. Este es el nuevo plugin que reemplazó a Swing editor, y fue donado por Google. La búsqueda tarda unos segundos. 

Una vez localizado el plugin, haz clic en Install.  

Confirmar seleccion

Selecciona todas las características (features). Luego presiona el botón de finalizar Finish y espera mientras se instala. Ya tenemos lo necesario para la creación de un proyecto de prueba. El IDE eclipse se reiniciara al terminar. 

Proyecto de prueba

Crearemos un primer proyecto para asegurarnos que disponemos de los recursos necesarios para el desarrollo de una aplicacion de escritorio.

Crea un nuevo proyecto: File-> New -> Java Project. Le ponemos el nombre “ProbandoCosas”, por ejemplo. 

Haz clic en Next para ver el diálogo para configurar la compilación. 

Java Settings

Finaliza este paso haciendo clic en Finish. Ahora, desde el panel Package Explorer, creamos un paquete para nuestro proyecto. Aunque esto no es indispensable, se recomienda como una buena práctica.

Luego creamos nuestra aplicación SWING dentro del paquete.

Agregar archivo

En la ventana de diálogo New, buscamos Window, para hacer la navegación más fácil.

New Window

Le ponemos el nombre a nuestra clase principal, en esta caso: AplicacionPrueba

Ahora editamos nuestra aplicación. Esta es la ventana de código.

Por ejemplo, podemos cambiar a la vista de diseno haciendo clic en la pestana “Design” ubicada en la parte inferior de la pantalla, y estando alli, cambiar la apariencia de <system> a Metal.

 

Esta es la representación gráfica de nuestro editor visual para Aplicaciones Swing.

Una vez terminada la edición, podemos pasar a probar nuestra aplicación: Menu Run -> Run As -> Java Application

Buscar nuestra clase principal para Iniciar la aplicación.

Al dar clic en el botón Ejecutar, o desde el menú, nos pedirá que seleccionemos nuestra clase primaria de la aplicación, por lo general se llama APP, o como le pusimos antes: AplicacionPrueba.

Y ya con esto tenemos listo nuestro ambiente de desarrollo.

======= FIN =====

Nosotros y terceros seleccionados utilizamos cookies o tecnologías similares con fines técnicos y, con su consentimiento, para otras finalidades (“interacciones y funcionalidades básicas”, “mejora de la experiencia”, “medición” y “segmentación y publicidad”) según se especifica en la política de cookies. Usted es libre de otorgar, denegar o revocar su consentimiento en cualquier momento.    Configurar y más información
Privacidad