Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
9.
10.
11.
Frameworks: Ninguno
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
4.
5.
6.
PRIMARY KEY
(`id`)
___________________________________
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
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.
6.
7.
8.
9.
10.
11.
12.
Class.forName("com.mysql.jdbc.Driver");
13.
conexion=DriverManager.getConnection("jdbc:mysql://localhost:3306/javaweb1",userDb,
passDb);
14.
15.
16.
17.
18.
conexion.close();
}
19.
20.
21.
22.
23.
24.
ResultSet rs = ps.executeQuery();
25.
26.
return rs.next();
27.
28.
29.
30.
31.
32.
PreparedStatement ps = conexion.prepareStatement(sql);
33.
ResultSet rs = ps.executeQuery();
34.
35.
return rs.next();
36.
37.
38.
39.
40.
41.
PreparedStatement ps = conexion.prepareStatement(sql);
42.
ps.executeUpdate();
43.
44.
45.
46.
47. }
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.
8.
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. }
2 Forma:[/COLOR]
DaoUser2.java
Cdigo java:
Ver original
1. package beans;
2.
3. public class DaoUser2 extends Dao{
4.
5.
6.
7.
8.
9.
10.
11.
try {
d.conectar();
12.
13.
14.
setUserName(d.getNameByEmail(email));
15.
d.desconectar();
16.
} catch (Exception e) {}
17.
18.
19.
20.
21.
return userName;
}
22.
23.
24.
25.
return email;
}
26.
27.
28.
29.
this.userName = userName;
}
30.
31.
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
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
<% response.sendRedirect("index.jsp");%>
6. </t:if>
7. <!DOCTYPE html>
8. <html>
9.
<head>
10.
11.
<title>Iniciar sesion</title>
12.
</head>
13.
<body>
14.
<h1>Iniciar sesion</h1>
15.
<p><a href="register.jsp">Registrarse</a></p>
16.
17.
18.
19.
20.
21.
22.
</form>
</body>
23. </html>
register.jsp
Cdigo java:
Ver original
<% response.sendRedirect("index.jsp");%>
6. </t:if>
7. <!DOCTYPE html>
8. <html>
9.
<head>
10.
11.
<title>Registrarse</title>
12.
</head>
13.
<body>
14.
<h1>Iniciar sesion</h1>
15.
16.
17.
18.
19.
20.
21.
22.
23.
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;
@Override
16.
17.
18.
/* En este proyecto; este servlet no recibe ni debe recibir nada por GET,
19.
20.
21.
*/
22.
23.
response.sendRedirect("index.jsp");
}
24.
25.
@Override
26.
27.
28.
29.
30.
31.
32.
33.
34.
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.
38.
39.
40.
/*
41.
42.
43.
44.
*/
45.
46.
//campos vacios
47.
confirm_password.isEmpty()){
48.
49.
50.
} else {
51.
//No hay campos vacios, veo que la direccion de email sea vlida
52.
if(m.find()){
53.
54.
55.
} else {
56.
57.
if(v.isUsernameOrPasswordValid(password)){
58.
59.
if(password.equals(confirm_password)){
60.
try {
61.
d.conectar();
62.
if(d.isEmailRegistered(emailUsuario)){
63.
64.
} else {
65.
66.
67.
d.registerUser(emailUsuario, password,
nombreUsuario);
68.
respuesta.setAttribute("error", null);
69.
70.
71.
d.desconectar();
72.
73.
74.
75.
76.
77.
} else {
78.
79.
80.
81.
82.
} else {
83.
84.
85.
86.
87.
88.
89.
90.
91.
response.sendRedirect("register.jsp");
92.
93.
94.
95. }
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
//Compruebo la longitud
5.
if (cadena.length <= 6) {
6.
return false;
7.
8.
9.
10.
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.
17.
18.
/* En este proyecto; este servlet no recibe ni debe recibir nada por GET,
19.
20.
21.
*/
22.
23.
response.sendRedirect("index.jsp");
}
24.
25.
@Override
26.
27.
28.
29.
30.
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.
34.
35.
36.
//campos vacios
37.
if (email.isEmpty() || password.isEmpty()) {
38.
39.
40.
} else {
41.
//No hay campos vacios, veo que la direccion de email sea vlida
42.
if (m.find()) {
43.
correcta");
44.
45.
} else {
46.
47.
if (v.isUsernameOrPasswordValid(password)) {
48.
try {
49.
d.conectar();
50.
if (d.isAcountExists(email, password)) {
51.
52.
53.
54.
respuesta.setAttribute("sessionNombre", NombreUsuario);
55.
respuesta.setAttribute("sessionEmail", email);
56.
57.
} else {
58.
59.
60.
61.
d.desconectar();
62.
63.
} catch (Exception e) {}
64.
65.
66.
67.
68.
} else {
69.
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.
16.
response.setContentType("text/html;charset=UTF-8");
17.
18.
19.
20.
//Cerrar sesion
21.
sesion.invalidate();
22.
23.
//Redirecciono a index.jsp
24.
response.sendRedirect("index.jsp");
25.
26.
27.
@Override
28.
29.
30.
31.
processRequest(request, response);
}
32.
33.
@Override
34.
35.
36.
37.
processRequest(request, response);
}
38. }