miércoles, 30 de diciembre de 2015

Creación de un Login con Eclipse + Hibernate + JPA + Primefaces + JSF

Algo complejo en la vida de un estudiante es poder conseguir logearse desde una página web, bueno para fines académicos y poder entender como es la lógica les muestro un sencillo modo de loguearse usando las herramientas de Eclipse con un Proyecto Web Dinámico.

MODELO

Paso 1: LA BASE DE DATOS, es importante conocer que datos utilizaremos para conseguir que funcione nuestra pequeña ventana de login, en este caso usaré una tabla pequeña de Docente.

CREATE TABLE docente
(
  cedula character varying(10) NOT NULL,
  nombre character varying(100),
  apellido character varying(100),
  correoinstitucional character varying(100),
  telefono character varying(15),
  contrasena character varying(20),
  CONSTRAINT pk_docente PRIMARY KEY (cedula),
  CONSTRAINT docente_correoinstitucional_key UNIQUE (correoinstitucional)
);

Una vez creada nuestra base de datos con su debida tabla, llenaremos los campos con información de un usuario (docente) para utilizar en el test.

Paso 2: EL PROYECTO WEB DINÁMICO, en este caso no explicaré todas las configuraciones para crear desde 0 un Dynamic Web Project, pues es algo extenso... lo que puedo es resumir los pasos que son:


  • Crear el proyecto 
    • Target runtime (Apache Tomcat v8)
    • Dynamic web module version 3.0
    • Configuration java server faces 2.2 project
  • No se olviden de al colocar next marcar Generate web.xml
  • Añadir las librerías de Hibernate, Driver de la base de datos que esten usando (en mi caso Postgresql y las librerias de JSF junto a Primefaces.

Paso 3: CONFIGURAR FACET DEL PROYECTO, debe añadirse el facet para JPA en el proyecto para que pueda utilizarse, al añadirse el facet debe configurarse la conexión a la base de datos que usaremos, luego llenarse las propiedades básicas del archivo persistence xml para la conexión, un consejo en la ventana de configuración de la conexión a la base de datos pinchen donde dice detectar clases anotadas automáticamente.

Persistence xml configuración de propiedades.

<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/NOMBRE DE LA BASE"/>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.user" value="postgres"/>
<property name="javax.persistence.jdbc.password" value="CLAVE DEL MOTOR DB"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
</properties>

Paso 4: PAQUETERÍA 

EL DOMINIO, se trata del mapeo de la tabla de la base de datos a una entidad Java, es decir una clase u objeto en la que coinciden sus tipos de datos.


EN LA BASE DE DATOS
cedula character varying(10) NOT NULL,
nombre character varying(100),
apellido character varying(100),
correoinstitucional character varying(100),
telefono character varying(15),
contrasena character varying(20),


EN ECLIPSE

package com.login.dominio;
import java.io.Serializable;
import javax.persistence.*;

@Entity
@NamedQueries({
@NamedQuery(name="Docente.findAll", query="SELECT d FROM Docente d"),
@NamedQuery(name="Docente.findUnique", query="SELECT d FROM Docente d WHERE d.correoinstitucional=:mailito")
})

public class Docente implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private String cedula;
private String apellido;
private String contrasena;
private String correoinstitucional;
private String nombre;
private String telefono;

public Docente() {
}

public String getCedula() {
return this.cedula;
}

public void setCedula(String cedula) {
this.cedula = cedula;
}

public String getApellido() {
return this.apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public String getContrasena() {
return this.contrasena;
}

public void setContrasena(String contrasena) {
this.contrasena = contrasena;
}

public String getCorreoinstitucional() {
return this.correoinstitucional;
}

public void setCorreoinstitucional(String correoinstitucional) {
this.correoinstitucional = correoinstitucional;
}

public String getNombre() {
return this.nombre;
}

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

public String getTelefono() {
return this.telefono;
}

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

}

EL CREADOR DEL ENTITY MANAGER, es la clase que contiene el método para crear el objeto pesado entity manager, con la finalidad de crearlo una sola vez y agilizar el trato de los métodos, llevará un listener para que se cree el objeto al iniciar la página web.

package com.login.EMF;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class EMF implements ServletContextListener {

private static EntityManagerFactory emf;

@Override
public void contextDestroyed(ServletContextEvent arg0) {
emf.close();
}

@Override
public void contextInitialized(ServletContextEvent arg0) {
emf = Persistence.createEntityManagerFactory("PryLogin");
}

public static EntityManager CrearEntityManager(){
if (emf == null){
throw new IllegalStateException("No sea bobito falta el contexto...");
}
return emf.createEntityManager();
}

}

LA INTERFAZ, es el contrato que muestra los métodos que usaremos.

package com.login.interfaces;
import com.login.dominio.Docente;

public interface DocenteDAO {
public String validarCorreo(Docente docente);
}

LA IMPLEMENTACIÓN DE LA INTERFAZ, es la apertura de los métodos que usaremos.

package com.login.interfaces.implementacion;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import com.login.EMF.EMF;
import com.login.dominio.Docente;
import com.login.interfaces.DocenteDAO;

public class DocenteDAO_PGSQL implements DocenteDAO {

@Override
public String validarCorreo(Docente docente) {
EntityManager em = EMF.CrearEntityManager();
em.getTransaction().begin();

List<Docente> docenteSolo = new ArrayList<Docente>();
Query query = em.createNamedQuery("Docente.findUnique")
.setParameter("mailito", docente.getCorreoinstitucional());
docenteSolo = query.getResultList();

FacesMessage msg;

try{
if (docenteSolo.get(0) != null){
if (docenteSolo.get(0).getContrasena().equals(docente.getContrasena())){
msg = new FacesMessage("Bienvenido Sr. "+docenteSolo.get(0).getNombre());
FacesContext.getCurrentInstance().addMessage(null, msg);
return "sistema.xhtml";
} else {
msg = new FacesMessage("Clave incorrecta Sr. "+docenteSolo.get(0).getNombre());
FacesContext.getCurrentInstance().addMessage(null, msg);
}

}

} catch (IndexOutOfBoundsException o){ 
msg = new FacesMessage("No encontrado.");
FacesContext.getCurrentInstance().addMessage(null, msg);
return "login.xhtml";
}

return "login.xhtml";
}

}

CONTROLADOR

EL MANAGED BEAN, como estamos trabajando en un proyecto web es necesario utilizar el patrón MVC y nuestro ManagedBean es el controlador (sirve como puente entre la vista y el modelo de datos). 

package com.login.bean;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import com.login.dominio.Docente;
import com.login.interfaces.DocenteDAO;
import com.login.interfaces.implementacion.DocenteDAO_PGSQL;

@SessionScoped
@ManagedBean
public class LoginMB {
private Docente docente;
private DocenteDAO docenteDAO;
@PostConstruct
public void init(){
docente = new Docente();
docenteDAO = new DocenteDAO_PGSQL();
}

public Docente getDocente() {
return docente;
}

public void setDocente(Docente docente) {
this.docente = docente;
}
public String VerificarPassword(){
return docenteDAO.validarCorreo(getDocente());
}
}

Paso 5: LA VISTA, o Front End, en este caso es muy sencilla en debido a que utilizaremos solamente nuestros métodos de la implementación de la interfaz usando como puente el managed bean.

La cualidad del login es que podamos ingresar al sistema, para esto se crean dos vistas, la primera que es en donde se encuentra el login y la segunda que equivaldría al sistema.

PÁGINA DE LOGIN 

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:p="http://primefaces.org/ui">
 
<h:head>
<title>Pagina de Login</title>
</h:head>

<h:body>
<h:form id="frmLogin">
<p:growl autoUpdate="true"/>
<center>
<p:panel header="Ingreso al sistema" style="width:380px">
<h:panelGrid columns="3">
<p:outputLabel for="txtCorreo" value="Correo "/>
<p:inputText id="txtCorreo" required="true" value="#{loginMB.docente.correoinstitucional}"/>
<p:message for="txtCorreo"/>
<p:outputLabel for="txtPass" value="Password "/>
<p:password id="txtPass" required="true" value="#{loginMB.docente.contrasena}"/>
<p:message for="txtPass"/>
</h:panelGrid>
<p:commandButton value="Sing-In" icon="ui-icon-check" action="#{loginMB.VerificarPassword()}"/>
</p:panel>
</center>
</h:form>
</h:body>

</html>


PAGINA DE SISTEMA

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:p="http://primefaces.org/ui">

<h:head>
<title>Logueado en el Sistema</title>
</h:head>

<h:body>
<h:form id="frmWelcome">
<center>
<p:panel header="Bienvenida">
<p />ESTAS EN EL SISTEMA
</p:panel>
</center>
</h:form>
</h:body>
</html>



DESCARGATE EL PROYECTO
 ProyectoWebLogin
Clave de desencriptación: !-pGDbRLVvMuJ7KEvDbig4Q

miércoles, 6 de agosto de 2014


Problemario de Programación
Arreglos

Ejercicio 5.36
Se tienen los resultados de las últimas elecciones a gobernador en el estado X, el cual está conformado por 5 municipios.    

En dichas elecciones hubo 4 candidatos.

Elabore un programa que:

• Lea e imprima una tabla indicando los votos obtenidos en cada municipio por los 4 candidatos.
• Calcule el total de votos recibidos por cada candidato y el porcentaje del total de votos emitidos.
• Calcule el candidato más votado.
• Si un candidato recibió más del 50% de los votos, indicar que es el ganador. Si ningún candidato recibió más del 50% de los votos, el programa debe imprimir los dos candidatos más votados, que serán los que pasen a la segunda ronda de las elecciones.


package programacionPares;
public class _36_Ejercicio {
public static final int f = 5, c = 4;
public static void main(String[] args) {
int Matriz[][] = new int [f][c];

System.out.println("\t\tCand-1\tCand-2\tCand-3\tCand-4");
for (int i = 0; i < f; i++){
System.out.print("Municipio: ["+(i+1)+"]");
for (int j = 0; j < c; j++){
Matriz[i][j] = Integer.parseInt(javax.swing.JOptionPane.showInputDialog("Candidato ["+(j+1)+"]"+"\nMunicipio ["+(i+1)+"]", ""));
System.out.print("\t"+Matriz[i][j]);
}
System.out.println();
}

int Vector [] = new int [c];

// SUMA DE VOTOS
Vector = ResVect(Vector, Matriz);

System.out.println("\nCalculo de Candidatos");
System.out.print("Votos Total: ");

int totalVotos = 0;
for (int value: Vector){
System.out.print("\t"+value);
totalVotos += value;
}

double [] Porcentajes = new double [c];

// OBTIENE LOS PORCENTAJES
Porcentajes = ObtenerPorcent(totalVotos, Vector, Porcentajes);

System.out.println();

// RESULTADO DE VOTACION
ResultadosVotacion(Porcentajes);
}

// SUMA DE VOTACIONES
public static int [] ResVect (int [] Vec, int [][] Matriz){

int Suma, mayorVotado = 0, Pos = 0;
for (int j = 0; j < c; j++){
Suma = 0;
for (int i = 0; i < f; i++){
Suma += Matriz[i][j];
}

Vec[j] = Suma;
if (mayorVotado < Vec[j]){
mayorVotado = Vec[j];
Pos = j + 1;
}
}

return Vec;
}

// OBTIENE PORCENTAJES
public static double [] ObtenerPorcent(int totVotos, int [] aVect, double [] Porcentajes){
System.out.print("\nPorcentaje: ");
for (int i = 0; i < Porcentajes.length; i++){
Porcentajes[i] = (aVect[i]*100) / totVotos;
System.out.print("\t"+Porcentajes[i]+"%");
}
return Porcentajes;
}

// RESULTADOS DE VOTACIONES
public static void ResultadosVotacion(double[] porcentajes){
boolean verif = true;
double Mayor1 = 0;
int posMay1 = 0;
double Mayor2 = 0;
int posMay2 = 0;

for (int i = 0; i < porcentajes.length; i++){
if (porcentajes[i] > Mayor1){
Mayor1 = porcentajes[i];
posMay1 = i;
}

if (porcentajes[i] > 50.00){
System.out.println("GANADOR"+" Candidato "+(i+1));
verif = false;
}
}

for (int i = 0; i < porcentajes.length; i++){
if (posMay1 != i){
if (porcentajes[i] > Mayor2){
Mayor2 = porcentajes[i];
posMay2 = i + 1;
}
}
}

if (verif){
System.out.println("\nSEGUNDA VUELTA");
System.out.println("Candidato : "+(posMay1+1)+" porcentaje "+Mayor1);
System.out.println("Candidato : "+posMay2+" porcentaje "+Mayor2);
}
}

}


Captura de Ingreso de Matriz


Resultado 1 Ganador


Resultado 2 Segunda vuelta


miércoles, 9 de julio de 2014

Congruencia de Zeller

Ejercicio 1:

Congruencia de Zeller

Realice un programa que imprima los días de un mes y de un año ingresados por teclado, utilizando la congruencia de Zeller, el mismo deberá considerar si el año ingresado es bisiesto y los días que pueden tener cada mes, además debe de presentar los últimos días del mes anterior (si es que hay disponibles) y los primeros días del mes siguiente según el mes que sea este.

Consideraciones
Para calcular la congruencia de Zeller, se parte de una fecha del calendario gregoriano o Juliano como en nuestro ejercicio, se consideran como tres enteros: año, mes (1=enero, 12=diciembre) y día. Pero solo se lo realizara ingresando mes y año.

Los meses de Enero y Febrero serán equivalentes a los meses 13 y 14 del mes anterior.
q = es el día del mes
m = es el mes

Se debe obtener los valores de:
j = es la centura (año / 100)
k = es el año de la centuria (año % 100)

A partir de ahí, basta con aplicar la fórmula.



Falta el texto Alt de la imagen

h = dia devuelto (0 = Sabado, 1 = Domingo, 2 = Lunes, 3 = Martes, 4 = Miercoles, 5 = Jueves, 6 Viernes)

Desarrollo:
Java (Eclipse Standard/SDK)

package congruencia;
public class trabajo1 {
public static void main(String[] args) {
// INGRESO AÑO Y MES
int aa = Integer.parseInt(javax.swing.JOptionPane.showInputDialog("Ingrese el año",""));
int mm = Integer.parseInt(javax.swing.JOptionPane.showInputDialog("Ingrese el mes",""));

// DIAS PERMITIDOS POR MES
int dperm = 0; // Variable para los días permitidos del mes (28, 29, 30 o 31)
switch (mm){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dperm = 32; break;
case 4:
case 6:
case 9:
case 11: dperm = 31; break;
case 2:
if (aa%4 == 0 & aa%100 != 0 || aa %400 == 0){
dperm = 30;
} else{
dperm = 29;
}
break;
}

// CONDICION SI EL MES ES 1 O 2
if (mm <= 2){
mm += 12;
aa -= 1;
}

// OBTIENE CENTURIA y AÑO DE CENTURIA....
int j = aa / 100;
int k = aa % 100;

// DIA DE INICIO
int h = (1+(26*(mm+1))/10+k+k/4+j/4+5*j)%7;
System.out.println("Sa\tDo\tLu\tMa\tMi\tJu\tVi");

// OBTIENE LOS DIAS
int dias = 0, salto = 0; // salto es para cambiar de línea
int mesSig = 0; // Dias del mes siguiente
int cal[] = new int [42]; // Guarda los días encontrados

for (int i = h; i < cal.length; i++){
dias++;
if (dias < dperm){ // DIAS DEL MES
cal[i] = dias;
} else{ // DIAS DEL SIGUIENTE MES
mesSig++;
cal[i] = mesSig;
}
}

// OBTIENE LOS DIAS DEL MES ANTERIOR
if (h != 0){
int dMesAnt = 0;
switch (mm){
case 3:
if (aa%4 == 0 & aa%100 != 0 || aa %400 == 0){
dMesAnt = 29;
} else{
dMesAnt = 28;
}
break;
case 4: dMesAnt = 31; break;
case 5: dMesAnt = 30; break;
case 6: dMesAnt = 31; break;
case 7: dMesAnt = 30; break;
case 8: dMesAnt = 31; break;
case 9: dMesAnt = 31; break;
case 10: dMesAnt = 30; break;
case 11: dMesAnt = 31; break;
case 12: dMesAnt = 30; break;
case 13: dMesAnt = 31; break;
case 14: dMesAnt = 31; break;
}

for (int i = h - 1; i >= 0; i--){
cal[i] = dMesAnt;
dMesAnt -= 1;
}
}

// MUESTRA RESULTADO
for (int i = 0; i < cal.length; i++){
System.out.print(cal[i]+"\t");
salto++;
if (salto == 7){
System.out.println("");
salto = 0;
}
}
}
}


Capturas:
1. Ingresamos el Año 

2. Ingresamos el mes

3. El resultado será los días del mes ingresado segun el año, junto a los días del mes anterior y los del mes siguiente.


David Arévalo Castro
Estudiante Licenciatura en Sistemas de Información


Introduccion

Hola a todos, hoy empezaré a subir ciertos ejercicios en Java (Eclipse), los cuales no se encuentran tan fácilmente, espero que sean de ayuda para todos quienes como yo, recién empiezan en esto que no es simplemente una ciencia sino que es un arte... como lo es programar :)