ADOO - CASO ILUSTRATIVO

ANÁLISIS Y DISEÑO ORIENTADO A OBJETOS - CASO ILUSTRATIVO
En este artículo voy a resolver un caso donde explicare como aplicar el análisis orientado a objetos y la programación orientada a servicios.
PROYECTO PROPUESTO
La empresa STORE FOR MODELS necesita una aplicación para calcular el precio de venta de un producto, teniendo en cuenta el precio de costo, los gastos administrativos y la ganancia que se espera obtener.
Cuando la empresa compra un producto, lo que realiza es comprar un lote, y el precio que tiene es el precio del lote. Se estima que en un lote el 10% de productos se encuentre defectuoso, por lo tanto, solo el 90% podrá ser comercializado.
ANÁLISIS DEL REQUERIMIENTO
Julio Contreras, que se desempeña como analista funcional en la empresa, ha realizado el siguiente análisis de lo que debe ser el INPUT y OUTPUT del requerimiento. El análisis se ilustra con un ejemplo.
Los datos correspondientes al INPUT serían:
  • Nombre del producto: Pantalón de verano para damas
  • Tamaño del lote: 1000 Unidades
  • Precio del lote (Soles): 50,000.00
  • Porcentaje de gastos administrativos (%): 25
  • Porcentaje de ganancia por unidad (%): 200
Con estos datos se obtiene el siguiente OUTPUT:
  • Unidades a comercializar: 900
  • Gastos administrativos (Soles): 12,500.00
  • Costo total del lote (Soles): 62,500.00
  • Costo por unidad (Soles): 69.44 Soles
  • Ganancia por unidad (Soles): 138.88 Soles
  • Precio de Venta (Soles): 208.32 Soles
ARQUITECTURA DE LA APLICACIÓN
La arquitectura para desarrollar la aplicación será un desarrollo en capas:
Capa Service: Donde se tendrá el o los servicios necesarios para solucionar el requerimiento.
Capa View: La capa view es la interfaz de la aplicación con el usuario, sirve para mostrar datos al usuario y para solicitar datos al usuario.
Capa Controller: Esta capa es la responsable de gestionar las peticiones del usuario. Responde enviando a la vista los datos solicitados.
ANÁLISIS Y DISEÑO DEL SERVICIO
La mejor alternativa es encapsular los datos del INPUT y OUTPUT en un objeto, de esta manera se desarrolla un solo servicio para procesar todos los datos y obtener los resultados esperados.
A la clase que encapsule todos los datos le llamaremos LoteModel.
A continuación se tiene el diseño del servicio:
DIAGRAMA DE SECUENCIA
A continuación tienes en diagrama de secuencia del proceso normal:
CODIGO FUENTE - EUREKA-CS-ORACLE-JDBC
En esta sección te presento un video de una aplicación CLIENTE-SERVIDOR desarrollada con Java y Oracle.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
ANÁLISIS DE LA CLASE MODEL
Se trata de una clase que encapsula los datos del INPUT y el OUTPUT.
A continuación se tiene el script de esta clase:
package pe.egcc.preciodeventa.model;

public class LoteModel {

  //  INPUT
  private String producto;
  private Integer tamanio;
  private Double precio;
  private Double porcGasAdm;
  private Double porcGanancia;

  // OUTPUT
  private Integer unidades;
  private Double gasAdm;
  private Double cosLote;
  private Double cosUni;
  private Double ganUni;
  private double preVenta;

  public LoteModel() {
  }

  public LoteModel(String producto, Integer tamanio, 
  Double precio, Double porcGasAdm, Double porcGanancia) {
    this.producto = producto;
    this.tamanio = tamanio;
    this.precio = precio;
    this.porcGasAdm = porcGasAdm;
    this.porcGanancia = porcGanancia;
  }

  public String getProducto() {
    return producto;
  }

  public void setProducto(String producto) {
    this.producto = producto;
  }

  public Integer getTamanio() {
    return tamanio;
  }

  public void setTamanio(Integer tamanio) {
    this.tamanio = tamanio;
  }

  public Double getPrecio() {
    return precio;
  }

  public void setPrecio(Double precio) {
    this.precio = precio;
  }

  public Double getPorcGasAdm() {
    return porcGasAdm;
  }

  public void setPorcGasAdm(Double porcGasAdm) {
    this.porcGasAdm = porcGasAdm;
  }

  public Double getPorcGanancia() {
    return porcGanancia;
  }

  public void setPorcGanancia(Double porcGanancia) {
    this.porcGanancia = porcGanancia;
  }

  public Integer getUnidades() {
    return unidades;
  }

  public void setUnidades(Integer unidades) {
    this.unidades = unidades;
  }

  public Double getGasAdm() {
    return gasAdm;
  }

  public void setGasAdm(Double gasAdm) {
    this.gasAdm = gasAdm;
  }

  public Double getCosLote() {
    return cosLote;
  }

  public void setCosLote(Double cosLote) {
    this.cosLote = cosLote;
  }

  public Double getCosUni() {
    return cosUni;
  }

  public void setCosUni(Double cosUni) {
    this.cosUni = cosUni;
  }

  public Double getGanUni() {
    return ganUni;
  }

  public void setGanUni(Double ganUni) {
    this.ganUni = ganUni;
  }

  public double getPreVenta() {
    return preVenta;
  }

  public void setPreVenta(double preVenta) {
    this.preVenta = preVenta;
  }

}
CAPA SERVICE
A continuación tienes la implementación de clase correspondiente a la capa de servicio:
package pe.egcc.preciodeventa.service;

import pe.egcc.preciodeventa.model.LoteModel;

public class LoteService {

  public LoteModel procesarLote(LoteModel bean) {
    // Variables
    Integer unidades;
    Double gasAdm, costoLote, cosUni, ganUni, preVenta;
    // Proceso
    unidades = (int) Math.round(bean.getTamanio() * 0.90) ;
    gasAdm = bean.getPrecio() * ( bean.getPorcGasAdm() / 100 );
    costoLote = bean.getPrecio() + gasAdm;
    cosUni = costoLote / unidades;
    ganUni = cosUni * (bean.getPorcGanancia() / 100.0);
    preVenta = cosUni + ganUni;
    // Preparar salida
    bean.setUnidades(unidades);
    bean.setGasAdm(dosDec(gasAdm));
    bean.setCosLote(dosDec(costoLote));
    bean.setCosUni(dosDec(cosUni));
    bean.setGanUni(dosDec(ganUni));
    bean.setPreVenta(dosDec(preVenta));
    // Retorno
    return bean;
  }
  
  private double dosDec(double valor){
    valor = Math.round( valor * 100.0 );
    valor = valor / 100.0;
    return valor;
  }
  
}
PRUEBA DEL SERVICIO
Es muy importante probar el servicio, de esta manera podemos hacer las correcciones si encontramos algún error.
La clase de prueba que he elaborado es la siguiente:
package pe.egcc.preciodeventa.prueba;

import pe.egcc.preciodeventa.model.LoteModel;
import pe.egcc.preciodeventa.service.LoteService;

public class Prueba01 {

  public static void main(String[] args) {
    
    // datos
    String producto = "Pantalón de verano para damas";
    int tamanio = 1000;
    double precio = 50000.0;
    double porcGasAdm = 25.0;
    double porcGanancia = 200.0;
    LoteModel bean = new LoteModel(producto, tamanio, precio, porcGasAdm, porcGanancia);
    
    // Proceso
    LoteService service = new LoteService();
    bean = service.procesarLote(bean);
    
    // Reporte
    System.out.println("Unidades a comercializar: " + bean.getUnidades());
    System.out.println("Gastos administrativos: " + bean.getGasAdm());
    System.out.println("Costo del lote: " + bean.getCosLote());
    System.out.println("Costo por unidad: " + bean.getCosUni());
    System.out.println("Ganancia por unidad: " + bean.getGanUni());
    System.out.println("Precio de venta: " + bean.getPreVenta());
    
  }

}
El resultado es el siguiente:
run-single:
Unidades a comercializar: 900
Gastos administrativos: 12500.0
Costo del lote: 62500.0
Costo por unidad: 69.44
Ganancia por unidad: 138.89
Precio de venta: 208.33
CAPA CONTROLLER
A continuación tienes el script de la clase controladora:
package pe.egcc.preciodeventa.controller;

import pe.egcc.preciodeventa.model.LoteModel;
import pe.egcc.preciodeventa.service.LoteService;

public class LoteController {

  public LoteModel procesarLote(LoteModel bean) {
    LoteService service = new LoteService();
    return service.procesarLote(bean);
  }
  
}
CAPA VIEW
A continuación tienes el formulario que se ha implementado:
Para programar el formulario ha sido necesario la implementación de dos métodos que sirven de soporte para su funcionamiento:
private void activarControles(boolean estado) {
  // Botones
  btnProcesar.setEnabled(estado);
  btnLimpiar.setEnabled(!estado);
  // Cuadros de texto
  txtPorcGana.setEnabled(estado);
  txtPorcGasAdm.setEnabled(estado);
  txtPrecio.setEnabled(estado);
  txtProducto.setEnabled(estado);
  txtTamanio.setEnabled(estado);
}

private void limpiarForm() {
  txtCosLote.setText("");
  txtCosUni.setText("");
  txtPorcGana.setText("");
  txtPorcGasAdm.setText("");
  txtPrecio.setText("");
  txtPreVenta.setText("");
  txtProducto.setText("");
  txtTamanio.setText("");
  txtUnidades.setText("");
  txtGanUni.setText("");
  txtGasAdm.setText("");
  txtProducto.requestFocus();
}
Programación del botón Procesar:
// datos
String producto = txtProducto.getText();
int tamanio = Integer.parseInt(txtTamanio.getText());
double precio = Double.parseDouble(txtPrecio.getText());
double porcGasAdm = Double.parseDouble(txtPorcGasAdm.getText());
double porcGanancia = Double.parseDouble(txtPorcGana.getText());
LoteModel bean = new LoteModel(producto, tamanio, precio, porcGasAdm, porcGanancia);
// Proceso
LoteController control = new LoteController();
bean = control.procesarLote(bean);
// Reporte
txtUnidades.setText("" + bean.getUnidades());
txtGasAdm.setText("" + bean.getGasAdm());
txtCosLote.setText("" + bean.getCosLote());
txtCosUni.setText("" + bean.getCosUni());
txtGanUni.setText("" + bean.getGanUni());
txtPreVenta.setText("" + bean.getPreVenta());
activarControles(false);
Programación del botón Limpiar:
activarControles(true);
limpiarForm();
Finalmente, espero que este ejemplo te sea útil para entender la programación en capas y programación orientada a servicios.
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
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.



SPRING FRAMEWORK - CONFIGURACION

SPRING FRAMEWORK - CONFIGURACIÓN
CONTEXTO
El framework más utilizados en el desarrollo web con Java EE es sin duda Spring Framework, en este articulo te presento la configuración de los tres principales archivos:
  • Descriptor de Despliegue: web.xml
  • Dispatcher Servlet: dispatcher-servlet.xml
  • Application Context: applicationContext.xml
El ejemplo está desarrollado con la base de datos EUREKABANK que normalmente utilizo en mis cursos.
DESCRIPTOR DE DESPLIEGUE: web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>
      30
    </session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.htm</welcome-file>
  </welcome-file-list>
</web-app>
DISPATCHER SERVLET: dispatcher-servlet.xml
<?xml version='1.0' encoding='UTF-8' ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd">

  <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/view/"
        p:suffix=".jsp" />

  <context:annotation-config />
 
  <context:component-scan base-package="pe.egcc.eureka.controller" />
 
</beans>
APPLICATION CONTEXT: applicationContext.xml
<?xml version='1.0' encoding='UTF-8' ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

  <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://localhost:3306/eurekabank"
        p:username="eureka"
        p:password="admin" />
 
  <bean id="jdbcTemplate"  
        class="org.springframework.jdbc.core.JdbcTemplate" >
        <property name="dataSource" ref="dataSource"/>
  </bean>
 
  <context:annotation-config />
  <context:component-scan base-package="pe.egcc.eureka.service"/>

  <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>

  <tx:annotation-driven transaction-manager="transactionManager" />

</beans>
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
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.



JAVA FUNDAMENTOS 00 - SERVICIOS

JAVA FUNDAMENTOS 00 - PROGRAMACIÓN CON ENFOQUE DE SERVICIOS - GUSTAVO CORONEL
CONTEXTO
Pienso que la forma de cómo se debe enseñar a programar debe ser diferente, y mi propuesta es que el futuro programador piense en servicios desde el primer ejemplo que analice y luego implemente.
En esta presentación, revisaremos la metodología que estoy aplicando para enseñar a programar, lo interesante es que estoy obteniendo excelentes resultados.
El código que se genera es fácil de probar, modificar y sobre todo escalable, ya que la lógica desarrollada esta pensada en servicios.
DOCUMENTO
CURSO PROFESIONAL DE JAVA ORIENTADO A OBJETOS
En esta sección te presento el curso virtual de JAVA ORIENTADO A OBJETOS.


SEPARATA DE JAVA CLIENTE SERVIDOR

JAVA CLIENTE SERVIDOR - JDBC
PRESENTACIÓN

Pretender hacer la programación una actividad muy rentable, implica elegir bien el lenguaje, pienso que Java es una excelente elección.

Java lo utilizan las empresas mas grandes del mundo para desarrollar el core de sus negocios, por ejemplo, las empresas de telecomunicación, los bancos, empresas industriales, etc.

En este manual encontrarás información importante para poder programar bases de datos con JDBC. Este es el material que utilizo en el curso que imparto en SistemasUNI.

MANUAL
CÓDIGO FUENTE

En esta sección te presento un video de una aplicación CLIENTE-SERVIDOR.

Tú tienes acceso al código fuente de esta aplicación, después del video esta el enlace.




WEB SERVICE REST PARTE 1

WEB SERVICE REST PARTE 1
ENLACES SUGERIDOS
PRESENTACIÓN
En este video tutorial te explico como implementar servicios web de tipo REST.
Los requerimientos que se implementan tienen que ver con consultas a una base de datos y la ejecución de un proceso, la base de datos que se utiliza es EUREKABANK.
VIDEO TUTORIAL
A continuación tienes el video tutorial:
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.



WEB SERVICE SOAP EJEMPLO 2

WEB SERVICE SOAP EJEMPLO 2
PARTE 1: REQUERIMIENTO
En esta oportunidad te presento un ejemplo del desarrollo de un Web Service con acceso a base de datos MySQL..
En este video te explico el requerimiento a implementar.
PARTE 2: CREACIÓN DEL PROYECTO
En esta segunda parte se crea el proyecto web y la conexión con la base de datos, se utiliza MySQL.
CODIGO FUENTE
En esta sección te presento un video de una aplicación CLIENTE-SERVIDOR desarrollada con Java y Oracle.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
PARTE 3: CONSULTA DE MOVIMIENTOS
En este video se desarrolla el servicio para consultar los movimientos de una cuenta.
PARTE 4: REGISTRAR DEPOSITO
En este video se desarrolla el servicio para registrar nuevos depósitos en una cuenta.
CODIGO FUENTE
En esta sección te presento un video de una aplicación web desarrollada con Java y Oracle.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
PARTE 5: WEB SERVICE
En este video se ilustra la creación del Web Service con dos operaciones, una para consultar los movimientos y otra para registrar nuevos depósitos.
PARTE 6: SOAPUI Y WEB SERVICE CLIENT
En este video se prueba el Web Service con la herramienta SOAPUI.
También se crea un proyecto cliente y se crea el Web Service Client para consumir el Web Service.
PARTE 7: INTERFACES CLIENTE
En este video se crean las interfaces de usuario para consumir el Web Service.
Se crean dos formularios, uno para consultar los movimientos de una cuenta y otro para registrar nuevos depósitos.
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.



WEB SERVICE SOAP EJEMPLO 1

WEB SERVICE SOAP EJEMPLO 1
PARTE 1: REQUERIMIENTO
En esta oportunidad desarrolló un ejemplo sencillo de como crear un Web Service SOAP con NetBeans.
En este video te explico el requerimiento a implementar.
PARTE 2: SERVICIO
En este video implemento y pruebo el servicio en un componente de servicios.
CODIGO FUENTE
En esta sección te presento un video de una aplicación CLIENTE-SERVIDOR desarrollada con Java y Oracle.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
PARTE 3: IMPLEMENTACIÓN DEL WEB SERVICE
En este video te explico como crear el Web Service.
PARTE 4: PRUEBA DEL WEB SERVICE
En este video te explico cómo probar el Servicio Web utilizando SOAPUI.
CODIGO FUENTE
En esta sección te presento un video de una aplicación web desarrollada con Java y Oracle.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.
PARTE 5: WEB SERVICE CLIENT
En este video te explico el proceso para crear un cliente del Web Service, y se realiza la prueba respectiva.
PARTE 6: APLICACIÓN CLIENTE
En este video te explico el proceso para completar la aplicación cliente.
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.