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),
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>
Clave de desencriptación: !-pGDbRLVvMuJ7KEvDbig4Q