Sei sulla pagina 1di 16

Registro y Login de usuarios con

JSP,SERVLETS,MySQL
buenas tardes compaeros 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, implcitamente dividiremos la programacin en una arquitectura de 3 capas o niveles, en la capa de presentacion no
usaremos propiamente cdigo 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 presentacin: (Son los JSP) Formada por cdigo HTML, JavaScript, Ajax y para representar Java - ExpressionLanguage
y TagLibs.
* Capa de lgica 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 instalacin del netbeans o seguir este tema: http://www.bibigeek.com/2009/05/12/i...nte-instalado/
Cdigo ForosDelWeb:
Ver original

1. * El tipo de proyecto ser: Java Web - Web Application


2.
3. * Yo le llamar 'JavaWeb1'
4.
5. * El server que usar sera: Apache Tomcat 7
6.
7.
8.

Java EE version: Java EE 5

9.

Context Path: /JavaWeb1

10.
11.

Frameworks: Ninguno

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


index.jsp ser una pgina 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 contrasea correctamente, por lo que utilizaremos una condicional para verificar.

ANOTACIN

--------------------------------------------------Hemos hablado que los archivos JSP corresponden a la Capa de presentacin, por lo que el uso de cdigo Java en este archivo
"tratndose de una arquitectura de 3 capas" no sera correcto aunque si sera funcional.
Cita:

Tocando el tema de lo "correcto e incorrecto"; Vale aclarar que el uso de cdigo Java en un JSP no es inadecuado o incorrecto, lo
que sucede es que en principio cuando diseadores y programadores trabajaban juntos surgieron problemas ya que el Diseador
tena que saber Java para poder manipular correctamente los JSP. Para solucionar sto aparecieron unas etiquetas llamadas
TagLibs.
Las Taglibs tienen un limitado de programacin Java, pero el suficiente. Yo en mi experiencia de 1 mes en programacin 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:
Cdigo 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 aadir 2 librerias al proyecto. Click sobre el nombre de proyecto "JavaWeb1",
propiedades, librerias y aadimos JSTL1.1 y MySQL JDBC Driver
Aadimos esta linea en la parte mas superior (debajo de los comentarios) de nuestro index.jsp, login.jsp y register.jsp
Cdigo java:
Ver original

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

--------------------------------------[COLOR="rgb(46, 139, 87)"]

ANOTACIN[/COLOR]

Supongo que muchos ya esta aburridos, siento que este tema se haya extendido tanto pero me pareci importante dar un poco de
teora y no solo cdigo explicado. Sin embargo, ahora pasemos a "solo cdigo Explicado"
-------------------------------------------------------------------------* Crearemos un "bean" para realizar todos los mtodos 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"

Cdigo 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.
18.

conexion.close();
}

19.
20.

//Metodo para consultar si un email y contrasean pertenecen a una cuenta registrada

21.

public boolean isAcountExists(String email, String password) throws SQLException{

22.
23.

String sql = "SELECT * FROM usuarios WHERE email='"+email+"' AND


password='"+password+"'";
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
Cdigo 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.
17.

return null;
}

18. }

[COLOR="rgb(255, 140, 0)"]

2 Forma:[/COLOR]

DaoUser2.java
Cdigo 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.
11.

try {
d.conectar();

12.
13.
14.

setUserName(d.getNameByEmail(email));

15.

d.desconectar();

16.

} catch (Exception e) {}

17.

18.
19.

public String getUserName() {

20.
21.

return userName;
}

22.
23.

public String getEmail() {

24.
25.

return email;
}

26.
27.

public void setUserName(String userName) {

28.
29.

this.userName = userName;
}

30.
31.

public void setEmail(String email) {

32.
33.

this.email = email;
}

34. }

Cualquiera de las 2 formas es correcto, pero la segunda tiene un impacto ms 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 +.
#2 (permalink)
20/07/2011, 14:00

Fecha de Ingreso: septiembre-2007


Ubicacin: PyRoot
Mensajes: 1.511
Antigedad: 6 aos, 10 meses
Puntos: 187

iovan
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

* Ahora crearemos 2 formularios HTML 1 para el ingreso de usuarios y el otro para el registro.
login.jsp
Cdigo java:
Ver original

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

2. <%@page contentType="text/html" pageEncoding="UTF-8"%>


3. <%-- En caso de que exista una sesion iniciada redirecciono a index.jsp. "NO tiene caso
mostrar este formulario cuando hay una sesion iniciada --%>
4. <t:if test="${sessionScope['sessionEmail']!=null}">
5.

<% response.sendRedirect("index.jsp");%>

6. </t:if>
7. <!DOCTYPE html>
8. <html>
9.

<head>

10.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

11.

<title>Iniciar sesion</title>

12.

</head>

13.

<body>

14.

<h1>Iniciar sesion</h1>

15.

<p><a href="register.jsp">Registrarse</a></p>

16.

<p style="color: #ff0000">${sessionScope['error']}</p>

17.

<form action="Login" method="post">

18.

<p> Email: <input type="text" name="email"></p>

19.

<p> Contrasea: <input type="password" name="password"></p>

20.

<p><input type="submit" value="Entrar"></p>

21.
22.

</form>
</body>

23. </html>

register.jsp
Cdigo java:
Ver original

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


2. <%@page contentType="text/html" pageEncoding="UTF-8"%>
3. <%-- En caso de que exista una sesion iniciada redirecciono a index.jsp. "NO tiene caso
mostrar este formulario cuando hay una sesion iniciada --%>
4. <t:if test="${sessionScope['sessionEmail']!=null}">
5.

<% response.sendRedirect("index.jsp");%>

6. </t:if>
7. <!DOCTYPE html>
8. <html>
9.

<head>

10.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

11.

<title>Registrarse</title>

12.

</head>

13.

<body>

14.

<h1>Iniciar sesion</h1>

15.

<p><a href="login.jsp">Iniciar Sesion</a></p>

16.
17.

<p style="color: #ff0000">${sessionScope['error']}</p>

18.

<form action="Register" method="post">

19.

<p>Nombre: <input type="text" name="name"></p>

20.

<p>Email: <input type="text" name="email"></p>

21.

<p>Contrasea: <input type="password" name="password1"></p>

22.

<p>Confirma contrasea <input type="password" name="password2"></p>

23.

<p><input type="submit" value="Entrar"></p>

24.
25.

</form>
</body>

26. </html>

En el atributo action de la etiqueta form de ambos formularios vemos el nombre de 2 servlets "Register" y "Login"
Ahora pasaremos a trabajar en la capa de control.
Creando los servlets "Register" y "Login" - Nuevo Paquete llamado "servlets".
Click derecho "sobre le paquete servlets" luego en new --> servlet
Register.java
Cdigo java:
Ver original

1. package servlets;
2.
3. import beans.*;
4. import clases.*;
5. import java.util.regex.*;
6. import java.io.*;
7. import javax.servlet.ServletException;
8. import javax.servlet.http.HttpServlet;
9. import javax.servlet.http.HttpServletRequest;
10. import javax.servlet.http.HttpServletResponse;

11. import javax.servlet.http.HttpSession;


12.
13. public class Register extends HttpServlet {
14.
15.

@Override

16.

protected void doGet(HttpServletRequest request, HttpServletResponse response)

17.

throws ServletException, IOException {

18.

/* En este proyecto; este servlet no recibe ni debe recibir nada por GET,

19.

* asi que si se lleva a entrar al servelt

20.

* usando el metodo GET solamente redireccion al index.jsp

21.

*/

22.
23.

response.sendRedirect("index.jsp");
}

24.
25.

@Override

26.

protected void doPost(HttpServletRequest request, HttpServletResponse response)

27.

throws ServletException, IOException {

28.

HttpSession respuesta = request.getSession(true);

29.

PrintWriter out = response.getWriter();

30.

//Declaro e inicio las variables

31.

String nombreUsuario = request.getParameter("name");

32.

String emailUsuario = request.getParameter("email");

33.

String password = request.getParameter("password1");

34.

String confirm_password = request.getParameter("password2");

35.

Pattern p = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");

36.

Matcher m = p.matcher(emailUsuario);

37.

Validador v = new Validador();

38.

Dao d = new Dao();

39.

//Comienzo con las validaciones

40.

/*

41.

* Podemos hacer un monton de validaciones, por ejemplo:

42.

* Campos no vacios, direccion de email valida, nombre de usuario y contrasea

43.

* sin espacios y/o caracteres especiales.

44.

*/

45.
46.

//campos vacios

47.

if(nombreUsuario.isEmpty() || emailUsuario.isEmpty() || password.isEmpty() ||

confirm_password.isEmpty()){
48.

respuesta.setAttribute("error", "Hay campos vacios");

49.
50.

} else {

51.

//No hay campos vacios, veo que la direccion de email sea vlida

52.

if(m.find()){

53.

respuesta.setAttribute("error", "La direccion de email no es


correcta");

54.
55.

} else {

56.

//La direccion de email si es correcta, verifico que la contrasea


tambien lo sea

57.

if(v.isUsernameOrPasswordValid(password)){

58.

//Ahora verifico si la contrasea 1 y la contrasea 2 son iguales

59.

if(password.equals(confirm_password)){

60.

try {

61.

d.conectar();

62.

if(d.isEmailRegistered(emailUsuario)){

63.

respuesta.setAttribute("error", "Esta direccion de


correo ya fue registrada");

64.

} else {

65.
66.

//Legado a este punto significa que todo esta


correcto, por lo tanto ingreso a la DB

67.

d.registerUser(emailUsuario, password,
nombreUsuario);

68.

respuesta.setAttribute("error", null);

69.

70.
71.

d.desconectar();

72.
73.

} catch (Exception e) { out.println("Ocurrio la sig exception:


" +e); }

74.
75.
76.
77.

} else {

78.

respuesta.setAttribute("error", "Las contraseas no son


iguales");

79.

80.

81.
82.

} else {

83.

respuesta.setAttribute("error", "Contrasea no es vlida");

84.
85.

86.
87.
88.

89.

90.
91.

response.sendRedirect("register.jsp");

92.
93.

94.
95. }

-> continua debajo


__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
#3 (permalink)
20/07/2011, 14:00

Fecha de Ingreso: septiembre-2007


Ubicacin: PyRoot
Mensajes: 1.511
Antigedad: 6 aos, 10 meses
Puntos: 187

iovan
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

En el Servlet anterior estamos viendo el funcionamento de una Expresin Regular para verificar que una direccin de email sea
correcta, tambien surgi la necesidad de verificar que no existan espacios o caracteres especiales en el nombre de usuario y en la
contrasea. Para esto podemos hacer uso de otra Expresion Regular, pero como aprendices de programacin haremos las cosas por
el modo mas largo, asi que crearemos un mtodo para realizar sta verificacion
He creado un paquete llamado "clases" y dentro de el una Javaclase llamada "Validador.java" que contiene al
mtodo isUsernameOrPasswordValid
Cdigo java:
Ver original

1. public boolean isUsernameOrPasswordValid(String $cadena) {


2.
char[] cadena = $cadena.toLowerCase().toCharArray();
3.
4.

//Compruebo la longitud

5.

if (cadena.length <= 6) {

6.

return false;

7.

8.

for (int i = 0; i < cadena.length; i++) {

9.

//Compruebo que no existan caracteres especiales (solamento los que podrian


ser usados para una inyeccion SQL o perjudicar en la consulta);

10.

if (cadena[i] == ' '

11.

|| cadena[i] == '='

12.

|| cadena[i] == '?'

13.

|| cadena[i] == '+'

14.

|| cadena[i] == '*'

15.

|| cadena[i] == '-'

16.

|| cadena[i] == '%'

17.

|| cadena[i] == '/'

18.

|| cadena[i] == '.'

19.

|| cadena[i] == ','

20.

|| cadena[i] == ';'

21.

|| cadena[i] == '!'

22.

|| cadena[i] == '<'

23.

|| cadena[i] == '>'

24.

|| cadena[i] == ':') {

25.

return false;

26.

27.
28.

29.

return true;

30.

servlet Login.java
Cdigo java:
Ver original

1. package servlets;
2.
3. import beans.DaoUser;
4. import clases.Validador;
5. import java.io.IOException;
6. import java.util.regex.*;

7. import javax.servlet.ServletException;
8. import javax.servlet.http.HttpServlet;
9. import javax.servlet.http.HttpServletRequest;
10. import javax.servlet.http.HttpServletResponse;
11. import javax.servlet.http.HttpSession;
12.
13. public class Login extends HttpServlet {
14.
15.

@Override

16.

protected void doGet(HttpServletRequest request, HttpServletResponse response)

17.

throws ServletException, IOException {

18.

/* En este proyecto; este servlet no recibe ni debe recibir nada por GET,

19.

* asi que si se lleva a entrar al servelt

20.

* usando el metodo GET solamente redireccion al index.jsp

21.

*/

22.
23.

response.sendRedirect("index.jsp");
}

24.
25.

@Override

26.

protected void doPost(HttpServletRequest request, HttpServletResponse response)

27.

throws ServletException, IOException {

28.

HttpSession respuesta = request.getSession(true);

29.

String email = request.getParameter("email");

30.

String password = request.getParameter("password");

31.

Pattern p = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");

32.

Matcher m = p.matcher(email);

33.

Validador v = new Validador();

34.

DaoUser d = new DaoUser();

35.
36.

//campos vacios

37.

if (email.isEmpty() || password.isEmpty()) {

38.

respuesta.setAttribute("error", "Hay campos vacios");

39.
40.

} else {

41.

//No hay campos vacios, veo que la direccion de email sea vlida

42.

if (m.find()) {

43.

respuesta.setAttribute("error", "La direccion de email no es

correcta");
44.
45.

} else {

46.

//La direccion de email si es correcta, verifico que la contrasea


tambien lo sea

47.

if (v.isUsernameOrPasswordValid(password)) {

48.

try {

49.

d.conectar();

50.

if (d.isAcountExists(email, password)) {

51.

//Significa que la cuenta si existe

52.

//OBTENGO EL NOMBRE DEL USUARIO Y LO GUARDO EN UNA


SESION

53.

String NombreUsuario = d.getNameByEmail(email);

54.

respuesta.setAttribute("sessionNombre", NombreUsuario);

55.

respuesta.setAttribute("sessionEmail", email);

56.
57.

} else {

58.

respuesta.setAttribute("error", "Esta direccion de


correo ya fue registrada");

59.

60.
61.

d.desconectar();

62.
63.

} catch (Exception e) {}

64.
65.
66.
67.
68.

} else {

69.

respuesta.setAttribute("error", "Contrasea no es vlida");

70.
71.

72.
73.
74.
75.

}
}

76.
77.

response.sendRedirect("login.jsp");

78.
79.

80. }

Por ltimo falta crear el archivo que invalida las sesiones til para (Cerrar Sesion), en nuestro ejemplo ser un servlet
Logout.java
Cdigo java:
Ver original

1. package servlets;
2.
3. import java.io.IOException;
4. import java.io.PrintWriter;
5. import javax.servlet.ServletException;
6. import javax.servlet.http.HttpServlet;
7. import javax.servlet.http.HttpServletRequest;
8. import javax.servlet.http.HttpServletResponse;
9. import javax.servlet.http.HttpSession;
10.
11. public class Logout extends HttpServlet {
12.
13.
14.

//Ya sea que el mtodo sea por GET o POST, cerraremos la sesion.
protected void processRequest(HttpServletRequest request, HttpServletResponse
response)

15.

throws ServletException, IOException {

16.

response.setContentType("text/html;charset=UTF-8");

17.

PrintWriter out = response.getWriter();

18.

HttpSession sesion = request.getSession(true);

19.
20.

//Cerrar sesion

21.

sesion.invalidate();

22.
23.

//Redirecciono a index.jsp

24.

response.sendRedirect("index.jsp");

25.

26.
27.

@Override

28.

protected void doGet(HttpServletRequest request, HttpServletResponse response)

29.

throws ServletException, IOException {

30.
31.

processRequest(request, response);
}

32.
33.

@Override

34.

protected void doPost(HttpServletRequest request, HttpServletResponse response)

35.

throws ServletException, IOException {

36.
37.

processRequest(request, response);
}

38. }

----------------------------------------------------------------------------------------------------------------------------------------------------------------Conclusin. Hemos visto que la programacin esta separada por capas.


* La capas de presentacion son los archivos JSP, no tienen cdigo Java explicito si no que usan Expression Language.
* Las capas de control son los servlets.
* Las capas de datos son los beans (Archivos que nosotros llamamos Dao). Dao son las siglas de Data Access Object de ahi el
nombre.
En una programacin orientada a objetos, el orden en el que programemos dar como resultado el tiempo en que lo programemos.
RECOMENDACIN: Por eso es que siempre es recomendable plantear el problema antes de comenzar a codificar usando lapiz
y papel para identificar los objetos/clases y sus mtodos.
Por ello, una de las cosas que en ste tutorial hicimos al comienzo fue crear todos los mtodos necesarios.
Espero que a ms de uno les sirva este material.
Les mando un saludo.
xitos.

Potrebbero piacerti anche