CODIGO FUENTE
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
En esta oportunidad estoy liberando dos libros de Oracle
Para este ejercicio se creará una aplicación de tipo Cliente/Servidor cuya interfaz se ilustra a continuación:
Para grabar una imagen en una base de datos MySQL debemos utilizar el tipo de dato BLOB, para este caso utilizaremos la tabla PRODUCTO cuya estructura se muestra a continuación:
La clase entity para la tabla PRODUCTO quedaría implementada de la siguiente manera:
Para la columna de tipo blob se crea un campo de tipo ARRAY de BYTES.
El método que corresponde a la capa de persistencia que crea un nuevo producto en la base de datos se implementa de la siguiente manera:
package dao.componentes;
import dao.database.AccesoDB;
import dao.entity.Producto;
import dao.interfaces.IProductoDAO;
import excepcion.TiendaException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class ProductoDAO implements IProductoDAO {
public void crear(Producto prod) throws TiendaException {
Connection cn = null;
PreparedStatement pstm = null;
try {
cn = AccesoDB.getConnection();
cn.setAutoCommit(false);
String query = "insert into producto(AUT_ID,CAT_ID,EDI_ID,PRO_NOMBRE," +
"PRO_DESCRIPCION,PRO_STOCK,PRO_PRECIO,PRO_FOTO) " +
"values(?,?,?,?,?,?,?,?)";
pstm = cn.prepareStatement(query);
pstm.setInt(1, prod.getAutor());
pstm.setInt(2, prod.getCategoria());
pstm.setInt(3, prod.getEditorial());
pstm.setString(4, prod.getNombre());
pstm.setString(5, prod.getDescripcion());
pstm.setInt(6, prod.getStock());
pstm.setDouble(7, prod.getPrecio());
pstm.setBytes(8, prod.getFoto());
pstm.executeUpdate();
cn.commit();
} catch (Exception e) {
try {
cn.rollback();
} catch (Exception e1) {
}
throw new TiendaException(e.getMessage());
} finally {
try {
pstm.close();
} catch (Exception e) {
}
}
}
. . .
. . .
}
Para acceder a la capa DAO se utiliza una capa model implementada de la siguiente manera:
package model;
import dao.componentes.ProductoDAO;
import dao.entity.Producto;
import excepcion.TiendaException;
import java.util.List;
public class CatalogoModel {
public void crearProducto( Producto prod) throws TiendaException{
new ProductoDAO().crear(prod);
}
. . .
. . .
}
Primero se debe seleccionar el archivo para lo cual se ha implementado el botón Buscar [...], el script es el siguiente:
private void btnBuscarFotoActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser openFile = new JFileChooser();
int returnValue = openFile.showOpenDialog(this);
if (returnValue == JFileChooser.CANCEL_OPTION) {
return;
}
File archivo = openFile.getSelectedFile();
this.txtFoto.setText(archivo.getAbsolutePath());
ImageIcon tmp = new ImageIcon(archivo.getAbsolutePath());
ImageIcon imagen = new ImageIcon(tmp.getImage().getScaledInstance(
this.lblFoto.getWidth(),
this.lblFoto.getHeight(),
Image.SCALE_DEFAULT));
this.lblFoto.setIcon(imagen);
}
Y para grabar el registro en la base de datos se ha implementado el botón Grabar, el script es el siguiente:
private void btnGrabarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Producto prod = new Producto();
prod.setAutor(listaAutores.get(cboAutor.getSelectedIndex()).getId());
prod.setCategoria(listaCategorias.get(cboCategoria.getSelectedIndex()).getId());
prod.setEditorial(listaEditoriales.get(cboEditorial.getSelectedIndex()).getId());
prod.setNombre(txtNombre.getText());
prod.setDescripcion(txtDescripcion.getText());
prod.setStock(Integer.parseInt(txtStock.getText()));
prod.setPrecio(Double.parseDouble(txtPrecio.getText()));
// Obtener la imagen
File archivo = new File(this.txtFoto.getText());
byte[] imgFoto = new byte[(int) archivo.length()];
InputStream input = new FileInputStream(archivo);
input.read(imgFoto);
prod.setFoto(imgFoto);
model.crearProducto(prod);
utilitarios.Util.showMessage("Producto creado en la base de datos satisfactoriamente.");
limpiarFormulario();
} catch (Exception e) {
utilitarios.Util.showError("ERROR: " + e.getMessage());
}
}
Para obtener la aplicación ejemplo utilice el siguiente enlace:
Descargar Código Fuente de la AplicaciónEl patrón MVC divide una aplicación Web en tres capas:
Vista: Se encarga de generar el HTML que se envía al browser.
Controlador: Recibe y procesa los requerimiento del usuario y comunica los resultados a la vista para que los envíe al browser.
Modelo: Implementa la lógica del negocio.
La siguiente figura muestra un diagrama de bloques del funcionamiento de este patrón.
Para este ejemplo estoy utilizando NetBeans 6.8.
El objetivo de este ejemplo es implementar una aplicación que permita realizar una suma o una multiplicación.
La estructura de la solución es la siguiente:
La clase Session se utiliza para manejar datos de sesión:
La clase Matematica implementa la lógica, en este caso las dos operaciones: sumar y multiplicar.
En el programa tenemos un control de tipo SELECT, al que se le ha dado el nombre ACTION, este este control que comunica al controlador el método a ejecutar.
La clase Controller recibe los datos del formulario, entre ellos el método a ejecutar, hace uso del Model para resolver el problema y se comunica con el View para que genere el HTML que irá al browser.
El script de la clase controller es el siguiente:
Como podemos apreciar, la programación del controlador es bastante sencillo, el campo action podría ser un campo oculto en un formulario, incluso su valor puede ser manipulado con JavaScript y también se puede manejar con AJAX.
class Demo{ private static $instancia = null; public static function getInstancia(){ if( self::$instancia == null ){ self::$instancia = new Demo(); } return self::$instancia; } private function __construct() { } . . . . . . }Una segunda implementación considera la instanciación de la clase en la misma instrucción donde se declara la variable $instancia, tal como ilustra a continuación:
class Demo{ private static $instancia = new Demo(); public static function getInstancia(){ return self::$instancia; } private function __construct() { } . . . . . . }El acceso a la instancia se realiza de la siguiente manera:
$demo = Demo::getInstancia();
public class Demo{ private static Demo instancia = null; public static Demo getInstancia(){ if( instancia == null ){ instancia = new Demo(); } return instancia; } private Demo() { } . . . . . . }Una segunda implementación considera la instanciación de la clase en la misma instrucción donde se declara la variable instancia, tal como ilustra a continuación:
public class Demo{
private static Demo instancia = new Demo();
public static Demo getInstancia(){
return instancia;
}
private Demo() {
}
. . . . . .
}
El acceso a la instancia se realiza de la siguiente manera: Demo demo = Demo.getInstancia();
Comentarios