jueves, 28 de noviembre de 2013

Practica 1

Enunciado del ejercicio:
Enunciado:
Diseñar una aplicación Web que posibilite registrar nuevos clientes en un servicio postventa de un 
fabricante de objetivos fotográficos. Para ello se solicitará que se rellene un formulario que contiene 
los siguientes campos: login, clave, email, nombre del cliente, apellidos del cliente, dirección postal 
del cliente, modelo del objetivo adquirido, fecha de compra, nombre de la tienda donde se adquirió y 
número de serie del objetivo.
Se validará el formulario. Si el login ya existe se indicará y pedirá uno nuevo. Se valida la clave de 
forma que posea entre 8 y 16 caracteres, al menos una letra mayúscula y al menos un dígito. 
También se valida el email (debe ser un email válido), la fecha de compra (formato dd/mm/aaaa) y 
además no debe ser posterior a la fecha de hoy. Si todo es correcto, se añade la información a la base 
de datos y se informa de que el registro ha sido correcto.
La aplicación mostrará inicialmente una página en la que se ofrece al usuario registrarse en el 
servicio. Si pulsa el botón de nuevo registro, se procederá a ofrecer el formulario, validarlo e informar 
de ello. Si hay errores se mostrará de nuevo el formulario indicando la razón del error. Si no hay 
errores, se indicará que todo ha sido correcto.
Nombre del proyecto Eclipse: ApRegistroPostVenta
Contexto raiz: regpostventa
Nombre de la base de datos MySQL: postventa
Se pide: El proyecto Eclipse completo, código fuente java debidamente documentado en Javadoc, 
script de creación y rellenado inicial de la base de datos MySQL, diagrama del modelo relacional 
creado con WorkBench, archivo WAR (sin contener librería ConectorJ).
Se sube todo comprimido en un archivo denominado PR01-<Primerapellido><SegundoApellido>.[zip|
rar]
Nota: Se supone que la base de datos está en 3 forma normal.

El ejercicio funcionando: http://negrero.no-ip.org:8081/regpostventa/
Planteamiento de la base de datos:





Utilizo cuatro archivos para la web dos clases beans y tres clases pojo de las cuales el peso lo llevan:
registro.jsp y las clases Control y Validador:


registro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
form.elegante input {
  padding: .2em;
}
form div {
  margin: .4em 0;
 
}
.pequeño{
width: 22%;
}
.mediano{
width: 22%;
}
.grande{
width: 22%;
}
form div label {
  float: left;
}
#contenedor {
  width: 700px;
  margin: 0 auto;
}
font{
color:red;
 font-size:12px;
}
</style>
</head>
<body>
<!--  Mi clases para capturar los datos  -->
<jsp:useBean id="usuario" class="pojo.Usuario"></jsp:useBean>
<jsp:useBean id="cliente" class="pojo.Cliente"></jsp:useBean>
<jsp:useBean id="producto" class="pojo.Producto"></jsp:useBean>
<jsp:useBean id="validador" class="beans.Validador"></jsp:useBean>
<!--  Clase que recoge los valores si los datos son correctos como es validar datos -->
<jsp:useBean id="control" class="beans.Control"></jsp:useBean>
<jsp:setProperty property="*" name="usuario"/>
<jsp:setProperty property="*" name="cliente"/>
<jsp:setProperty property="*" name="producto"/>
<jsp:setProperty property="control" name="validador" value="<%=control%>"/>
<%if (request.getParameter("aceptar")!=null){%>
<jsp:setProperty property="usuario" name="control" value="<%= usuario%>"/>
<jsp:setProperty property="cliente" name="control" value="<%=cliente%>"/>
<jsp:setProperty property="producto" name="control"  value="<%=producto%>"/>
<jsp:setProperty property="aceptar" name="control" value='<%=request.getParameter("aceptar")%>'/>
<%} %>
<div id="contenedor" >
<form action="registro.jsp">
<fieldset>
<legend>Datos de usuario</legend>
<div>
<!--
Exlicacion de la validacion de los campos de formulario:
value=si no es null(=null primera vez, al cargar la pagina) no muestra el valor null pero sino muestra el valor que tenia anterior
<font> Entre las etiquetas font pregunto si se ha pulsado aceptar(primera vez) y despues  pregunto si es valido 
a partir de un patron dado, si no es valido mensaje de error
  
-->
<label for="login" class="pequeño">Login:</label> 
<input type="text" name="login" size="15"
value="<%if (usuario.getLogin()!=null){ %><jsp:getProperty property='login' name='usuario'/><%}%>"
maxlength="15" /> <font ><jsp:getProperty property="validarLogin" name="validador"/></font>
</div>
<div>
<label for="clave"class="pequeño">Clave:</label> 
<input type="password" maxlength="16" name="clave"
value="<%if (usuario.getClave()!=null){ %><jsp:getProperty property='clave' name='usuario'/><%}%>"
size="16" /> <font><jsp:getProperty property="validarClave" name="validador"/></font>
</div>
<div>
<label for="email" class="pequeño">Email:</label> <input
type="email" name="email" 
value="<%if (usuario.getEmail()!=null){ %><jsp:getProperty property='email' name='usuario'/><%}%>"
size="30" maxlength="30" /> <font><jsp:getProperty property="validarEmail" name="validador"/></font>
</div>
</fieldset>
<fieldset>
<legend>Datos de cliente</legend>
<div>
<label for="nombre"class="mediano">Nombre:</label>
<input type="text" max="15" maxlength="15" name="nombre"
value="<%if (cliente.getNombre()!=null){ %><jsp:getProperty property='nombre' name='cliente'/><%}%>"/>
<font><jsp:getProperty property="validarNombre" name="validador"/></font>
</div>
<div>
<label for="apellidos"class="mediano">Apellidos:</label>
<input type="text" max="30" maxlength="30" name="apellidos"
value="<%if (cliente.getApellidos()!=null){ %><jsp:getProperty property='apellidos' name='cliente'/><%}%>"/>
<font><jsp:getProperty property="validarApellidos" name="validador"/></font>
</div>
<div>
<label for="direccion"class="mediano">Direccion:</label>
<input type="text" size="30" maxlength="50" name="direccion"
value="<%if (cliente.getDireccion()!=null){ %><jsp:getProperty property='direccion' name='cliente'/><%}%>"/>
<font><jsp:getProperty property="validarNombre" name="validador"/></font>

</div>
</fieldset>
<fieldset>
<legend>Datos del Producto</legend>
<div>
<label for="objetivo"class="grande">Modelo objetivo:</label>
<input type="text" size="15" maxlength="15" name="objetivo"
value="<%if (producto.getObjetivo()!=null){ %><jsp:getProperty property='objetivo' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarObjetivo" name="validador"/></font>
</div>
<div>
<label for="fecha" class="grande">Fecha de compra:</label>
<input type="text" name="fecha"
value="<%if (producto.getFecha()!=null){ %><jsp:getProperty property='fecha' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarFecha" name="validador"/></font>
</div>
<div>
<label for="tienda" class="grande">Nombre de la tienda:</label>
<input type="text" size="30" maxlength="30" name="tienda"
value="<%if (producto.getTienda()!=null){ %><jsp:getProperty property='tienda' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarTienda" name="validador"/></font>
</div>
<div>
<label for="serie" class="grande">Nº de serie del objetivo:</label>
<input type="number" name="nserie" size="5" maxlength="5"
value="<%if (producto.getNserie()!=null){ %><jsp:getProperty property='nserie' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarNserie" name="validador"/></font>
</div>
</fieldset>
<fieldset>
<div>
<input type="submit" value="Aceptar" name="aceptar"/>
</div>
</fieldset>
<%if (request.getParameter("aceptar")!=null){
if (control.getGrabar()){%>
<jsp:forward page="grabado.html"></jsp:forward>
<%
}else{
out.write("<font>Error al grabar los datos</font");
}
}
 %>
</form>
</div>

</body>
</body>
</html>

Validador.java
package beans;

import java.io.Serializable;


/**
 * @author Andres Carmona gil
 * Clase que encapsula las validaciones de los datos del formulario
 * a la cual se le pasa los datos a traves de la clase Control
 *
 */
@SuppressWarnings("serial")
public class Validador implements Serializable {


/**
* Clase control que recibe los datos del formulario
*/
private Control control=null;

public Validador(){

}


/**
* Retorna la clase control
* @return the control
*/
public Control getControl() {
return control;
}


/**
* Le pasamos la clase control
* @param control the control to set
*/
public void setControl(Control control) {
this.control = control;
}


/**
* Devuelve un String con el error si no es valido el login:
* esta vacio el campo o si el login existe ya en la base de datos
* @return String error
*/
public String getValidarLogin(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getUsuario().getLogin()==null){
error="<-- Usuario requerido no puede estar vacio) ";
}else{
if (control.getExisteLogin()){
error="<--Nombre de usuario ya existe";
}
}
}

return error;
}
/**
* Devuelve un String con el error si no es valida la clave segun patron
* o el campo esta vacio
* @return String error
*/
public String getValidarClave(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getUsuario().getClave()==null ||
!control.validar(control.getUsuario().getClave(), "patronClave")){
error="<-- Clave requerida(8-15 caracteres al menos un digito y una mayuscula)";
}
}

return error;

}

/**
* Devuelve un String con el error si no es valida la email segun patron
* o el campo esta vacio
* @return String error
*/
public String getValidarEmail(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getUsuario().getEmail()==null ||
!control.validar(control.getUsuario().getEmail(), "patronEmail")){
error="<-- Email requerido o mal escrito(nombre@compañia.com)";
}
}
return error;
}

/**
* Devuelve un String con el error si el nombre del cliente esta vacio
* @return String error
*/
public String getValidarNombre(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getCliente().getNombre()==null){
error="<-- Nombre requerido no puede estar vacio";
}
}
return error;
}
/**
* Devuelve un String con el error si el apellidos del cliente esta vacio
* @return String error
*/
public String getValidarApellidos(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getCliente().getApellidos()==null){
error="<-- Apellidos requerido no puede estar vacio";
}
}
return error;
}

/**
* Devuelve un String con el error si el direccion del cliente esta vacio
* @return String error
*/
public String getValidarDireccion(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getCliente().getDireccion()==null){
error="<-- Direccion requerida no puede estar vacio";
}
}
return error;
}

/**
* Devuelve un String con el error si el nombre del objetivo esta vacio
* @return String error
*/
public String getValidarObjetivo(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getProducto().getObjetivo()==null){
error="<--Nombre objetivo requerido no puede estar vacio";
}
}
return error;
}

/**
* Devuelve un String con el error si la fecha de compra del objetivo no es valida
* segun patron (dd/mm/yyyy) y no es posterior a hoy
* @return String error
*/
public String getValidarFecha(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (!control.validar(control.getProducto().getFecha(),"patronFecha")){
error="<-- Fecha requerida  o no valida(dd/mm/aaaa)";
}else{
if (control.getFecha()){
error="<-- la fecha tiene que ser anterior a la de hoy";
}
}
}
return error;
}

/**
* Devuelve un String con el error si el nombre de la tienda esta vacia
* @return String error
*/
public String getValidarTienda(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getProducto().getTienda()==null){
error="<--Nombre tienda requerido no puede estar vacio";
}
}
return error;
}
/**
* Devuelve un String con el error si el numero de serie no es un numero con el patron numero
* @return String error
*/
public String getValidarNserie(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getProducto().getNserie()==null ||
control.validar(control.getProducto().getNserie(), "patronNumero")){
error="<-- Numero de serie no puede estar vacio o no es valido";
}
}
return error;
}


}
Control.java

package beans;

import java.io.Serializable;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import pojo.*;

/**
 * @author Andres Carmona Gil
 */
@SuppressWarnings("serial")
public class Control implements Serializable {
/**
* Usuario del sistema
*/
private Usuario usuario;
/**
* Datos del cliente del objetivo
*/
private Cliente cliente;
/**
* Datos del producto 
*/
private Producto producto;
/**
*  Boton submit del formulario
*/
private String aceptar=null;
/**
* Devuelve el estado del boton aceptar
* @return the aceptar
*/
public String getAceptar() {
return aceptar;
}
/**
* HasMap<nombrepatron,expresion regular> para darle los patrones de las expresiones regulares 
* para validar email,fecha, numeros, etc...
*/
private HashMap <String,String >patrones;



/**
* @param aceptar the aceptar to set
*/
public void setAceptar(String aceptar) {
this.aceptar = aceptar;
}



/**
* Devuelve los datos de usuario
* @return the usuario
*/
public Usuario getUsuario() {
return usuario;
}



/**
* Le damos los datos de usuario
* @param usuario the usuario to set
*/
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}



/**
* Devuelve los datos del cliente 
* @return the cliente
*/
public Cliente getCliente() {
return cliente;
}



/**
* Le pasamos los datos del cliente
* @param cliente the cliente to set
*/
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}



/**
* Devuelve los datos del producto
* @return the producto
*/
public Producto getProducto() {
return producto;
}



/**
* Le damos los datos del producto
* @param producto the producto to set
*/
public void setProducto(Producto producto) {
this.producto = producto;
}
/**
* Contructor para pasarle las expresiones regulares con la que trabajara
* la clase patron del tipo HashMap.
*/
public Control(){
patrones=new HashMap<String, String>();
this.patrones.put("patronLogin", "[A-Za-z0-9]{8,15}");
this.patrones.put("patronClave","(?=^.{8,16}$)((?=.*\\d)|(?=.*\\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$");
this.patrones.put("patronEmail","^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})$");
this.patrones.put("patronFecha", " /^((([0][1-9]|[12][\\d])|[3][01])[-\\/]([0][13578]|[1][02])[-\\/][1-9]\\d\\d\\d)|((([0][1-9]|[12][\\d])|[3][0])[-\\/]([0][13456789]|[1][012])[-\\/][1-9]\\d\\d\\d)|(([0][1-9]|[12][\\d])[-\\/][0][2][-\\/][1-9]\\d([02468][048]|[13579][26]))|(([0][1-9]|[12][0-8])[-\\/][0][2][-\\/][1-9]\\d\\d\\d)$/");
this.patrones.put("patronNumero","[0-9]+");
}

/**
* Para validar un String a partir de un patron de las expresiones regulares devuelve true si 
* la cadena coincide con la expresion
* @param cadena
* @param patron
* @return boolean
*/
public boolean validar(String cadena,String patron){
if (cadena!=null){
Pattern pattern = Pattern.compile(this.patrones.get(patron)); 
Matcher matcher = pattern.matcher(cadena);
return matcher.matches();
}else{
return false;
}
}
/**
* Devuelve true si el login existe den la base de datos
* @return booelean
*/
public boolean getExisteLogin(){
String sql="select * from usuario where login='"+usuario.getLogin()+"'";
boolean ok=false ;
try {
Statement st=getConexion().createStatement();
ResultSet rs=st.executeQuery(sql);
if (rs.next()){
ok=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ok;
}
/**
* Devuelve una conexion a una base de datos
* @return connection
*/
private  Connection getConexion(){ 
Connection db = null;
try {
Class.forName("com.mysql.jdbc.Driver");
db = DriverManager.getConnection(
                 "jdbc:mysql://localhost:3306/postventa","alumno","alumno");
}
catch (Exception e) {
   // For now, just report the error to the system log
System.out.println(e.toString());
}
return db;
}

public String getPatron(String patron){
return this.patrones.get(patron);
}
/**
* Retorna true si la fecha es correcta al patron fecha y es anterior
* a la fecha actual
* @return boolean
*/
public boolean getFecha(){
String fechax=this.producto.getFecha();
java.util.Date ahora=new java.util.Date();
SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
boolean ok=false;
        try {
java.util.Date fecha = formatoFecha.parse(fechax);
if (fecha.after(ahora)){
ok=true;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        
return ok;
}
/**
* Devuelve true si todos los datos son correctos y los que correspondas coinciden a un patron
* y son grabados en la base de datos
* @return boolean
*/
public boolean getGrabar(){
if (usuario.getLogin()!=null &&
!this.getExisteLogin() &&
validar(usuario.getClave(),"patronClave") &&
validar(usuario.getEmail(),"patronEmail") &&
cliente.getNombre()!=null &&
cliente.getApellidos()!=null &&
cliente.getDireccion()!=null &&
validar(producto.getFecha(), "patronFecha") &&
producto.getObjetivo()!=null &&
producto.getTienda()!=null &&
validar(producto.getNserie(),"patronNumero")){
String fechax=producto.getFecha();
try {  
//formato fecha dd/mm/yyyy
SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
//para pasar el String a Date
           java.util.Date fecha = formatoFecha.parse(fechax);
           //Para poder pasar de de util.Date a sql.Date para su posterior grabado en el PrepareStatement
           java.sql.Date sqlDate= new java.sql.Date(fecha.getTime());
String sql="INSERT INTO `usuario` (`login`, `clave`, `email`) VALUES (?,?,?)";
PreparedStatement ps=getConexion().prepareStatement(sql);                
ps.setString(1,usuario.getLogin() );
ps.setString(2,usuario.getClave() );
ps.setString(3,usuario.getEmail() );
               ps.executeUpdate();
               sql="INSERT INTO `cliente` (`nombre`, `apellidos`, `direccion`,`usuario_login`) VALUES (?,?,?,?)";
ps=getConexion().prepareStatement(sql);                
ps.setString(1,cliente.getNombre() );
ps.setString(2,cliente.getApellidos() );
ps.setString(3,cliente.getDireccion() );
ps.setString(4,usuario.getLogin() );
               ps.executeUpdate();
               sql="INSERT INTO `producto` (`objetivo`, `fecha`, `tienda`,`nserie`, `usuario_login`) VALUES (?,?,?,?,?)";
ps=getConexion().prepareStatement(sql);                
ps.setString(1,producto.getObjetivo());
ps.setDate(2,sqlDate);
ps.setString(3,producto.getTienda());
ps.setInt(4,Integer.parseInt(producto.getNserie()));
ps.setString(5,usuario.getLogin() );
               ps.executeUpdate();
               ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}else{
return false;
}
}
}
















No hay comentarios:

Publicar un comentario