Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/07/2011, 13:59
iovan
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
[Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Buenas tardes compañeros y amigos.

Si te llegas a perder en este tutorial no te preocupes, al final encontraras un link para descargar el proyecto completo.

Mirando en las FAQS del foro de JAVA y utilizando el buscador no dí con un aporte de éste tema, así que aquí estoy publicando.

En este tema hablaremos de una de las formas para conseguir programar un registro y logeo de usuarios utilizando Servlets, JSP y MySQL, implícitamente dividiremos la programación en una arquitectura de 3 capas o niveles, en la capa de presentacion no usaremos propiamente código JAVA si no en su lugar usaremos taglibs y ExpressionLanguage. Mas adelante explicaremos a que me refiero con capas y la importancia de estas.

Proyecto realizado en NetBeans.

ARQUITECTURA DE 3 CAPAS.

En el libro Head First Servlets de Kathy Sierra pag 773, nuestra querida autora ofrece una de las mejores explicaciones que he visto en los libros mas populares de Java con JSP y ServLets. Pero yo solo ofrezco una de la mas breves e introductoras informaciones poco útiles que existen en Internet.

* Capa de presentación: (Son los JSP) Formada por código HTML, JavaScript, Ajax y para representar Java - ExpressionLanguage y TagLibs.

* Capa de lógica o control: Propiamente JAVA usando Servlets

*Capa de datos: Los llamaremos Beans, contienen los metodos que realizan las operaciones en el lenguaje de la base de datos, en nuestro caso SQL.


Para profundizar en el tema recomiendo el libro de Kathy Sierra - Head First Servlets o visitar google.
+Breve info: http://www.di-mare.com/adolfo/cursos.../pp-3capas.pdf
-----------------------------------------------------------------------------------------

Comenzaremos creando un proyecto en netbeans. (Yo estoy utilizando la version 7 aunque en la version 6 en este aspecto es exactamente igual en cuando a los pasos que hay que seguir)

Cita:
NOTA: Hay que tener instalado TomCat 5+; Si te descargaste la version mas pesada del NetBeans y cuando lo instalaste lo hiciste de la forma correcta, es decir dando click en "aceptar/aceptar/aceptar" entonces ya lo tienes instalado ;D. En caso contrario puedes volver a correr el paquete de instalación del netbeans o seguir este tema: http://www.bibigeek.com/2009/05/12/i...nte-instalado/
Código ForosDelWeb:
Ver original
  1. * El tipo de proyecto será: Java Web - Web Application
  2. * Yo le llamaré 'JavaWeb1'
  3. * El server que usaré sera: Apache Tomcat 7
  4.    Java EE version: Java EE 5
  5.    Context Path: /JavaWeb1
  6.    Frameworks: Ninguno

Se nos crea un index.jsp por defecto. Comenzaremos a trabajar aqui.

index.jsp será una página que se mostrará exclusivamente en caso de que exista alguna sesion iniciada, en otras palabras, que algun usuario se haya ingresado con su Usuario y contraseña correctamente, por lo que utilizaremos una condicional para verificar.

--------------------------------------------------- ANOTACIÓN
Hemos hablado que los archivos JSP corresponden a la Capa de presentación, por lo que el uso de código Java en este archivo "tratándose de una arquitectura de 3 capas" no sería correcto aunque si sería funcional.

Cita:
Tocando el tema de lo "correcto e incorrecto"; Vale aclarar que el uso de código Java en un JSP no es inadecuado o incorrecto, lo que sucede es que en principio cuando diseñadores y programadores trabajaban juntos surgieron problemas ya que el Diseñador tenía que saber Java para poder manipular correctamente los JSP. Para solucionar ésto aparecieron unas etiquetas llamadas TagLibs.
Las Taglibs tienen un limitado de programación Java, pero el suficiente. Yo en mi experiencia de 1 mes en programación Java ... xD .... no me he topado con limitantes, sin embargo Kathy Sierra nos menciona algunos ejemplos en su guia de estudio para obtener el SCJP (Sun Certified Programmer for Java 6 - Kathy Sierra)

-----------------------------------------------------------------------------------------------------
El nombre de la base de datos de este ejemplo es: javaweb1
y la tabla:

Código SQL:
Ver original
  1. CREATE TABLE `usuarios` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `email` VARCHAR(100) NOT NULL,
  4.   `password` VARCHAR(50) NOT NULL,
  5.   `name` VARCHAR(100) NOT NULL,
  6.   PRIMARY KEY  (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

___________________________________

Para comenzar a utilizar TagLibs y MySQL hay que añadir 2 librerias al proyecto. Click sobre el nombre de proyecto "JavaWeb1", propiedades, librerias y añadimos JSTL1.1 y MySQL JDBC Driver

Añadimos esta linea en la parte mas superior (debajo de los comentarios) de nuestro index.jsp, login.jsp y register.jsp

Código java:
Ver original
  1. <%@taglib prefix="t" uri="http://java.sun.com/jsp/jstl/core" %>

--------------------------------------[COLOR="rgb(46, 139, 87)"]ANOTACIÓN[/COLOR]

Supongo que muchos ya esta aburridos, siento que este tema se haya extendido tanto pero me pareció importante dar un poco de teoría y no solo código explicado. Sin embargo, ahora pasemos a "solo código Explicado"
--------------------------------------------------------------------------

* Crearemos un "bean" para realizar todos los métodos necesarios de las consultas SQL. (Recordar que los "beans" pertenecen a la "capa de datos" así que podemos crear un nuevo paquete que se llame "Beans" dentro del Source Packages, dentro de éste paquete creare un Java Class llamado "Dao.java"


Código java:
Ver original
  1. package beans;
  2. import java.sql.*;
  3.  
  4. public class Dao {
  5.     public Connection conexion;
  6.     public final static String userDb = "root";
  7.     public final static String passDb = "123456";
  8.    
  9.    
  10.     //Conectar a la Base de datos
  11.     public void conectar() throws SQLException,ClassNotFoundException{
  12.          Class.forName("com.mysql.jdbc.Driver");
  13.          conexion=DriverManager.getConnection("jdbc:mysql://localhost:3306/javaweb1",userDb, passDb);
  14.     }
  15.     //Desconectar a la Base de datos
  16.     public void desconectar() throws SQLException, ClassNotFoundException{
  17.         conexion.close();
  18.     }
  19.    
  20.     //Metodo para consultar si un email y contraseñan pertenecen a una cuenta registrada
  21.     public boolean isAcountExists(String email, String password) throws SQLException{
  22.         String sql = "SELECT * FROM usuarios WHERE email='"+email+"' AND password='"+password+"'";
  23.         PreparedStatement ps = conexion.prepareStatement(sql);
  24.         ResultSet rs = ps.executeQuery();
  25.        
  26.         return rs.next();
  27.     }
  28.    
  29.     //Metodo para consultar si el email recibido ya esta registrado
  30.     public boolean isEmailRegistered(String email) throws SQLException{
  31.         String sql = "SELECT * FROM usuarios WHERE email='"+email+"'";
  32.         PreparedStatement ps = conexion.prepareStatement(sql);
  33.         ResultSet rs = ps.executeQuery();
  34.  
  35.         return rs.next();
  36.     }
  37.    
  38.     //Metodo para registrar una cuenta
  39.     public void registerUser(String email, String password, String name) throws SQLException{
  40.         String sql = "INSERT INTO `usuarios`(`email`,`password`,`name`) VALUES ('"+email+"','"+password+"','"+name+"')";
  41.         PreparedStatement ps = conexion.prepareStatement(sql);
  42.         ps.executeUpdate();
  43.     }
  44.    
  45.    
  46.    
  47. }


* Crearemos otro "bean" para obtener el nombre de un usuario

--> Se me ocurren 2 formas. Obtenerlo mediante una consulta SQL y devolver una cadena, u obtenerlo mediante un objeto que llama a una consulta SQL.

1° Forma:

DaoUser.java
Código java:
Ver original
  1. package beans;
  2. import java.sql.*;
  3.  
  4. public class DaoUser extends Dao {
  5.    
  6.    
  7.     public String getNameByEmail(String email) throws SQLException{
  8.         String sql = "SELECT * FROM usuarios WHERE email='"+email+"'";
  9.         PreparedStatement ps = conexion.prepareStatement(sql);
  10.         ResultSet rs = ps.executeQuery();
  11.        
  12.         if(rs.next()){
  13.             return rs.getString("name");
  14.         }
  15.        
  16.         return null;
  17.     }
  18. }

[COLOR="rgb(255, 140, 0)"]2° Forma:[/COLOR]

DaoUser2.java
Código java:
Ver original
  1. package beans;
  2.  
  3. public class DaoUser2 extends Dao{
  4.     public String userName;
  5.     public String email;
  6.  
  7.    
  8.     public DaoUser2(String email){
  9.         DaoUser d = new DaoUser();
  10.         try {
  11.             d.conectar();
  12.            
  13.             setUserName(d.getNameByEmail(email));
  14.            
  15.             d.desconectar();
  16.         } catch (Exception e) {}
  17.     }
  18.    
  19.     public String getUserName() {
  20.         return userName;
  21.     }
  22.  
  23.     public String getEmail() {
  24.         return email;
  25.     }
  26.  
  27.     public void setUserName(String userName) {
  28.         this.userName = userName;
  29.     }
  30.    
  31.     public void setEmail(String email) {
  32.         this.email = email;
  33.     }
  34. }

Cualquiera de las 2 formas es correcto, pero la segunda tiene un impacto más profesional "o bueno al menos eso escuche decir", para mi la segunda es como un - "mas trabajo por el mismo precio".

------------------------------------------------------------------------------------------------------

-> continua debajo
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.