Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PDF M10 Java PDF
PDF M10 Java PDF
Desarrollando
Arquitecturas para
Aplicaciones
Empresariales Java
Profesional en
Plataforma
JAVA
Contenido
Introducción y Objetivos ........................................................................................................ 5
Unidad 1. Introducción a los Conceptos Fundamentales de Arquitectura ...................................... 6
Introducción: ¿Que es una arquitectura? ............................................................................................................... 6
Evolución de histórica de las arquitecturas de software ........................................................................................ 7
3
La función del Arquitecto de Software ................................................................................................................. 11
¿Qué relación hay entre Arquitectura y Diseño de aplicaciones? ........................................................................ 12
Recursos de arquitectura y diseño de aplicaciones: ............................................................................................. 13
Métodos de desarrollo ......................................................................................................................................... 14
Definición de Arquitectura en RUP ....................................................................................................................... 16
Unidad 2. Conociendo las Cualidades Sistemáticas................................................................... 20
Cualidades Sistémicas........................................................................................................................................... 21
Restricciones y suposiciones ................................................................................................................................ 24
Desarrollo guiado por las Cualidades Sistémicas .................................................................................................. 24
Unidad 3. Heurística de Desarrollo Arquitectónico y Directrices .................................................. 26
Análisis de la heurística de desarrollo de la arquitectura: .................................................................................... 27
Redes de comunicaciones .................................................................................................................................... 28
Uso de transacciones............................................................................................................................................ 30
Revisión de arquitectura basada en servicios ....................................................................................................... 30
Riesgos ................................................................................................................................................................. 32
Planificando la Capacidad del sistema .................................................................................................................. 34
Unidad 4. Arquitectura de la capa de cliente ........................................................................... 39
Clientes Web ........................................................................................................................................................ 39
Applets ................................................................................................................................................................. 39
Aplicaciones cliente .............................................................................................................................................. 40
Clientes Web ........................................................................................................................................................ 40
Applet ................................................................................................................................................................... 42
Aplicaciones cliente .............................................................................................................................................. 44
Laboratorio: Ejemplo página JSP como capa cliente ............................................................................................ 47
Unidad 5. Arquitectura de la capa web ................................................................................... 49
Arquitectura web de 3 capas ................................................................................................................................ 49
Arquitectura web de 4 capas ................................................................................................................................ 49
Tecnologías web ................................................................................................................................................... 50
MVC ...................................................................................................................................................................... 51
Tipos de beans ...................................................................................................................................................... 55
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Laboratorio: Arquitectura Capa Web con MVC .................................................................................................... 57
Unidad 6. Arquitectura de la Capa de Negocio ......................................................................... 60
Diseño Procedimental .......................................................................................................................................... 60
Ciclo de Vida de los Beans de Session .................................................................................................................. 61
Diseño Orientado a Objetos ................................................................................................................................. 62
4
Laboratorio: POJO con Hibernate ......................................................................................................................... 70
Unidad 7. Arquitectura de Integración de Capas ...................................................................... 77
Modelo Vista Controlador .................................................................................................................................... 78
Struts con Java ...................................................................................................................................................... 81
Capas de arquitectura JEE .................................................................................................................................... 82
Componentes EJB ................................................................................................................................................. 82
Tipos de beans ...................................................................................................................................................... 84
Anotaciones de un bean ....................................................................................................................................... 85
Role de EJB dentro de las aplicaciones JEE ........................................................................................................... 87
Estructura de EJB .................................................................................................................................................. 88
Custom Tags ......................................................................................................................................................... 92
Laboratorio: Custom Tags Departamentos ........................................................................................................... 98
Unidad 8. Arquitectura de seguridad ..................................................................................... 105
Seguridad criptográfica ...................................................................................................................................... 105
Algoritmo criptográfico ...................................................................................................................................... 106
Algoritmos de cifrado simétrico ......................................................................................................................... 106
Algoritmos de clave pública o asimétricos ......................................................................................................... 107
Tipos de algoritmos de cifrado simétrico ........................................................................................................... 112
Tipos de algoritmos de cifrado asimétrico.......................................................................................................... 114
Certificados digitales .......................................................................................................................................... 115
Arquitectura de seguridad por componentes .................................................................................................... 117
Implementación de la seguridad servidor y EJB ................................................................................................. 118
Seguridad de aplicaciones web en servlets y jsp ................................................................................................ 121
Laboratorio: Uso de Criptografía ........................................................................................................................ 124
Unidad 9. Arquitectura de software ....................................................................................... 131
Modelos de arquitectura .................................................................................................................................... 131
Lenguajes de descripción arquitectónica ........................................................................................................... 134
Frameworks y Vistas ........................................................................................................................................... 134
Lenguajes de patrones ....................................................................................................................................... 137
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Introducción y Objetivos
Introducción y Objetivos
Este módulo proporcionará los conocimientos suficientes al estudiante, los cuales permitirán que
pueda utilizar la plataforma Java EE(TM) en la creación de aplicaciones corporativas adaptables a
cambios y con posibilidades de crecimiento.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 1. Introducción a los Conceptos
Fundamentales de Arquitectura
Objetivo
6
Conocer los conceptos más básicos involucrados en el diseño y desarrollo de arquitecturas para
software así como su evolución y aplicación en el lenguaje Java.
Otra manera de definir la arquitectura del software podría ser aquella estructura de estructuras de
un sistema, la cual abarca componentes de software, propiedades externas visibles de estos
componentes y sus relaciones.
El objetivo de esta definición es que la arquitectura de software debe abstraer alguna información
del sistema y aún proveer suficiente información para ser la base del análisis, toma de decisiones y
lograr la reducción de riesgos. Ahora bien, una arquitectura no contiene detalles de implementación.
Se corresponde con la estructura de los componentes más significativos de un sistema interactuando
a través de interfaces con otros componentes conformados por componentes sucesivamente
pequeños e interfaces.
A la hora de plasmar en la práctica una arquitectura, debemos poner en marcha una secuencia de
actividades que conllevan la producción de diferentes artefactos arquitectónicos. En concreto dos
fundamentales:
Descripción de arquitectura
Prototipo arquitectónico
¿Por qué es importante definir una arquitectura? Básicamente, porque las arquitecturas de los
sistemas, existen con independencia de que hayan sido definidas formalmente o no. Es decir, que
aunque los profesionales que hayan llevado a cabo un desarrollo de software no hayan dedicado
ningún segundo de su tiempo a reflexionar sobre la arquitectura de su proyecto, dicha arquitectura
estará allí.
Por otro lado, otra razón que justifica la necesidad de definir una arquitectura es que los dos
factores primarios en la ingeniería de software que han incrementado la importancia de la
arquitectura son la escala de nuestros programas y su distribución final. Ambos factores van ligados
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
a la complejidad del proyecto y a los riesgos del mismo. Por consiguiente, al aumentar la
escalabilidad y la distribución de nuestros productos, automáticamente estamos incrementando su
complejidad y los riesgos que debe afrontar.
Este tipo de aplicaciones corresponderían a los desarrollos más primitivos y estarían caracterizadas
por:
Interfaces gráficas de usuario (GUI).
Servicios de presentación, negocios y persistencia en la misma máquina.
No hay concurrencia de usuarios.
Alto acoplamiento entre tiers o capas.
b) Arquitectura Cliente-Servidor:
Este tipo de arquitecturas supone un paso notable en el desarrollo de aplicaciones. Así, las características
más importantes ligadas a este modelo serían las siguientes:
Clientes pesados, no estándar
Conexiones dedicadas a BD
Protocolos pesados
Ejecución remota de SQLs
Alta administración
Bajo rendimiento
Alto tráfico de red
Baja accesibilidad
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
8
Supone, como el propio nombre indica, una evolución mejorada de la arquitectura anterior. Los
rasgos fundamentales que la definen son:
d) Aplicaciones 3 niveles:
Las aplicaciones en tres niveles supusieron uno de los avances con más éxito dentro del desarrollo
de software, en gran medida ligado al mayor empleo de los lenguajes orientados a objetos. Las
características de esta arquitectura serían:
Reutilización de lógica de negocio para diferentes clientes o sistemas.
Mejora la escalabilidad.
Mejora la flexibilidad.
Independencia de la base de datos.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
9
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
10
Un aspecto muy extendido de esta situación son los denominados procesos fragmentatos. Es decir,
aplicaciones publicadas en diferentes departamentos y unidades de negocios.
Entonces surge el problema. ¿Cómo podemos integrar dichos procesos y datos de una empresa con
una relación costo/beneficio adecuada? Y lo que es más importante ¿Cómo puede ayudar la
arquitectura de software a cumplir con dicho cometido? La respuesta la encontramos en la
denominada Arquitectura Orientada a Servicios (SOA) que es la manera actual más extendida e
implantada de diseñar aplicaciones empresariales.
Una visión idealizada de esta Arquitectura Orientada a Servicios (SOA) englobaría los siguientes
requisitos arquitectónicos a afrontar e integrar:
Heterogeneidad
Escalabilidad
Disponibilidad
Distribución
Manejabilidad de Procesos
Administración y monitoreo de procesos, servicios e infraestructura
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
11
A la hora de cumplir con su papel, el arquitecto debe estar al tanto de las diferentes tecnologías
disponibles en el Mercado y proceder a su evaluación. Con tal experiencia, el arquitecto obtendrá
una serie de beneficios a la hora de aplicarla a sus proyectos:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
¿Qué relación hay entre Arquitectura y Diseño de
aplicaciones?
¿Existe alguna diferencia entre arquitectura y diseño de software? En principio dentro del lenguaje
profesial parece ambos, dos conceptos muy semejantes e incluso intercambiables dentro del
lenguaje común y corriente de un equipo de trabajo. Sin embargo, la arquitectura y el diseño 12
difieren en tres áreas:
Arquitectura Diseño
Nivel de Abstracción Alto nivel Bajo nivel. Enfoque específico en
detalles
Entregables Planear subsistemas, interfaces con Diseño detallado componentes,
sistemas externos, servicios horizontales, Especificaciones de codificación
frameworks, componentes reutilizables,
prototipo arquitectónico
Las decisiones de arquitectura son las decisiones más fundamentales, por lo tanto, cambiarlas
ocasiona efectos significativos.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Recursos de arquitectura y diseño de aplicaciones:
En la puesta en marcha de una arquitectura y diseño de aplicaciones debemos tener presente al
menos tres recursos útiles:
– La generación de unos artefactos vinculados a la arquitectura
– El empleo de Patrones
– El empleo de un Framework
13
a) Artefactos de Arquitectura:
Adicionalmente se producen:
Matriz Tecnológica de Layers y Tiers
Plantilla de Arquitectura
Los patrones de diseño son una herramienta muy relevante para un arquitecto de software. Un
Patrón describe una solución probada a un problema recurrente de diseño, el cual ocurre en un
contexto determinado. Existen patrones de arquitectura, de análisis y de diseño.
De hecho, la definición de una arquitectura requiere de un proceso basado en el raciocinio sobre
patrones. Un arquitecto reutiliza patrones para definir la estructura y el comportamiento interno y
externo de un sistema. Ahora bien, utilizar patrones de diseño es diferente a diseñar patrones. El
arquitecto se debe familiarizar con la mayor cantidad de patrones posibles:
Dedicar tiempo a los catálogos de patrones.
Conocer los patrones que están disponibles.
Adquirir experiencia en el uso de los patrones.
Conocer como tipificar los problemas que resuelven los patrones.
Un arquitecto experimentado reutiliza:
Arquitecturas de sistemas exitosos.
Diseños que han funcionado correctamente en el pasado.
Frameworks conceptuales y tecnológicos.
Componentes y librerías.
c) Framework
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
1. Tecnológicos:
a. Struts y Java Server Faces (JSF) para Interfaces Web.
b. Log4J para auditoría técnica o negocios en app.
c. Toplink, Hybernate, ROME para mapeos objeto-relacionales.
d. Enterprise Java Beans para construcción de servicios de negocios.
e. Framework de patrones de diseño para J2EE de Sun Microsystems.
f. Grinder como framework para testing de performance. 14
2. Conceptuales:
a. El Cubo para definición de arquitecturas.
b. eTom para empresas de telecomunicaciones.
c. RUP como metodología para definición de procesos de desarrollo.
Métodos de desarrollo
¿Cuáles son los principios fundamentales en los métodos de desarrollo de software modernos?
Podemos enumerarlos rápidamente del siguiente modo:
Desarrollo iterativo e incremental.
Conducido por las calidades sistémicas.
Centrado en la arquitectura.
Dirigido por los casos de uso.
Basada en Modelos.
Mejores prácticas de diseño.
Los modelos son mecanismos primarios de comunicación entre todos los participantes de un
proyecto de software. Reflejan un aspecto particular de un sistema y abstraen detalles no
relevantes.
Tipos:
Documentos de texto
Diagramas UML
Prototipos
Objetivos:
Comunicación
Resolver Problemas
Pruebas de Concepto
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
15
Uno de los aspectos más llamativos entre estos modelos, son las diferencias producidas entre el
modelo de desarrollo tradicional y el denominado iterativo. Mientras que en el primero a medida que
pasa el tiempo, los costes de producción se incrementan indefinidamente. En el modelo interactivo
los costes son más fáciles de preveer porque finalizan con el lanzamiento de cada nueva versión del
producto.
Podemos comparar el costo de hacer correcciones en un desarrollo tradicional, con el costo de hacer
correcciones en un desarrollo iterativo en las siguientes gráficas:
Como vemos, está muy bien justificado el optar por un desarrollo iterativo frente al tradicional. Pues
bien, a la hora de poner en marcha dicho desarrollo, el arquitecto de software actual tiene en su
mano dos modelos:
Desarrollo Centrado en la Arquitectura 4 + 1 View Model Framework de definición de
arquitectura del RUP
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Desarrollo mediante SunTones AM, el cual agrega dos características importantes a RUP:
o Un enfoque en las calidades sistémicas
o El uso de patrones basados en el razonamiento
La combinación de ambos modelos configura un Framework con forma de Cubo que tiene los
siguientes elementos:
16
Adaptar el proceso: El proceso deberá adaptarse a las necesidades del cliente ya que es muy
importante interactuar con él. Las características propias del proyecto u organización. El tamaño del
mismo, así como su tipo o las regulaciones que lo condicionen, influirán en su diseño específico.
También se deberá tener en cuenta el alcance del proyecto en un área subformal.
Equilibrar prioridades: Los requisitos de los diversos participantes pueden ser diferentes,
contradictorios o disputarse recursos limitados. Debe encontrarse un equilibrio que satisfaga los
deseos de todos. Gracias a este equilibrio se podrán corregir desacuerdos que surjan en el futuro.
Demostrar valor iterativamente: Los proyectos se entregan, aunque sea de un modo interno, en
etapas iteradas. En cada iteración se analiza la opinión de los inversores, la estabilidad y calidad del
producto, y se refina la dirección del proyecto así como también los riesgos involucrados
Colaboración entre equipos: El desarrollo de software no lo hace una única persona sino múltiples
equipos. Debe haber una comunicación fluida para coordinar requisitos, desarrollo, evaluaciones,
planes, resultados, etc.
Elevar el nivel de abstracción: Este principio dominante motiva el uso de conceptos reutilizables
tales como patrón del software, lenguajes 4GL o marcos de referencia (frameworks) por nombrar
algunos. Esto evita que los arquitectos de software vayan directamente de los requisitos a la
codificación de software a la medida del cliente, sin saber con certeza qué codificar para satisfacer
de la mejor manera los requisitos y sin comenzar desde un principio pensando en la reutilización del
código. Un alto nivel de abstracción también permite discusiones sobre diversos niveles y soluciones
arquitectónicas. Éstas se pueden acompañar por las representaciones visuales de la arquitectura,
por ejemplo con el lenguaje UML.
Centrarse en la calidad: El control de calidad no debe realizarse al final de cada iteración, sino en
todos los aspectos de la producción. El aseguramiento de la calidad forma parte del proceso de
desarrollo y no de un grupo independiente.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
17
Fase de Inicio
Durante la fase de inicio se establecen:
– Requerimientos no-funcionales.
– Arquitectura inicial, la cual se considera viable para el proyecto.
– Lista de Riesgos y Restricciones.
– Entregables:
– Documento de Visión
– Arquitectura Inicial
– Plan de la siguiente fase
Fase de Elaboración
Durante esta fase se crean:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
– Arquitectura línea base.
– 80% de los requerimientos del sistema.
– Plan de iteraciones para la fase de construcción.
La metodología RUP es más apropiada para proyectos grandes, dado que requiere un equipo de
trabajo capaz de administrar un proceso complejo en varias etapas. En proyectos pequeños, es
posible que no se puedan cubrir los costos de dedicación del equipo de profesionales necesarios.
SunTone AM
SunTone AM es una metodología de desarrollo de software análoga al Unified Process (UP), con un
fuerte énfasis en las calidades sistémicas y patrones de diseño.
Tiene un framework conceptual, el cubo, el cual provee una vista tridimensional de:
– Capas lógicos
– Layers o niveles tecnológicos
– Calidades sistémicas
Con el cubo se puede definir la matriz tecnológica de Layers y Tiers, la cual documenta las
decisiones tecnológicas para soportar la arquitectura de un sistema.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Profundizaresmo en algunos elementos de este cubo en las unidades siguientes.
19
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 2. Conociendo las Cualidades
Sistemáticas
Objetivo
20
Profundizar en los conceptos más básicos involucrados en el diseño y desarrollo de arquitecturas
para software bajo el lenguaje Java.
Introducción
El Arquitecto al igual que el Analista de Sistemas debe realizar actividades de Análisis, Diseño y
Construcción con la diferencia que su objetivo son los Requerimientos No Funcionales del Sistema.
Es decir, todo aquello que determina como debe funcionar el sistema.
El Arquitecto obtiene los requerimientos iniciales, las restricciones, los supuestos, identifica riesgos,
analiza la información y formula una o varias propuestas de solución tomando en cuenta todo lo
anterior. Dentro de la solución no elige un framework porque es el favorito del Arquitecto, no elige el
lenguaje de desarrollo porque quiere aprenderlo o porque es el de moda, los elementos que
conforman la solución deben ser elegidos de forma adecuada para que, en conjunto, cumplan con
los requerimientos no funcionales y las restricciones de tiempo, costo y recursos.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
la empresa: Documento de Arquitectura (Vision Consulting), Service Level Agreement (SLA),
TCH100 (GNP) etc.
Para ello, las siguientes resultan ser algunas de las actividades que debe realizar el Arquitecto para
poder proponer una solución de Arquitectura.
Cualidades Sistémicas
Las cualidades o calidades sistémicas están definidas por Sun Microsystems de la siguiente manera:
Son propiedades que establecen la calidad de servicio (QoS) que un sistema expone.
Son globales a toda la arquitectura e influencian el diseño.
Son no-funcionales pero observables.
No se pueden satisfacer completamente por un componente.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Disponibilidad (Availability). Cantidad de tiempo en línea en el que el sistema puede procesar
solicitudes. Este es asunto más complejo puesto que determina el porcentaje de tiempo que un
sistema puede usar para procesar dichas solicitudes.
Usabilidad (Usability). El grado de facilidad o dificultad en el manejo del sistema.
22
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
cualidades sistémicas para poder decidir de entre varias opciones de solución más adecuada y que
no comprometa el cumplimiento de una o varias cualidades.
Las cualidades sistémicas deben quedar identificadas y listarse en nuestro proyecto como el
siguiente:
23
Calidad del Prioridad Descripción del Propuesta para cubrir el
servicio (QoS) Requerimiento requerimiento
Disponibilidad Alta El sistema no debe quedar Opción 1: Se propone escalar el
fuera de línea en las horas sistema con XX Memoria RAM y
pico o dentro de la ventana mover las aplicaciones existentes a
de servicio. otro servidor con menos recursos
El ejemplo anterior que simula una situación de desarrollo de una aplicación fictícea se
complementaría con tablas de pruebas similares a la que vemos a continuación y cuyo vínculo a la
tabla anterior debe quedar registrado también a modo de llamada entre tablas. En nuestro caso se
emplea la expresión “Ver tabla anexa”.
Otras facetas funcionales del desarrollo también deberán contemplarse y documentarse mediante la
enumeración y resolución de diferentes características operacionales. Veamos otra tabla de registro
que expresa esta labor:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Características operacionales
Característica Operaciones del Descripción
Sistema Detectadas
Transaccional *Asignación del folio Se desarrollarán los componentes de negocio con EJBs
* Consulta de reportes
* Configuración de
procesos de registro
Restricciones y suposiciones
Todo proyecto tiene restricciones, las más comunes son tiempo, recursos, presupuesto y tecnología
a utilizar. El arquitecto debe proponer alternativas de solución que se muevan dentro de estas
restricciones. En algunos casos será necesario sacrificar una buena opción porque no cumple alguna
de estas.
Es muy importante documentar las restricciones iniciales del proyecto y a lo largo del desarrollo
documentar los cambios sobre estas restricciones. Al final del proyecto es común que alguien, sin el
debido conocimiento de cómo han trascurrido los hechos, pueda preguntarse por qué se hicieron las
cosas de esta manera. La respuesta la encontrará tanto en las restricciones iniciales como en los
cambios surgidos, justificados y documentados a lo largo del proyecto.
Al inicio del proyecto no siempre tenemos toda la información necesaria para poder plantar una
propuesta, incluso el cliente puede no tenerla. Esta incertidumbre hará que dudemos en proponer
una solución porque no sabemos qué implicaciones puede tener esa ausencia de información. Pero,
por otro lado, no podemos quedarnos impasibles. Ante estos casos se deben hacer supuestos y
actuar en base a éstos. Cuando, por ejemplo, se hace una propuesta dichos supuestos se deben
notificar a todos los involucrados y subrayar que cierta solución será válida sólo bajo ciertas
consideraciones.
Ejemplo. El cliente no tiene idea de cuantos informes o reportes se tienen que generar en el
sistema.
Supuesto: Se realiza una propuesta suponiendo que solamente se requerirán 100 horas de
construcción de reportes.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
orientado al desarrollo basado en patrones y para la entrega de calidades sistémicas predecibles.
Todo ello distribuido en capas. En la ilustración siguiente podemos ver un ejemplo abstracto de
arquitectura que tiene en cuenta los patrones y las calidades sistémicas distribuidas en diferentes
capas: presentación, negocio y base de datos.
25
Si entramos más concretamente en la aplicación de dichos conceptos abstractos sobre los elementos
o productos tecnológicos que nos ofrece Java, veremos que éstos se pueden aplicar sobre una
arquitectura de software típica del modo que ilustra la siguiente tabla:
Cada elemento de Java o auxiliar opera o funciona en un determinado nivel y capa dentro de la
arquitectura de software concebida para el desarrollo con dicha tecnología y lenguaje. Es en ese
empleo concreto donde, de manera inherente, se solventan y se consiguen un mayor grado de
optimización buena parte de las calidades sistémicas del modelo de desarrollo que venimos
repasando en estas páginas.
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 3. Heurística de Desarrollo
Arquitectónico y Directrices
Objetivo
26
Conocer los factores y elementos que permiten introducir innovaciones de manera rápida en
el diseño y desarrollo de arquitecturas para software realizado bajo lenguaje Java.
Introducción
En sistemas altamente distribuidos, la capacidad de tomar las decisiones correctas acerca de dónde
los componentes están localizados y como ellos se comunican resulta mucho más crítico y dificultoso
que en los sistemas de pequeño tamaño y prestaciones limitadas.
La importancia de esta clase de decisiones crea la necesidad de la arquitectura. Entonces, la función
crítica de la arquitectura es llevar a cabo una planificación de alto nivel, de localización y de
comunicación entre los diferentes componentes del software que se esté desarrollando.
Conviene insister entonces en las diferencias entre la arquitectura y el diseño del software:
Arquitectura Diseño
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Usar documentos arquitectónicos para crear el modelo del sistema que se ocupe de la calidad del
servicio.
Documento de Visión: oportunidades de negocio.
Especificación de requerimientos: funcionales y no funcionales.
Identificación de riesgos y plan de mitigación
27
Modelo de dominio para la aplicación: estructura y relaciones.
Descripción del contexto: cómo y dónde el software y el servicio deben estar localizado.
Plan del proyecto: Definir los hitos que caracterizarán cada una de las fases de desarrollo del
proyecto.
Lista de supuestos: crecimiento de usuarios y transacciones a implementar.
Evaluar apropiadamente el uso de tecnología J2EE y asegurarse de la aprobación por parte
de los gestores del proyecto:
Los gestores del proyecto pueden tener ideas preconcebidas sobre qué tecnología debe ser
usada en el proyecto. Por ello, hay que justificar adecuadamente la decisión tecnológica
adoptada o elegida y no dejarse llevar por tendencias o gustos particulares.
Identificar y controlar los riesgos:
La primera meta de la arquitectura es asegurar la calidad del servicio, su desempeño y
fiabilidad.
Análizar los costos
Usar patrones adecuados:
Revisar catálogos de patrones
Desarrollar prototipos:
Un prototipo arquitectónico describe el sistema y permite experimentaciones mentales para
determinar si el plan está resultando satisfactorio o no.
Ahora bien, aunque todo lo anterior es lo deseable ¿Qué problemas se deben eliminar para que una
arquitectura resulte óptima?:
Flexibilidad del sistema: Es inevitable que el sistema requiera cambios en el tiempo. Si el
sistema no es flexible hacer cambios será muy costoso
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Red de comunicaciones y diseño: La red es la parte más lenta de un sistema de computación
distribuido. Por lo tanto, se ha de tener muy en cuenta cómo los elementos se comunican
unos con otros.
Modelo transaccional: Las transacciones son importantes para mantener la integridad de los
datos, pero limitan la concurrencia.
En algunos casos es conveniente eliminar el uso de transacciones o reducir el ámbito de la
aplicación, para que no se proteja completamente los datos. Pero se incluye código que 28
repare el daño en caso de producirse
Manejo de costos: Si un proyecto excede su presupuesto, difícilmente podrá continuar. Una
técnica común para reducir gastos es usar patrones y heurística. El trasfondo de esta forma
de operar es razonar pensando en que la última vez que un problema se presentó, la solución
aplicada funcionó bien, así que se repetirá el mismo procedimiento de la otra ocasión.
Dentro de dicho ámbito de abstracción se procederá también a establecer dichos límites, pero, sobre
todo, subrayando cuál será el área de superficie, sus fricciones internas y puntos de fragilidad. El
área de superficie es cada atributo de las interfaces donde los módulos se comunican entre sí. Los
cambios a los componentes de áreas de superficie grande, crea fricciones y en los sistemas más
frágiles, la fricción puede propagarse de componente a componente a través de todo el sistema.
Todas estas circunstancias deben ser contempladas durante la abstracción arquitectónica del
proyecto.
Redes de comunicaciones
El desempeño o papel de la red de comunicaciones del sistema es una de las preocupaciones
principal en la arquitectura y diseño de aplicaciones informáticas. Tres factores que determinan el
desempeño de la red son:
Ancho de banda: regula la capacidad de datos en una red de comunicaciones.
Requerimiento de latencia: el tiempo transcurrido hasta completarse la comunicación en la
red.
Frecuencia de solicitud: Uso de la capacidad del canal.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
29
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Surgen entonces dudas que hay que afrontar durante la definición arquitectónica del proyecto. Por
ejemplo, ¿qué es mejor para el sistema enviar muchas solicitudes de datos pequeñas o una solicitud
más grande? Para guiarnos en el rendimiento de la red podemos tener en cuenta algunas
consideraciones. Así, puede resultar que no sea necesario tener todos los datos de una vez.
Conviene entonces calcular todos los datos tomando su envío durante un tiempo significativo. El
proceso puede empezar solo con una parte de los datos. Luego, minimizar la frecuencia de
solicitudes, realizar un cuidadoso diseño de interfaz de Usuario que mejore la progresiva captación
de los datos para no saturar el sistema con una sola llamada y, finalmente, hacer un diseño también 30
cuidadoso de la API remota para no hacer todo en una sola llamada.
Uso de transacciones
Una transacción es una simple unidad de trabajo que está compuesta por una serie de operaciones
individuales, donde toda la serie debe suceder con éxito o fallar completamente a pesar de que
parte de los procesos secuenciados puedan realizarse efectivamente. Es decir, se trata de un
procedimiento que tiene que producirse en su totalidad o no producirse.
Cuando no son Necesarias: Hay que evitar las transacciones siempre que sea posible, porque estas
tienen un impacto negativo en el desempeño y el rendimiento de nuestras aplicaciones. Por ejemplo,
ya vimos que:
Los beans de entidad representan un objeto concreto que tiene existencia en alguna base de
datos de la empresa
Por último, un bean de sesión representa un proceso o una acción de negocio.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
31
En cuanto a los tipos de servicios que están involucrados en SOA podemos hablar de:
• Servicios Verticales:
Basados en el contenido del sistema
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Estos servicios reflejan el modelo del negocio y son específicos para un dominio en particular
Ej. El servicio de inventario
• Servicios Horizontales:
Basados en la infraestructura del sistema
Son accedidos desde muchas capas y sobre diferentes dominios.
32
Ej. El servicio de seguridad de autenticación
Riesgos
El manejo de riesgos es un tema importante en la administración de proyectos y de igual forma para
la Actividad de Arquitectura. Uno de los objetivos de la arquitectura es precisamente disminuir los
riesgos tecnológicos. La idea es identificar todas aquellas situaciones que puedan poner en riesgo el
éxito del proyecto dentro de las restricciones de tiempo y presupuesto, crear un plan de mitigación y
de contingencia en caso de que se dé el problema.
Uno de los objetivos de RUP es asegurar que las expectativas de todas las partes estén
sincronizadas y sean consistentes. Esto es asegurado a través de evaluaciones periódicas durante el
ciclo de vida del proyecto, y es documentado en el Reporte o Informe de Evaluación de Status. Este
reporte es utilizado para hacer un seguimiento de la información acerca de los recursos disponibles
(humano y financiero), de los mayores riesgos, del progreso técnico medido a través de métricas y
de los resultados de hitos principales.
La Lista de Riesgos es un artefacto de RUP que nos provee una visión de todos los riesgos conocidos
en el proyecto, y sirve como entrada para la planificación y evaluación del proyecto. Cada riesgo es
descrito en función de su impacto, y un plan de contingencia será desarrollado para mitigar el riesgo
en cuestión.
Dependiendo del sistema o modelo de desarrollo empleado, el índice de riesgos al que sometemos a
nuestro proyecto varía significativamente. Por ejemplo, hay gran diferencia entre optar por un
desarrollo en cascada que por uno iterativo como ilustra la siguiente gráfica:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
33
A la hora de controlar los riesgos, lo primero que debemos conocer es identificar las razones o
motivos por los cuales fallan usualmente los proyectos. En ese sentido cabe decir que:
La calidad de servicio (QoS = Quality Of Service) es un riesgo primario relacionado con la
arquitectura.
El manejo inadecuado de los requerimientos no funcionales, es una de las fuentes más importante
de riesgo en los proyectos:
Reglas de negocio de alta complejidad.
Calidades sistémicas
Seguridad
Rendimiento
Escalabilidad
Disponibilidad
Extensibilidad
La Lista de Riesgos será desarrollada junto con los Casos de Negocio, los cuales formarán la base
para la decisión de continuar o no con el proyecto. La Lista de Riesgos es mantenida a través de
todo el ciclo de vida del proyecto. Veamos un ejemplo fictíceo de este tipo de Lista de Riesgos,
contemplando en cada uno de dichos riesgos su descripción, probabilidad de que se produzca el
fallo, su impacto cuando ocurra y la respuesta prevista para mitigar su presencia:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Ejemplo: La especificación dice que el BAJA ALTO RESUELTO
servidor de aplicaciones que
El cliente adquirirá el cliente cumple con Se realizaron
propone el uso le especificación XXX y el pruebas de
de un framework necesita de esa operaciones
framework web especificación para poder complejas
open source funcionar. Hay una probabilidad con el
que no ha sido de que el framework no framework 34
probado en el funcione correctamente usando la
servidor final misma
versión y
sistema
operativo del
servidor de
aplicaciones.
Ejemplo: Se está solicitando el tener MEDIO ALTO Se deben
tiempos de respuesta de hacer
Tiempos de máximo 5 segundos para pruebas de
respuesta arriba operaciones de consulta en desempeño
del valor horario pico Es un criterio en el servidor
requerido de de pruebas
Dada la configuración de aceptación usando los
topología red donde se tiene … para la mismos
… liberación elementos de
hardware e
identificar
posibles
cuellos de
botella fuera
de la
aplicación
Esta tabla es un ejemplo y nos ayuda a identificar y prepararnos para saber qué debe hacerse en
caso de que se presente un problema previamente identificado.
Dicha lista de riesgos debe actualizarse y mantenerse durante todo el desarrollo del proyecto.
Esta recolección de cifras ayudará a determinar qué tipo y cantidad de hardware es necesaria para
soportar las operaciones del sistema en un horizonte de tiempo dado. Para documentar dichas cifras
podemos realizar diferentes pruebas de esfuerzo y registrarlas en tablas similares a las que vemos a
continuación:
Numero de Accesos
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Operaciones Accesos Accesos Accesos Accesos
más concurrentes concurrentes concurrentes concurrentes
demandantes Iníciales, Horario Futuros, Horario
Pico Iníciales, Pico Futuros,
Horario No Horario No
(Operaciones / Pico (Operaciones / Pico
min) min)
(Operaciones / (Operaciones 35
min) / min)
Registro de X 750 200 825 220
Consulta de 300 50 330 55
reportes
Configuración - - 330 55
de catalogos
A 1 año A 1 año
Sobre toda la base de información anterior se realizará una propuesta de solución, indicando el tipo
de sistema a desarrollar:
Cliente / Servidor
Multicapa
Multicapa web
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
36
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
37
Capa de Cliente: Es la capa donde se ejecuta una aplicación de consola, dispositivo móvil, pc
desktop o con navegador web.
Capa de Presentación: Aquí residen los componentes dinámicos de vista y control que generan
una salida HTML, XML y los Reportes que se envían al cliente, por ejemplo JSP, Servlets.
Capa de Negocio: Aquí residen los procesos de negocio, workflow, timers.
Capa de Integración: Aquí residen los componentes que permiten la comunicación al exterior tal
como componentes de acceso a base de datos, web services, correo, colas de mensajes, clientes de
web service, conectores.
Capa de Recursos: Aquí se encuentran todas las fuentes de información externas, tales como
Bases de Datos, sistemas de Archivos, Content Managers, Mainframes.
Diagrama de Componentes
El diagrama de componentes inicial es una propuesta de qué componentes de software intervendrán
en la solución.
Diagrama de Despliegue
El Diagrama de Despliegue inicial nos ayuda a saber con qué otros sistemas interactuarán y
convivirá el nuestro dentro.
Prototipo
Provee una demostración o implementación de principio a fin de los componentes tecnológicos
primarios, demuestra la viabilidad de la solución y sirve como guía para el desarrollo del sistema.
Estos prototipos pueden ser implementaciones base o presentaciones en PowerPoint dependiendo
del nivel de cliente para el cual se desea hacer una prueba.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Usabilidad
La usabilidad toma en cuenta el tipo de personas que serán usuarios del sistema para
proporcionarles una interfaz de usuario que permita hacer productivo su trabajo y por ninguna
circunstancia dañe su información. En este sentido es necesario al inicio del proyecto hacer pruebas
de usabilidad ya sea con un demo o una presentación que muestre la forma en la que se
interactuará con el sistema.
Principios de Diseño a seguir:
Visibilidad: Claridad en la información a presentar. 38
El realizar esta exploración de los elementos de interfaz de usuario requeridos ayudará a elegir la
tecnología de la capa de presentación que debe usarse desde el inicio del proyecto. No es lo mismo
utilizar simples JSPs que utilizar AJAX, esta diferencia implica requerimientos del servidor de
aplicaciones, de recursos humanos y de costos.
Conclusión
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las actividades
que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 4. Arquitectura de la capa de cliente
Introducción
Un cliente Java EE puede ser un cliente Web o una aplicación cliente.
39
Objetivos
Describir la arquitectura de la capa cliente.
Entender los distintos tipos de clientes que existen en Java EE.
Clientes Web
Un cliente web consiste en dos partes:
Una página web dinámica que contiene varios tipos de lenguajes de marcas (HTML, XML y
demás), que son generados por componentes web ejecutándose en la capa web
Un navegador web que despliega las páginas recibidas del servidor.
Un cliente web, llamado a veces terminal (thin client, cliente ligero, NetPC). Los terminales
usualmente no consultan bases de datos, ejecutan reglas de negocio complejas o conectan a
aplicaciones legadas. Cuando se utiliza un terminal, estas operaciones pesadas son delegadas a los
beans empresariales que se ejecutan en el servidor Java EE que pueden soportar la seguridad,
velocidad, servicios y ofrecer el nivel de confianza de la tecnología Java EE del lado del servidor.
Applets
Una página web recibida de una capa web puede incluir un Applet incrustado. Un Applet es una
pequeña aplicación cliente escrita en el lenguaje de programación Java que se ejecuta en la máquina
virtual de Java en el navegador web. Sin embargo, los sistemas clientes pueden necesitar la
necesidad de un plug-in y posiblemente un fichero con políticas de seguridad para que el Applet se
ejecute con éxito en el navegador web.
Los componentes son la API preferida para crear un programa para cliente web ya que no se
necesitan plug-ins o políticas de seguridad en los sistemas clientes. Los componentes web además
tienen un diseño más limpio y más modular porque estos proporcionan una forma de separa la
programación de la aplicación del diseño de la página web. El personal involucrado en el diseño de la
página no necesita entender la sintaxis del lenguaje de programación Java para hacer su trabajo.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Aplicaciones cliente
Una aplicación cliente se ejecuta en una máquina cliente y proporciona a los usuarios una forma de
manejar las tareas que requieren una interfase de usuario rica que puede ser proporcionada por un
lenguaje de formato. Normalmente este tiene una interfase gráfica de usuario (GUI) creada con la
API de Swing o AWT, aunque una interfase de línea de comandos ciertamente es posible.
Las aplicaciones cliente acceden directamente a beans empresariales que se ejecutan en la capa de
40
negocio. Sin embargo, si los requerimientos de una aplicación lo exigen, un cliente de aplicación
puede abrir una conexión HTTP para establecer una comunicación con un Servlet que se ejecuta en
la capa web. Los clientes de aplicación escritos en lenguajes diferentes a Java pueden interactuar
con servidores Java EE 5, habilitando la plataforma Java EE 5 a interactuar con sistemas legados,
clientes y lenguajes que no son Java.
Clientes Web
Servlets
Un servlet es una clase java usada para extender las capacidades de los servidores que albergan
aplicaciones accedidas mediante un modelo de programación cliente-servidor.
Los servlets (al igual que los applet) se ejecutan en una caja restringida (sandbox) lo que protege al
servidor de cualquier mal funcionamiento del servlet. Esto permite a los proveedores de Internet
que sus clientes depositen servlets sin temor de que sean maliciosos. Se incrementa la seguridad
respecto a cualquier otra tecnología notablemente.
Al estar escritos en Java, tienen todas las ventajas de este lenguaje (pueden hacer uso de cualquier
paquete de Java). Como es un lenguaje altamente escalable surgirán paquetes de una forma muy
rápida.
Los servlets son portables entre plataformas ("escribir una vez, ejecutar en cualquier lugar"). Los
servidores Web más populares, dicen soportar los servlets.
Los servlets son componentes de la parte del servidor de Java EE, encargados de generar
respuestas a las peticiones recibidas de los clientes.
En la mayoría de las páginas Web se van a introducir los llamados formularios, los cuales sirven para
recoger datos aportados por los clientes. Estos formularios van a ser una mezcla de código HTML y
de Scripts Son programas que se ejecutan en el servidor y su función fundamental es la de
recoger los datos que el cliente ha introducido a través de un formulario y, en base a ellos,
construir una página dinámicamente para responder a la petición.
Estas páginas se llaman dinámicas porque no van a existir en el disco duro del servidor sino que se
van a generar como respuesta a una petición hecha desde el cliente a través de un formulario.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
La seguridad aumenta mucho debido a que los programas van a correr bajo el control directo
del administrador del servidor.
Los Scripts más extendidos son los denominados CGI (Common Gateway Interface). Estos CGI
tienen una gran desventaja: son poco eficientes debido a que el servidor ejecuta una copia de los
mismos por cada petición que le llega.
Así, si el sitio Web es bastante popular, supone una pérdida considerable de rendimiento. Para 41
solventar este problema, los fabricantes han desarrollado alternativas: Microsoft ISAPI; NetScape
NSAPI; JavaSoft Servlets.
Las JavaServer Pages (JSP) permiten separar la parte dinámica de tus páginas de la parte HTML
estática. Para ello, basta con:
Escribir la parte estática HTML de la manera habitual.
Encerrar el código Java que genera la parte dinámica de la página entre unos delimitadores
especiales, la mayoría de los cuales empiezan por y terminan con .
Si quieres tener en la salida estática HTML el conjunto de caracteres debes poner o
bien usar <%.
En esta imagen podemos apreciar las directivas que utilizaremos en aplicaciones JSP:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
42
Una página JSP cuando se ejecuta el servidor de base de datos genera un servlet. El ejemplo anterior generará
un servlet como el de la imagen siguiente:
El motor de las páginas JSP está basado en los servlets de Java -programas en Java destinados a ejecutarse en
el servidor-, aunque el número de desarrolladores que pueden afrontar la programación de JSP es mucho mayor,
dado que resulta mucho más sencillo aprender que los servlets.
En JSP creamos páginas de manera parecida a como se crean en ASP o PHP -otras dos tecnologías de servidor-.
Generamos archivos con extensión .jsp que incluyen, dentro de la estructura de etiquetas HTML, las sentencias
Java a ejecutar en el servidor. Antes de que sean funcionales los archivos, el motor JSP lleva a cabo una fase de
traducción de esa página en un servlet, implementado en un archivo class (Byte codes de Java). Esta fase de
traducción se lleva a cabo habitualmente cuando se recibe la primera solicitud de la página .jsp, aunque existe la
opción de precompilar en código para evitar ese tiempo de espera la primera vez que un cliente solicita la página.
Applet
La definición más extendida de applet es "una pequeña aplicación accesible en un servidor de
Internet, que se transporta por la red, se instala automáticamente y se ejecuta in situ como parte
de un documento web".
Un Applet es un pequeño programa que no puede correr por sí mismo, sino que tiene que estar
incluido en alguna aplicación que le dé soporte. Por ejemplo, un navegador o un visualizador de
applets.
La clase Applet (aquella es la que podemos encontrar las funcionalidades de los applet) hereda
directamente de Panel. Por tanto, su contenedor por defecto es un Panel y podemos usar todos los
métodos de dicha clase y de sus superclases (Container, Component, Object).
Cualquier Applet que diseñemos debe heredar de la clase Applet. Su código básico asociado es el
siguiente:
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public void init(){
// Este método se llama automáticamente cuando se carga el Applet en el sistema.
// Lo llama el navegador o el visor de applets.
// Sólo se llama una vez con lo cual se usará para inicializar al Applet.
//¿Cuándo se inicia un applet? Cuando se carga la página desde la cual se le
//hace referencia.
// En este método se suele:
Fijar el tamaño del applet. 43
Cargar imágenes y sonidos.
Asignar valores a las variables globales que se usen.
}
public void start(){
//Llamado por el navegador o visor de applets cuando se desea comenzar la ejecución del mismo.
//Se llama la primera vez que se carga, tras el init y posteriormente cuando
//el applet necesita ser arrancado de nuevo. Normalmente se arranca el
//applet cada vez que se expone a la vista.
}
public void stop(){
// Lo llama el visor del applet o el navegador cuando el applet para su ejecución.
//¿Cuándo el applet para su ejecución? Normalmente cuando desaparece del
//campo de visión.
}
No es obligatorio escribir los métodos init(), start(), stop() y destroy() porque la clase Applet realiza
una implementación por defecto para todos ellos. La implementación por defecto no hace nada, por
tanto, los deberemos sobreescribir cuando lo necesitemos.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Métodos de la clase Applet.
AppletContext getAppletContext()
Obtiene el contexto del Applet. Ver la clase AppletContext para saber los
métodos que podemos usar sobre un objeto de este tipo.
String getAppletInfo()
Devuelve información acerca del applet.
44
AudioClip getAudioClip(URL url) Devuelve el objeto de tipo AudioClip especificado en la URL.
Posteriormente se puede reproducir con los métodos play() o loop().
AudioClip getAudioClip(URL url, String name) Devuelve el objeto AudioClip que resulta de la
composición de la URL y del string especificados.
URL getCodeBase() Obtiene el campo codebase del applet. Este campo es uno de los
atributos que se usan en la llamada a un applet desde una página HTML. El
codebase lo obtiene en forma de objeto URL.
URL getDocumentBase() Obtiene la base del documento desde el que se llama al
applet, en formato URL.
Image getImage(URL url)
Devuelve un objeto imagen que puede ser pintado sobre la pantalla.
Image getImage(URL url, String name)
Otra forma de obtener una imagen.
String getParameter(String name)
Obtiene el valor del parámetro especificado. Estos parámetros se le pasan al
applet desde la página HTML mediante el tag
String[][] getParameterInfo()
Devuelve información sobre los parámetros que se le han pasado al applet.
boolean isActive()
Determina si el applet está activo.
static newAudioClip(URL url)
AudioClip Devuelve un nuevo audioclip desde la URL especificada.
void play(URL url)
Reproduce el audioclip especificado en la URL.
void play(URL url, String name)
Otra forma de reproducir un audioclip.
void print (Graphics g)
Imprime en impresora el contenido del applet.
void resize(Dimension d)
Petición de que el applet sea redimensionado. Ver la clase Dimension.
void resize(int width, int height)
Otra forma de pedir que el applet sea redimensionado.
void showStatus(String msg)
Muestra el string en la ventana de estado del navegador.
Aplicaciones cliente
Las aplicaciones cliente suele ser una interfase gráfica de usuario (GUI) creada con la API de Swing
o AWT, y pudiera ser una aplicación que se ejecute desde la línea de comandos.
La base de la programación gráfica se encuentra en estos dos elementos físicos del ordenador, los
cuales se diseñaron de forma conjunta con el propósito de presentar información al usuario. El
comprender su funcionamiento ayuda a conocer lo que estamos haciendo cuando diseñamos un
entorno gráfico.
En una estructura AWT hay que destacar varios elementos dentro del sistema gráfico de Java.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Elemento Descripción
Gestores de trazado Modos predefinidos de colocación de los componentes y/o contenedores.
(Layout) El AWT dispone de los siguientes modos:
- FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout,
AbsoluteLayout.
Contenedores Objetos capaces de contener componentes básicos. El AWT dispone de los
siguientes contenedores:
- Window, Frame, Panel, Dialog. 45
Componentes Controles básicos que dan funcionalidad al interfaz gráfico. El AWT
dispone de:
- Label, Button, TextField, TextArea, Checkbox, Choice, List, Scrollbar,
Panel, Canvas, MenuBar y PopupMenu.
Eventos Acciones que se pueden realizar sobre los componentes o los
contenedores y que pueden ser recogidos por las aplicaciones.
Swing hay que verlo como una extensión de AWT, por tanto, no hay que olvidar lo aprendido en
AWT. Es más, en la mayoría de los casos es suficiente con añadir una "J" al componente AWT para
que se convierta en un componente Swing.
En Swing, los componentes de la interfaz gráfica son Beans. Todos los componentes son "ligeros"
(lightweight), es decir, ya no se usan componentes dependientes del sistema operativo.
Paquete javax.swing
Las clases principales de Swing se encuentran en este paquete.
Tenemos que seguir distinguiendo entre Gestores de trazado, Contenedores y Componentes.
A continuación pasamos a describir las nuevas clases agrupadas según lo que sean:
Sumario de clases del paquete javax.swing
BoxLayout Un gestor de trazado nuevo que permite a múltiples
componentes ser colocados según un eje horizontal o vertical.
JRootPane El componente fundamental en la jerarquía de contenedores.
JWindow Una representación de una ventana.
JApplet Una versión extendida de java.applet.Applet que añade nuevas
funcionalidades, por ejemplo, pueden añadirse barras de menú de
Swing.
JDialog La clase principal para crear una ventana de diálogo.
JFrame Una versión extendida de java.awt.Frame que añade funcionalidades
extras.
JPanel JPanel es un contenedor ligero genérico.
JInternalFrame Un objeto ligero que proporciona muchas de las características de
una ventana nativa, incluyendo "pinchar y arrastrar", cerrado,
iconizado, redimensionado, título y barra de menú.
JComponent La clase base para los componentes Swing.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
AbstractButton Define el comportamiento común de las clases JButton,
JToggleButton, JCheckbox y JRadioButton. Es una clase abstracta y,
por tanto, no pueden crearse objetos.
AbstractListModel La definición abstracta para el modelo de datos que proporciona una
lista con sus contenidos.
JButton Un botón Swing.
JCheckBox Un CheckBox Swing.
JRadioButton Una implementación de un botón tipo radio 46
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Ver Video: Arquitectura de la capa cliente, en la Unidad 4, en
el Módulo 10, en la plataforma elearning
Objetivo
Crear una página JSP como ejemplo de capa cliente.
Enunciado
- Realizar una página JSP que envíe información sobre si misma al pulsar sobre un botón.
- Cuando enviemos información, mostraremos en una etiqueta DIV los elementos seleccionados.
- Para completar la práctica, debemos dejar marcados los elementos que el usuario haya
seleccionado en nuestra página.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
if (vfrutas.indexOf(frutas[i])==-1)
{%>
<tr><td><input type="checkbox" name="chkfruta"
value="<%=frutas[i]%>"><%=frutas[i]%></td></tr>
<%}else{%>
<tr><td><input type="checkbox" name="chkfruta" checked
value="<%=frutas[i]%>"><%=frutas[i]%></td></tr>
<%}%> 48
<%}
}%>
<tr><td><input type="submit" name="btnenviar" value="Enviar Datos"></td></tr>
</form>
</table>
<%
if (datos!=null)
{
for (int i=0;i<datos.length;i++)
{%>
<div style="background-color:fuchsia">
Elementos seleccionados:<%=datos[i]%>
</div>
<%}
}
%>
</body>
</html>
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las actividades
que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 5. Arquitectura de la capa web
Introducción
La estrategia tradicional de utilizar aplicaciones compactas causa gran cantidad de problemas de 49
integración en sistemas software complejos como pueden ser los sistemas de gestión de una
empresa o los sistemas de información integrados consistentes en más de una aplicación. Estas
aplicaciones suelen encontrarse con importantes problemas de escalabilidad, disponibilidad,
seguridad, integración...
Para solventar estos problemas se ha generalizado la división de las aplicaciones en capas que
normalmente serán tres: una capa que servirá para guardar los datos (base de datos), una capa
para centralizar la lógica de negocio (modelo) y por último una interfaz gráfica que facilite al usuario
el uso del sistema.
Objetivos
Describir la arquitectura de la capa web.
Entender los componentes que intervienen en una arquitectura web.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Tecnologías web
En la tabla siguiente se muestran los diferentes servicios J2EE estándar y los aspectos de aplicación
correspondiente los que resuelven.
50
J2EE estándar de los servicios
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
MVC
MVC es un modelo de diseño estándar con el que están familiarizados muchos desarrolladores.
El modelo de MVC ayuda a crear aplicaciones que separan los aspectos diferentes de la aplicación
(lógica de entrada, lógica comercial y lógica de la interfaz de usuario), proporcionando un
acoplamiento entre estos elementos.
El modelo especifica dónde se debería encontrar cada tipo de lógica en la aplicación. La lógica de la
interfaz de usuario pertenece a la vista. La lógica de entrada pertenece al controlador. La lógica
comercial pertenece al modelo.
Esta separación ayuda a administrar la complejidad al compilar una aplicación, ya que permite
centrarse en cada momento en un único aspecto de la implementación.
Esta separación simplifica enormemente la escritura tanto de vistas como de componentes del
modelo: Las páginas JSP no tienen que incluir manejo de errores, mientras que los elementos del
control simplemente deciden sobre el paso siguiente a seguir.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Entre las características de Struts se pueden mencionar:
Configuración del control centralizada.
Interrelaciones entre Acciones y página u otras acciones se especifican por tablas XML en
lugar de codificarlas en los programas o páginas.
Componentes de aplicación, que son el mecanismo para compartir información
bidireccionalmente entre el usuario de la aplicación y las acciones del modelo.
52
Librerías de entidades para facilitar la mayoría de las operaciones que generalmente realizan
las páginas JSP.
Struts contiene herramientas para validación de campos de plantillas. bajo varios esquemas
que van desde validaciones locales en la página (en javaScript) hasta las validaciones de
fondo hechas a nivel de las acciones.
Struts permite que el desarrollador se concentre en el diseño de aplicaciones complejas como
una serie simple de componentes del Modelo y de la vista intercomunicados por un control
centralizado. Diseñando de esta manera se debe obtener una aplicación más consistente y
más fácil de mantener.
Componentes de la vista
La parte de la Vista de una aplicación basada en Struts generalmente está construida usando
tecnología JavaServer Pages (JSP). Las págnas JSP pueden contener texto HTML estático (o XML)
llamado "plantilla de texto", además de la habilidad de insertar contenido dinámico basado en la
interpretación (en el momento de solicitud de la página) de etiquetas de acción especiales. El
entorno JSP incluye un conjunto de etiquetas estándard, como Además, hay una
facilidad estándard para definir nuestras propias etiquetas, que están organizadas en "librerías de
etiquetas personalizadas".
Struts incluye una extensa librería de etiquetas personalizadas que facilitan la creación de interfaces
de usuario que están completamente internacionalizados, y que interactúan amigablemente con
beans ActionForm que son parte del Modelo del sistema. El uso de estas etiquetas se explica más
adelante en detalle.
Además de las páginas JSP y la acción y las etiquetas personalizadas que contienen, normalmente
los objetos de negocio necesitan poder dibujarse a sí mismos en HTML (o XML), basándose en su
estado actual en el momento de la solicitud. La salida renderizada desde dichos objetos puede
incluirse fácilmente en una página JSP resultante usando la etiqueta de acción estándar
Enterprise Java Beans (EJB) es una plataforma para construir aplicaciones de negocio portables,
reutilizables y escalables usando el lenguaje de programación Java.
Desde el punto de vista del desarrollador, un EJB es una porción de código que se ejecuta en un
contenedor EJB, que no es más que un ambiente especializado (runtime) que provee determinados
componentes de servicio.
Los EJBs pueden ser vistos como componentes, desde el punto de vista que encapsulan
comportamiento y permite reutilizar porciones de código, pero también pueden ser vistos como un
framework, ya que, desplegados en un contenedor, proveen servicios para el desarrollo de
aplicaciones empresariales, servicios que son invisibles para el programador y no ensucian la lógica
de negocio con funcionalidades trasversales al modelo de dominio.
En la especificación 3.0, los EJB no son más que POJOs (clases planas comunes y corrientes de
Java) con algunos poderes especiales implícitos, que se activan en tiempo de ejecución (runtime)
cuando son ejecutados en un contenedor de EJBs.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Componentes EJB
Con la tecnología Enterprise JavaBeans es posible desarrollar componentes (enterprise beans) que
luego podemos reutilizar y ensamblar en distintas aplicaciones que implementemos en la empresa.
Por ejemplo, podriamos desarrollar un bean Cliente que represente un cliente en una base de datos.
Dicho vean Cliente podríamos usarlo, posteriormente, en un programa de agenda o en una
aplicación de comercio electrónico o virtualmente en cualquier programa en el que se necesite
representar un cliente. 53
Con esta tecnología, podemos separar las capas, llegando incluso a ser posible que el desarrollador
del bean y el ensamblador de la aplicación no fueran la misma persona, o ni siquiera trabajaran en
la misma empresa.
Con la programación orientada a objetos podemos reutilizar clases, pero con componentes es
posible reutilizar un mayor nivel de funcionalidades e incluso es posible modificar estas
funcionalidades y adaptarlas a cada entorno de trabajo particular sin tocar el código del componente
desarrollado.
El contenedor de componentes se denomina contenedor EJB y es algo así como el sistema operativo
en el que éstos residen.
Debemos recordar que un descriptor de despliegue ofrece la información del componente a nuestro
contenedor EJB y a nuestro entorno de trabajo (bases de datos, arquitectura de la aplicación, etc.).
El despliegue se define de forma declarativa, mediante un fichero XML (descriptor del despliegue,
deployment descriptor) en el que se definen todas las características del bean o con anotaciones.
El contenedor EJB es un programa Java que trabaja en el servidor y que contiene todas las clases y
objetos necesarios para el correcto funcionamiento de los EJBs.
Pooling: El contenedor de EJBs crea para componentes EJB un pool de instancias que es
compartido por los diferentes clientes. Aunque cada cliente visualiza el entorno como si
recibiera siempre instancias diferentes de los EJB, el contenedor está constantemente
reutilizando objetos para optimizar memoria. El pooling es un servicio que se aplica a los
Stateless Session Beans y a los MDBs.
Thread-safely: El programador puede escribir componentes del lado del servidor como si
estuviera trabajando en una aplicación sencilla con un solo thread (hilo). El contenedor se
encarga de que los EJBs tengan el soporte adecuado para una aplicación multi-usuario (como
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
son en general las aplicaciones empresariales) de forma transparente, asegurando el acceso
seguro, consistente y alto rendimiento. Se aplican a los beans de sesión y a los MDBs.
Mensajería: Mediante los MDBs es posible desacoplar por completo dos componentes para
que se comuniquen de forma asincrónica, sin reparar demasiado en los mecanismos de la
JMS API que los MDBs encapsulan.
Seguridad: EJB soporta integración con la Java Authentication and Authorization Service
(JAAS) API, haciendo casi transparente el manejo transversal de la seguridad. Se aplica a
todos los Session Beans.
Acceso Remoto: Es posible acceder de forma remota a distintos EJBs de forma sencilla,
simplemente mediante la Inyección de Dependencia. El procedimiento para inyectar un
componente local o uno remoto es exactamente el mismo, abstrayéndonos de las
complicaciones específicas de RMI o similares. Este servicio aplica únicamente a los Session
Beans.
Web Services: Un Stateless Session Bean puede publicar sus métodos como servicios web
mediante una sencilla anotación.
Aquí tenemos un gráfico que mostraría la representación de EJB dentro de un módulo web.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
55
Tipos de beans
Existen tres tipos de beans definidos, cada uno implementa unas características diferentes y
permiten ser combinados entre si.
Los MDBs también procesan lógica de negocio, pero un cliente nunca invoca a un método de un MDB
directamente.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Básicamente, MOM es un software que permite funcionar como servidor de mensajería, reteniendo
los mensajes del productor y enviándolos posteriormente al consumidor en el momento en que esté
disponible para recibirlo.
Existen dos tipos BMP y CMP según se gestione la persistencia por parte del bean o del contenedor.
Los EJB de entidad están directamente relacionados con los datos de la aplicación, son objetos que
mantienen en memoria los datos que maneja la aplicación, las entidades que disponen de
persistencia.
Los Beans de Entidad normalmente mapean (mantienen una relación en memoria) las tablas de
una base de datos relacional, aunque también es posible que mantengan la persistencia de los datos
en ficheros, como por ejemplo un xml.
En cualquiera de los casos el objetivo de un Bean de Entidad es almacenar los datos en memoria
desde una fuente persistente y mantener una sincronización total entre el estado de los datos entre
la memoria y la fuente de datos.
Por esta razón se dice que los Beans de Entidad son los EJB que sobreviven a caídas del sistema, ya
que en caso de un fallo del sistema, los datos que hay en memoria estarían guardados en el
dispositivo persistente, como por ejemplo la base de datos, con lo cual, cuando se reinicie el
servidor se recuperarán sin ningún problema.
La especificación Enterprise JavaBeans está escrita para diferentes públicos, pero podría resumirse
en dos niveles diferentes:
Un programador del lado del cliente que diseña una aplicación Web o utilice un servlet para
establecer la comunicación con un EJB, necesita comprender como se accede a los EJB y como se
utilizan.
El programador cliente tiene menos preocupaciones que un desarrollador bean en cuanto al uso de
EJB.
Necesitan saber como encontrar o crear un bean, como utilizar sus métodos y cómo liberar sus
recursos.
El cliente no necesita preocuparse sobre la implementación del EJB, solamente debe tener en cuenta
las acciones o propiedades del bean para representar los elementos en las páginas.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
El desarrollador EJB
La principal responsabilidad del programador de un bean será escribir la lógica de empresa y
acciones o propiedades.
Siempre que sea posible, la especificación Enterprise JavaBeans intenta abstraer a los
programadores de un bean de cualquier tarea de nivel de sistema.
También podríamos tener clases Java adicionales que apoyen la operación del bean, clases de ayuda
que implementen la lógica de negocio.
Todos estos archivos estarían empaquetados en un JAR, ya hemos visto que es la unidad estándar
de empaquetado de clases de Java.
Podriamos tener muchos beans dentro de un único archivo JAR, pero cada archivo JAR contendría
únicamente descriptor del bean xml.
Este directorio se llama META- INF y no podemos cambiarle el nombre, sigue una especificación
estándar.
Aquí podemos visualizar la implementación del uso de un EJB dentro de un entorno de desarrollo,
independientemente que sea realizada la llamada desde un navegador o desde una aplicación Java.
Enunciado
- Abrir un proyecto Struts y añadir dos ficheros de tipo Struts Action y Struts ActionForm
Beans.
- En la página jsp insertaremos etiquetas de la librería de Struts html para enlazar la página al
modelo y al controlador.
Clase Action
Las subclases de la Clase Action se ejecutan en respuesta a una petición de un usuario.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Class Name: TiendaAction
Package: paqActions
Action Path: /Tienda
58
<action-mappings>
<action input="/TiendaForm.jsp" name="TiendaActionForm" path="/Tienda" scope="session"
type="pqActions.TiendaAction"/>
<action path="/Welcome" forward="/welcomeStruts.jsp"/>
</action-mappings>
package pqActions;
import javax.servlet.http.HttpServletRequest;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
return mapping.findForward(SUCCESS);
}
}
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las actividades
que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 6. Arquitectura de la Capa de Negocio
Introducción
En aplicaciones Java los desarrolladores web siempre han organizado la lógica de negocios a través 60
de un diseño procedimental u orientado a objetos.
Objetivos
Describir la arquitectura de la capa de negocio.
Entender la organización que se realiza en aplicaciones java haciendo uso de la capa de
negocio.
Diseño procedimental
Organiza el código en funciones y estructuras de datos simples. Las estructuras de datos,
generalmente se crean, se inicializan y se pasan como parámetros a las funciones. La relación entre
estas funciones y los datos que utilizan suelen asociarse en librerías según el criterio del
programador.
Orientado a objetos
Organiza el código en objetos que contienen ambos aspectos, datos y comportamiento. Dichos
objetos colaboran, generalmente mediante herencia o composición para resolver la lógica de la
aplicación. La relación entre los datos y las funciones que los usan está mantenida en su mayor
parte por el propio lenguaje. Generalmente el diseño orientado a objetos es más fácil de entender,
mantener, extender y probar.
A pesar de los beneficios del diseño OO, muchas aplicaciones J2EE modernas se han escrito
utilizando el estilo procedimental. Uno de los precursores principales de dicho estilo fue la
especificación EJB (anterior a 3.0).
Diseño Procedimental
Las características más importantes del diseño procedimental son las siguientes:
Implementar nuevas funcionalidades es fácil. Basta añadir código a un script transaccional
(Transaction Script, Fowler, P_EAA) o añadir un script transaccional nuevo.
No hace falta diseñar la aplicación. No se necesita determinar las clases ni sus
responsabilidades. La lógica de negocio se distribuye en los spcripts transaccionales (Session
Beans en EJB 2.0) y los datos persistentes en simples estructuras de datos (Entity Beans en
EJB 2.0).
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
61
Es más asequible para programadores con poca experiencia. Este es el principal motivo por el que
las Factorías de Software suelen decantarse principalmente por el estilo procedimental frente al OO.
El sistema funciona bien con lógicas de negocio simples pero a medida que esta se complica, los
scripts transaccionales suelen contener miles de líneas de código. Se promueve la duplicación de
código, los programadores tenderán a programar para si mismos debido a la dificultad de encontrar
los métodos disponibles para cada modelo de datos. Se pierde el principal atractivo de la omisión del
diseño. El sistema se hace demasiado difícil de entender, probar y mantener.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
62
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Actualmente se conocen con el nombre de POJO (Plain Old Java Object) para dar un nombre
atractivo al desarrollo de aplicaciones basados en objetos java regulares no vinculados a un
contenedor EJB.
Un POJO (acrónimo de Plain Old Java Object) es una sigla creada por Martin Fowler, Rebecca
Parsons y Josh MacKenzie en septiembre de 2000 y utilizada por programadores Java para enfatizar
el uso de clases simples y que no dependen de un framework en especial. Este acrónimo surge como
una reacción en el mundo Java a los frameworks cada vez más complejos, y que requieren un 63
complicado andamiaje que esconde el problema que realmente se está modelando. En particular
surge en oposición al modelo planteado por los estándares EJB anteriores al 3.0, en los que los
"Enterprise JavaBeans" debían implementar interfaces especiales.
POJO es una nueva palabra para designar algo viejo. No existe en Java una nueva tecnología con
ese nombre, sino que el nombre existe en el marco de una revalorización de la programación
"simplemente orientada a objetos". Esta revalorización tiene que ver también con el éxito de
lenguajes orientados a objetos más puros y sencillos, que empezaron a tomar parte del mercado al
que Java apunta, como Ruby y Python.
En modelos medianamente complejos, el estado de los modelos del dominio se hace persistente
mediante un framework ORM (Object/Relational Mapping) de persistencia, como JDO, Hibernate o
TopLink. La configuración de los modelos del dominio se realiza forma declarativa mediante un
contenedor IoC como Spring o PicoContainer. Por último, los servicios basados en POJOs proveen
capacidades similares a un contenedor EJB, como sguridad y transacciones declarativas, mediante el
uso de AOP.
Orientación a Objetos: Puesto que no hay limitaciones (o muy pocas, como podría ser la
especificación java beans) impuestas en los POJOs, la lógica de negocio de la aplicación puede
resolverse utilizando técnicas de diseño OO.
Esta ventaja se hace más importante según la lógica de negocio se hace más compleja.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Es posible escribir test Unitarios de forma independiente para cada modelo del dominio ya que no es
necesario desplegarlos en el contenedor. El desarrollo dirigido por test (Test Driven Development)
resulta natural en este entorno. El respaldo de los test unitarios permite que el código pueda
refactorizarse con seguridad según evoluciona la aplicación.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
65
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
66
Si marcamos la casilla Incluir tablas relacionadas algunas otras tablas se incluirán automáticamente.
4. Crea un Archivo nuevo.... Categoría Hibernate, tipo Archivos de mapas de Hibernate y POJOs de
la base de datos.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
67
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Lo guardamos en el mismo paquete:
68
Crea una nueva Clase Java (Archivo Nuevo..., Categoría Java, tipo Clase Java) y llámale
EmpleadosHelper y lo ponemos dentro del paquete ClasesHospital.
public EmpleadosHelper() {
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}
<html>
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
EmpleadosHelper helper = new EmpleadosHelper();
List filmTitles = helper.getFilmTitles(1, 10); 69
int filmTitlesSize = filmTitles.size();
out.print("<table>");
out.print("<tr><th>Title</th><th>Description</th><th> </th><th> </th></tr>");
for (int i = 0; i < filmTitlesSize; i++) {
Emp film = (Emp) filmTitles.get(i);
String filmID = film.getApellido();
out.print("<tr>");
out.print("<td class='COL1'>" + filmID +"</td>");
out.print("</tr>");
}
out.print("</table>");
%>
</body>
</html>
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
70
Enunciado:
- Realizar un ejemplo de consultas de acción con Hibernate
- Crear métodos para el alta, baja y modificación.
- Agregar la contraseña
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
- Añadir la propiedad hibernate.show_sql el valor true en configuration properties.
71
Si marcamos la casilla Incluir tablas relacionadas algunas otras tablas se incluirán automáticamente.
Nos generará el siguiente archivo:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
72
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering
DTD 3.0//EN_
" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
<schema-selection match-schema="SYSTEM"/>
<table-filter match-name="HOSPITAL"/> 73
<table-filter match-name="ENFERMO"/>
<table-filter match-name="EMP"/>
<table-filter match-name="DOCTOR"/>
<table-filter match-name="DEPT"/>
</hibernate-reverse-engineering>
4. Crea un Archivo nuevo.... Categoría Hibernate, tipo Archivos de mapas de Hibernate y POJOs de
la base de datos.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
5. Lo último sería crear un Archivo Nuevo..., Categoría Hibernate, Tipo HibernateUtil.java.
74
Crea una nueva Clase Java (Archivo Nuevo..., Categoría Java, tipo Clase Java) y llámale
EmpleadosHelper y lo pnemos dentro del paquete ClasesHospital.
package ClasesHospital;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public EmpleadosHelper() {
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public void borrar() {
Emp ee = new Emp();
short ii=7698;
ee.setEmpNo(ii);
org.hibernate.Transaction tx = session.beginTransaction();
session.delete(ee);
tx.commit(); 75
}
public void anadir() {
org.hibernate.Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(ee);
tx.commit();
ee.setApellido("ddd");
session.update(ee);
tx.commit();
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
76
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 7. Arquitectura de Integración de
Capas
77
Objetivos
Entender la arquitectura de capas en Java.
Conocer las diferentes estructuras y ventajas de los patrones de diseño y arquitectura en n capas.
Introducción
Un patrón de diseño es una abstracción de una solución en un nivel alto. Los patrones solucionan
problemas que existen en muchos niveles de abstracción. Hay patrones que abarcan las distintas
etapas del desarrollo, desde el análisis hasta el diseño y desde la arquitectura hasta la
implementación.
Algunas personas definen un patrón como una solución recurrente para un problema en un contexto.
Los patrones de diseño no están enfocados a ningún lenguaje, son arquitecturas que definen las
estructuras de soluciones.
Un contexto es el entorno, situación, o condiciones relacionadas dentro de las cuales existe algo.
Un problema es una cuestión inacabada, algo que se necesita investigar y resolver. Un problema se
puede especificar mediante un conjunto de causas y efectos. Usualmente un problema está
restringido al contexto en el que ocurre.
La solución se refiere a la respuesta al problema dentro de un contexto que ayuda a resolver las
dificultades.
Entonces, si tenemos una solución a un problema en un contexto, ¿es un patrón?. No
necesariamente. También necesitamos asociar la característica de recurrencia con la definición de un
patrón.
Los patrones deberían comunicar soluciones de diseño a los desarrolladores y arquitectos que los
leen y los utilizan. Aunque el concepto de patrón es bastante simple, definir realmente el término es
muy complejo.
Hemos señalado sólo las referencias para que puedas indagar en más profundidad en la historia de
los patrones y aprender sobre ellos en otras áreas. Sin embargo, deberías tener en mente que la
definición de patrón que hemos adoptado funciona. En nuestro catálogo, se describe un patrón de
acuerdo a sus principales características: contexto, problema y solucion, junto con otros aspectos
importantes, como causas y consecuencias. La página que describe la plantilla de patrones explica
estas características en más detalle.
A cada diseño de proyecto le sigue el problema que trata de resolver, la solución que aporta y las
posibles desventajas asociadas.
Un desarrollador debe buscar un equilibrio entre las ventajas y las desventajas a la hora de decidir
que patrón utilizar. Lo normal es, como observará a menudo en la tecnología de programación y
otros campos, es buscar la media entre flexibilidad y rendimiento.
La mayoría de las personas utiliza patrones de diseño cuando perciben un problema en su proyecto,
como por ejemplo, el rendimiento.
Un patrón de diseño es el trabajo de una persona que ya se encontró con el problema
anteriormente, intentó muchas soluciones posibles, y escogió y describió una de las mejores.
Todos los proyectos grandes utilizan los patrones de diseño para solucionar los problemas e
implementar el rendimiento de la aplicación.
Los patrones de diseño se pueden dividir en tres grandes categorías basadas en su propósito:
creacionales, estructurales y de comportamiento.
Creacionales: Los patrones creacionales tratan con las formas de crear instancias de objetos. El objetivo de
estos patrones es abstraer el proceso de instanciación y ocultar los detalles de cómo los objetos son creados o
inicializados.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Estructurales: Los patrones estructurales describen como las clases y objetos pueden ser combinados para
formar grandes estructuras y proporcionar nuevas funcionalidades. Estos objetos insertados pueden ser incluso
objetos simples u objetos compuestos.
Comportamiento: Los patrones de comportamiento ayudan a definir la comunicación y relación entre los objetos
de un sistema. El propósito de este patrón es reducir el acoplamiento entre los objetos.
Creacionales
Creacional de la Clase: Los patrones creacionales de Clases usan la herencia como un
mecanismo para lograr la instanciación de la Clase.
Creacional del objeto: Los patrones creacionales de objetos son más escalables y dinámicos
comparados de los patrones creacionales de Clases.
Estructurales
Estructural de la Clase: Los patrones estructurales de Clases usan la herencia para
proporcionar interfaces más útiles combinando la funcionalidad de múltiples Clases.
Estructural de Objetos: Los patrones estructurales de objetos crean objetos complejos
agregando objetos individuales para construir grandes estructuras. La composición del
patrón estructural del objeto puede ser cambiado en tiempo de ejecución, el cual nos da
flexibilidad adicional sobre los patrones estructurales de Clases
Comportamiento
Comportamiento de Clase: Los patrones de comportamiento de Clases usan la herencia para
distribuir el comportamiento entre Clases.
Comportamiento de Objeto: Los patrones de comportamiento de objetos nos permiten
analizar los patrones de comunicación entre objetos relacionales, como objetos incluidos en
un objeto complejo.
Con la aparición del entorno J2EE, aparecieron nuevos catálogos de patrones de diseño. J2EE es
una arquitectura por si misma que integra otras arquitecturas, incluyendo servlets, JavaServer
Pages, Enterprise JavaBeans, y más. Existen 5 capas en la arquitectura J2EE:
Cliente
Presentación
Negocios
Integración
Recurso
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
En este tipo de arquitectura conocida, el cliente hace Request a objetos de la capa de presentación
(Pagina del servidor), que luego llama a su código controlador para pedirle funcionalidad.
En el caso de un diseño de datos MVC, el Request se realiza a un objeto de tipo Controlador que
crea una presentación como Response a esa solicitud.
En los frameworks MVC, las URLs se mapean directamente a clases, estas son denominadas
"Controladoras" y son las que procesan los Request entrantes, manejando las entradas del usuario,
sus interacciones y ejecutando la lógica apropiada para el proceso.
Una clase controladora llama a una vista, la cual genera la salida HTML que se enviará como 79
Response.
Dicho modelo MVC permite diseñar en tres capas de negocio y no poner todo el código en las
interfaces de usuario de tu sistema (IU).
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
El modelo especifica dónde se debería encontrar cada tipo de lógica en la aplicación. La lógica de la
interfaz de usuario pertenece a la vista. La lógica de entrada pertenece al controlador. La lógica
comercial pertenece al modelo.
Esta separación ayuda a administrar la complejidad al compilar una aplicación, ya que permite
centrarse en cada momento en un único aspecto de la implementación. Por ejemplo, podemos
centrarnos en la vista sin estar condicionado por la lógica comercial.
El acoplamiento entre los tres componentes principales de una aplicación MVC favorece el desarrollo
paralelo. Por ejemplo, un desarrollador de software puede trabajar en la vista, un segundo 80
desarrollador puede ocuparse de la lógica del controlador y un tercero se puede centrar en la lógica
comercial del modelo.
En este gráfico podemos visualizar cómo son las características de envió de una página web con la
lógica tradicional de J2EE utilizando páginas de servidor.
El ciclo de vida de una aplicación MVC es simple. Lo primero de todo es que no realizamos en
ningún momento un postback. No existen métodos de acción para el envío de la página tal y como
los conocemos, sino que cada acción está delimitada por un controlador, que devolverá la Vista final
al usuario.
El usuario realizará una acción en la Vista, que llamará al controlador con una acción delimitada, y el
modelo se encargará de la lógica para poder realizar la acción final.
Si nos fijamos en la lógica MVC, solamente tenemos un manejador, que será el encargado de llamar
a su controlador correspondiente, según la acción del usuario.
Cada página que visualiza el usuario es independiente a la lógica de negocio, y cada una es
representada individualmente al realizar acciones sobre ella.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Con la lógica MVC, lo que hacemos es representar al usuario acciones para realizar las llamadas.
Vamos a ver un ejemplo, tenemos acciones para Details y Orders.
Cuando el usuario hace una petición sobre una de esas acciones, el manejador se encarga de enviar
dicha información al servidor, y dependiendo de la acción que envía el usuario, se llama a un
controlador que representará la vista correspondiente en Html.
En cambio, si lo hacemos con las páginas JSP, cada página es independiente entre sí y si
quisiéramos cambiar o añadir algo, habría que hacerlo página a página, mientras que con MVC,
habría que hacerlo independiente a cada controlador y vista. 81
Validaciones Complejas:
Se realiza extendiendo la clase base de struts llamada Action. A este nivel se comprueba
contra las reglas de negocio (modelo).
Por ejemplo: Se instancian objetos del modelo,se realizan consultas contra la base de datos y
se obtienen los errores, etc.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
A través de un archivo de configuración (struts-conf) se gestiona el flujo de navegación entre
páginas, que también se logra extendiendo la clase ActionForm y Action.
Componentes EJB
Con la tecnología Enterprise JavaBeans es posible desarrollar componentes (enterprise beans) que
luego podemos reutilizar y ensamblar en distintas aplicaciones que implementemos en la empresa.
Por ejemplo, podriamos desarrollar un bean Cliente que represente un cliente en una base de datos.
Dicho vean Cliente podríamos usarlo, posteriormente, en un programa de agenda o en una
aplicación de comercio electrónico o virtualmente en cualquier programa en el que se necesite
representar un cliente.
Con esta tecnología, podemos separar las capas, llegando incluso a ser posible que el desarrollador
del bean y el ensamblador de la aplicación no fueran la misma persona, o ni siquiera trabajaran en
la misma empresa.
El desarrollo basado en componentes promete un paso más en el camino de la programación
orientada a objetos.
Con la programación orientada a objetos podemos reutilizar clases, pero con componentes es
posible reutilizar un mayor nivel de funcionalidades e incluso es posible modificar estas
funcionalidades y adaptarlas a cada entorno de trabajo particular sin tocar el código del componente
desarrollado.
El contenedor de componentes se denomina contenedor EJB y es algo así como el sistema operativo
en el que éstos residen.
Cuando se utilizan componentes en un marco de trabajo, debemos prestar atención tanto al
desarrollo de los beans como a los descriptores de despliegue que comunican nuestro trabajo con el
contenedor.
Debemos recordar que un descriptor de despliegue ofrece la información del componente a nuestro
contenedor EJB y a nuestro entorno de trabajo (bases de datos, arquitectura de la aplicación, etc.).
El despliegue se define de forma declarativa, mediante un fichero XML (descriptor del despliegue,
deployment descriptor) en el que se definen todas las características del bean o con anotaciones.
El funcionamiento de los componentes EJB se basa fundamentalmente en el trabajo del contenedor
EJB.
El contenedor EJB es un programa Java que trabaja en el servidor y que contiene todas las clases y
objetos necesarios para el correcto funcionamiento de los EJBs.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Los servicios que ofrece un contenedor de EJBs son los siguientes:
Integración: Proveen una forma de acoplar en tiempo de ejecución diferentes componentes, mediante la simple
configuración de anotaciones xml. La integración es un servicio que proveen los beans de sesión y los MDBs.
Pooling: El contenedor de EJBs crea para componentes EJB un pool de instancias que es compartido por los
diferentes clientes. Aunque cada cliente visualiza el entorno como si recibiera siempre instancias diferentes de
los EJB, el contenedor está constantemente reutilizando objetos para optimizar memoria. El pooling es un servicio
que se aplica a los Stateless Session Beans y a los MDBs. 83
Thread-safely: El programador puede escribir componentes del lado del servidor como si estuviera trabajando en
una aplicación sencilla con un solo thread (hilo). El contenedor se encarga de que los EJBs tengan el soporte
adecuado para una aplicación multi-usuario (como son en general las aplicaciones empresariales) de forma
transparente, asegurando el acceso seguro, consistente y alto rendimiento. Se aplican a los beans de sesión y a
los MDBs.
Administración de Estados: El contenedor de EJBs almacena y maneja el estado de un Stateful Session Bean de
forma transparente, lo que significa que el programador puede mantener el estado de los miembros de una clase
como si estuviera desarrollando una aplicación de escritorio ordinaria. El contenedor manipula los detalles de las
sesiones.
Mensajería: Mediante los MDBs es posible desacoplar por completo dos componentes para que se comuniquen
de forma asincrónica, sin reparar demasiado en los mecanismos de la JMS API que los MDBs encapsulan.
Transacciones: EJB soporta el manejo de transacciones declarativas que permiten agregar comportamiento
transaccional a un componente simplemente usando anotaciones xml de configuración. Esto significa que cuando
un método de un EJB (Session Bean o MDB) se completa normalmente, el contenedor se encargará de finalizar la
transacción y validar los cambios que se realizaron en los datos de forma permanente. Si algo fallara durante la
ejecución del método (una excepción o cualquier otro problema), la transacción haría un rollback y es como si el
método jamás se hubiera invocado.
Seguridad: EJB soporta integración con la Java Authentication and Authorization Service (JAAS) API, haciendo
casi transparente el manejo transversal de la seguridad. Se aplica a todos los Session Beans.
Interceptors: EJB introduce un framework liviano y simple para AOP (programación orientada a aspectos). No es
tan robusto y completo como otros, pero es lo suficientemente útil para que sea utilizado por los demás servicios
del contenedor para brindarnos de forma invisible los crosscutting concerns de seguridad, transacciones, thread-
safely.
Acceso Remoto: Es posible acceder de forma remota a distintos EJBs de forma sencilla, simplemente mediante la
Inyección de Dependencia. El procedimiento para inyectar un componente local o uno remoto es exactamente el
mismo, abstrayéndonos de las complicaciones específicas de RMI o similares. Este servicio aplica únicamente a
los Session Beans.
Web Services: Un Stateless Session Bean puede publicar sus métodos como servicios web mediante una sencilla
anotación.
Persistencia: EJB 3 provee la especificación JPA para el mapeo de objetos llamados Entidades a tablas o POJOs.
Aquí tenemos un gráfico que mostraría la representación de EJB dentro de un módulo web.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
84
Tipos de beans
Existen tres tipos de beans definidos, cada uno implementa unas características diferentes y
permiten ser combinados entre si.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Las entidades son POJOs con cierta información metadata que permite a la capa de persistencia
mapear los atributos de la clase a las tablas de la base de datos y sus relaciones.
Existen dos tipos BMP y CMP según se gestione la persistencia por parte del bean o del contenedor.
Los EJB de entidad están directamente relacionados con los datos de la aplicación, son objetos que
mantienen en memoria los datos que maneja la aplicación, las entidades que disponen de
persistencia.
Los Beans de Entidad normalmente mapean (mantienen una relación en memoria) las tablas de
una base de datos relacional, aunque también es posible que mantengan la persistencia de los datos 85
en ficheros, como por ejemplo un xml.
En cualquiera de los casos el objetivo de un Bean de Entidad es almacenar los datos en memoria
desde una fuente persistente y mantener una sincronización total entre el estado de los datos entre
la memoria y la fuente de datos.
Por esta razón se dice que los Beans de Entidad son los EJB que sobreviven a caídas del sistema, ya
que en caso de un fallo del sistema, los datos que hay en memoria estarían guardados en el
dispositivo persistente, como por ejemplo la base de datos, con lo cual, cuando se reinicie el
servidor se recuperarán sin ningún problema.
Anotaciones de un bean
Para poder configurar correctamente un vean, debemos indicar al contenedor de EJB qué servicios
debe proveer a nuestro Bean, y para ello disponemos de los descriptores de despliegue o de las
anotaciones en las clases bean.
Vamos a visualizar las anotaciones básicas para los Session Beans.
@Stateful
Indica que el Bean de Sesión es con estado. Sus atributos son:
name: por defecto es el nombre de la clase pero se puede especificar otro nombre diferente.
mappedName: Indica si deseamos que el contenedor maneje el objeto de forma específica.
Si incluimos esta opción nuestra aplicación podría no ser portable y no funcione en otro
servidor de aplicaciones.
description: Indica la descripción de la anotación.
@Stateless
Indica que el Bean de Sesión es sin estado. Sus atributos son:
name: Por defecto el nombre de la clase pero se puede especificar otra diferente.
mappedName: Si deseamos que el contenedor maneje el objeto de manera específica. Al
igual que @StateFul esta opción podría hacer que nuestra aplicación no sea portable y no
funcione en otro servidor de aplicaciones.
Description: descripción de la anotación.
@Init
Especifica que el método se corresponde con un método create de un EJBHome o EJBLocalHome de
EJB 2.1.
Sólo se podrá llamar una única vez a este método. Sus atributos son:
Value: indica el nombre del correspondiente método create de la interfaz home adaptada.
Sólo se debe utilizar cuando se utiliza el bean anotado con un bean con estado de la
especificación 2.1 o anterior y que disponga de más de un método create.
@Remove
Indica que el contenedor debe llamar al método cuando quiera destruir la instancia del Bean. Sus
atributos son:
retainIfException: indica si el Bean debe mantenerse activo si se produce una excepción. Por
defecto su valor es false.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
86
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
@Local
Indica que la interfaz es local.
@Remote
Indica que la interfaz es remota.
@PostActivate
Invocado después de que el Bean sea activado por el contenedor. 87
@PrePassivate
Invocado antes de que el Bean esté en estado passivate.
Normalmente las anotaciones más empleadas en las aplicaciones serán @Stateless y @Stateful,
para indicar el tipo de EJB que estemos utilizando. El resto de anotaciones se utilizarán en casos
más particulares.
El desarrollador EJB
La principal responsabilidad del programador de un bean será escribir la lógica de empresa y
acciones o propiedades.
Siempre que sea posible, la especificación Enterprise JavaBeans intenta abstraer a los
programadores de un bean de cualquier tarea de nivel de sistema.
El programador de un bean debe estructurar su código de una forma determinada.
No importa el tipo de EJB que se esté desarrollando, normalmente deben crearse archivos de clase
primarios y un descriptor xml o bien, incluir anotaciones en las clases del bean.
También podríamos tener clases Java adicionales que apoyen la operación del bean, clases de ayuda
que implementen la lógica de negocio.
Todos estos archivos estarían empaquetados en un JAR, ya hemos visto que es la unidad estándar
de empaquetado de clases de Java.
Podriamos tener muchos beans dentro de un único archivo JAR, pero cada archivo JAR contendría
únicamente descriptor del bean xml.
El descriptor de implementación debe situarse en un directorio especifico, de forma que el
contenedor EJB sabría donde buscarlo.
Este directorio se llama META- INF y no podemos cambiarle el nombre, sigue una especificación
estándar.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Aquí podemos visualizar la implementación del uso de un EJB dentro de un entorno de desarrollo,
independientemente que sea realizada la llamada desde un navegador o desde una aplicación Java.
88
Estructura de EJB
Todo EJB está compuesto por dos capas.
Capa Interfaz
La capa Interfaz es un contrato que indica a las clases que consuman el EJB los métodos y
características de dicho EJB.
Para poder trabajar con EJB, necesitamos tener una Interfaz que contenga los métodos que vamos a
exponer a un cliente final.
Capa Implementación
Sobre nuestro nuevo proyecto y sobre el paquete creado, vamos a agregar una Interfaz que será el
contrato.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
89
Simplemente vamos a escribir un código con un método que recibirá un tipo de dato String.
Escribimos el siguiente código en la Interfaz.
package javaapplication1;
public interface InterfazEJB {
public void GetMensaje(String nombre);
}
A continuación, nos crearemos una clase sobre el mismo paquete que llamaremos ClaseEJB.
Dicha clase se encargará de implementar la Interfaz de contrato EJB. Para poder trabajar con ello,
debemos utilizar el espacio de nombres siguiente:
import javax.ejb.Stateless
Como podemos comprobar en la imagen, no reconoce la librería de los EJB, por lo que tendremos
que incluirla manualmente para poder trabajar con dichas clases.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
90
En la carpeta Biblioteca de NetBeans, irán todas las librerías relacionadas con nuestro proyecto.
Lo que vamos a realizar es agregar la librería que permite trabajar con EJB. Para ello,
seleccionamos en el menú contextual: “Agregar archivo JAR/carpeta”.
Buscamos la librería de ejb en la carpeta dónde la hayamos situado. Dicha librería es proporcionada
en la documentación del módulo.
Una vez que ya tenemos la librería añadida, ahora es el momento de implementar la Interfaz sobre
la ClaseEJB. Para ello escribimos el siguiente código:
public class ClaseEJB implements InterfazEJB {
Como vemos en la imagen, nos dará un fallo debido a que tenemos que implementar todos los
métodos que contega la Interfaz de la que estamos heredando.
Para implementar los métodos, NetBeans ofrece una herramienta muy útil que “lee” todos los
métodos de la Interfaz y los implementa dentro de nuestra clase.
Si pulsamos sobre el símbolo de la bombilla de la izquierda del código, nos aparecerá una opción
para Implementar los métodos. Seleccionamos dicha opción.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Una vez que tenemos todos los métodos implementados, escribimos el siguiente código dentro de la 91
clase llamada ClaseEJB.
package javaapplication1;
import javax.ejb.Stateless;
public class ClaseEJB implements InterfazEJB
{
public void GetMensaje(String nombre) {
System.out.println("Primer EJB, Bienvenido a la tecnología " + nombre);
}
}
Ahora nos quedará crearnos un cliente que consuma nuestro bean.
Para ello, debemos agregar una nueva clase sobre el paquete creado y la llamaremos ClienteEJB.
Sobre dicho cliente escribiremos la implementación del consumo del Bean. Para indicar que estamos
utilizando un contrato, utilizaremos la anotación @EJB para que el contenedor reconozca nuestra
lógica de negocio.
Escribimos el siguiente código dentro de la clase ClienteEJB:
package javaapplication1;
import javax.ejb.EJB;
public class ClienteEJB {
@EJB
private ClaseEJB BeanEJB;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
void MetodoCliente()
{
BeanEJB = new ClaseEJB();
BeanEJB.GetMensaje("Usuario de EJB");
}
}
Por último, nos quedará mostrar el resultado de la aplicación. Para ello, iremos a la clase inicial de 92
los proyectos de J2SE llamada Main.java.
En el código de arranque de la clase, crearemos el objeto cliente, que a su vez, llamará al método
del Bean que seguirá el contrato de la Interfaz.
Implementamos el siguiente código en Main.java:
package javaapplication1;
public class Main {
public static void main(String[] args) {
ClienteEJB cliente = new ClienteEJB();
cliente.MetodoCliente();
}
}
Como podemos comprobar cuando ejecutemos la aplicación (tecla F6), veremos el resultado de la
llamada al Bean en la consola de NetBeans.
Custom Tags
Son etiquetas personalizadas que no tiene por qué realizarlas el programador, sino el analista
programador.
Uno de los grandes objetivos, es que el programador que lo vaya a utilizar, bastaría con que supiese
HTML para poder implementar la funcionalidad.
Un Custom Tag es una etiqueta propia, personalizada, es una ampliación de las Acciones JavaBeans.
Uno de los objetivos, será no utilizar en las páginas JSP código java, sino que los Custom Tags se
encargan de realizar todos los posibles tipos de acciones.
Se necesitan múltiples ficheros para trabajar: XML y JSP
Definición de etiquetas:
Archivo tld Es el archivo de definición de las etiquetas Custom Tags
Debemos indicar las características de etiquetas que habrá en todo mi proyecto.
El fichero Xml es la descripción de nuestro sitio web
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
El fichero class es la clase con la lógica java
El fichero JSP La página para mostrar las etiquetas Custom tags.
Lo llamaremos ProyectoCustomTags:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Utilizaremos el servidor Apache Tomcat que trae el IDE Netbeans.
94
Sobre la carpeta WEB-INF, nos crearemos una nueva carpeta que llamaremos FolderTLD. Para
ello, seleccionamos la opción Folder dentro de la categoría Other.
Sobre la carpeta FolderTLD ya creada en nuestro proyecto, vamos a agregar un objeto Tag Library
Descriptor de la carpeta Web:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Lo llamaremos mensaje.
95
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
96
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.TagSupport;
import java.util.*;
import java.text.*;
@Override
public int doStartTag() throws JspTagException
{
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspTagException
{
String horaactual = this.GetHora();
try
{
JspWriter out = pageContext.getOut();
out.write("<h1>Bienvenido a mi pagina Custom Tags</h1>");
out.write("El nombre de mi clase es: ");
out.write(getClass().getName());
out.write("<br> y la hora es " + horaactual + "<p/>");
}catch (IOException ex)
{
throw new JspTagException("Excepcion al cargar el fichero TLD " +ex.toString());
}
return EVAL_PAGE;
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
formato= DateFormat.getTimeInstance();
cadhora=formato.format(horaactual);
return cadhora;
}
}
Ahora debemos irnos al descriptor de la aplicación web. Seleccionamos el fichero web.xml dentro de
la carpeta WEB-INF:
<?xml version="1.0" encoding="UTF-8"?> 97
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>mietiquetacustomtag</taglib-uri>
<taglib-location>/WEB-INF/FolderTLD/mensaje.tld</taglib-location>
</taglib>
</web-app>
La estructura de nuestra aplicación web quedaría de la siguiente forma:
Por último, escribiremos el siguiente código en la página index.jsp para realizar la llamada a la
librería Custom Tags que hemos creado:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="mietiquetacustomtag" prefix="MiEtiqueta" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Pagina realizada con Custom Tags</h1>
<MiEtiqueta:primera/>
</body>
</html>
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Como podremos comprobar al ejecutar la aplicación, la llamada a nuestro Custom tag se realiza
correctamente siempre y cuando hayamos configurado correctamente todo.
98
Enunciado
Vamos a realizar una página JSP que mostrará una tabla con los datos de los departamentos.
Para ello, utilizaremos la tecnología Custom Tags.
La página JSP solamente contendrá una etiqueta Custom Tag que será la encargada de dibujar la
tabla.
Lo primero que vamos a realizar será crearnos un nuevo proyecto Web Application.
Nos creamos un nuevo proyecto Java Web:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Lo llamaremos AplicacionCustomTags
99
Sobre la carpeta EtiquetasDEPT ya creada en nuestro proyecto, vamos a agregar un objeto Tag Library
Descriptor de la carpeta Web:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
100
Lo llamaremos etiquetadepartamentos
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
101
Lo que debemos realizar ahora es el acceso mediante JDBC a la tabla EMP de Oracle. Para ello,
debemos agregar dentro de la carpeta Libraries el conector JDBC para Oracle.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
102
@Override
public int doEndTag() throws JspTagException
{
try
{
JspWriter out = pageContext.getOut();
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
"SYSTEM", "12345");
Statement sentencia = cn.createStatement();
//(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = sentencia.executeQuery("SELECT * FROM DEPT");
out.write("<h1>Datos de los departamentos</h1>");
String tabla = "<table border='1'>";
tabla += "<tr><th>Numero</th><th>Nombre</th><th>Localidad</th></tr>";
while (rs.next())
{
tabla += "<tr>";
tabla += "<td>"+rs.getString(1)+"</td>";
tabla += "<td>"+rs.getString(2)+"</td>";
tabla += "<td>"+rs.getString(3)+"</td>";
tabla += "</tr>";
}
tabla += "</table>";
out.write(tabla);
}catch (Exception ex)
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
{
throw new JspTagException("Excepcion al cargar el fichero TLD " +ex.toString());
}
return EVAL_PAGE;
}
}
Ahora debemos irnos al descriptor de la aplicación web.
Seleccionamos el fichero web.xml dentro de la carpeta WEB-INF y escribimos lo siguiente: 103
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>mietiquetacustomtag</taglib-uri>
<taglib-location>/WEB-INF/EtiquetasDEPT/etiquetadepartamentos.tld</taglib-location>
</taglib>
</web-app>
Ahora vamos a agregar una pagina JSP que dibujará los empleados que tenemos en la etiqueta
Custom Tag.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<tagdept:tabladepartamentos/>
</body>
</html> 104
Ya podremos ejecutar nuestro proyecto y comprobar el funcionamiento correcto de la aplicación:
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 8. Arquitectura de seguridad
Introducción
Java contiene dos definiciones importantes:
Es un lenguaje de programación orientado a objetos 105
Es una plataforma software en la que se ejecutan programas.
Seguridad criptográfica
La criptología es el estudio de la criptografía y el criptoanálisis.
Viendo sus características en términos sociales, es la ciencia que permite que el coste de adquirir o
alterar información de modo impropio sea mayor que el posible valor obtenido al hacerlo.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
ininteligible (encriptación) y recuperar el mensaje original a partir de esa versión ininteligible
(desencriptación).
Algoritmo criptográfico
Es un método matemático que se emplea para encriptar y desencriptar un mensaje.
Generalmente funciona empleando una o más claves (números o cadenas de caracteres) como 106
parámetros del algoritmo, de modo que sean necesarias para recuperar el mensaje a partir de la
versión cifrada.
El mensaje antes de encriptar se denomina texto en claro y una vez encriptado se denomina texto
cifrado.
Sistema criptográfico
Es un sistema para encriptar y desencriptar información compuesto por un conjunto de algoritmos
criptográficos, claves y, posiblemente, varios textos en claro con sus correspondientes versiones en
texto cifrado.
Criptoanálisis
Es el conjunto de procedimientos, procesos y métodos empleados para romper un algoritmo
criptográfico, desencriptar un texto cifrado o descubrir las claves empleadas para generarlo.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Los algoritmos de cifrado por bloques iterativos funcionan aplicando en sucesivas rotaciones una
transformación a un bloque de texto en claro.
La misma función es aplicada a los datos usando una subclave obtenida de la clave secreta
proporcionada por el usuario.
El número de rotaciones en un algoritmo de cifrado por bloques iterativo depende del nivel de
seguridad deseado.
Un tipo especial de algoritmos de cifrado por bloques iterativos son los denominados algoritmos de
cifrado de Feistel. 107
En estos algoritmos el texto cifrado se obtiene del texto en claro aplicando repetidamente la misma
transformación o función de rotación.
Una característica interesante de estos algoritmos es que la encriptación y desencriptación son
idénticas estructuralmente, aunque las subclaves empleadas en la encriptación se toman en orden
inverso en la desencriptación.
Para aplicar un algoritmo por bloques es necesario descomponer el texto de entrada en bloques de
tamaño fijo.
Fundamentos matemáticos
Las funciones de una sola dirección son aquellas en las que obtener el resultado en una dirección es
fácil, pero en la otra es casi imposible.
Los algoritmos criptográficos de clave pública se basan en funciones de una sola dirección con
puerta trasera, que son aquellos en los que el problema es resoluble en la dirección opuesta (la que
antes era muy difícil) empleando una ayuda (la puerta trasera).
Los siguientes problemas matemáticos son considerados como funciones de una sola dirección con
puerta trasera y son la base de la mayoría de algoritmos de clave pública actuales:
Factorización de enteros. Un número entero siempre se puede representar como un producto
de números primos denominados factores primos.
La factorización de enteros consiste en encontrar los factores primos de un número.
Los algoritmos criptográficos basados en este problema aprovechan el hecho de que la
multiplicación de números primos grandes es computacionalmente sencilla pero la
factorización un número grande en sus factores primos es muy cara computacionalmente.
Logaritmos discretos. En aritmética módulo n dos enteros son equivalentes si tienen el
mismo resto cuando son divididos por n.
El resto de la división m / n es el menor entero no negativo que difiere de m por un múltiplo
de n.
La exponenciación discreta (ax mod n), es la exponenciación en aritmética módulo n.
Por ejemplo, 34 mod 10 es 81 mod 10, que es equivalente a 1 mod 10.
El logaritmo discreto es la operación inversa a la exponenciación discreta.
Los algoritmos que emplean este tipo de problema se basan en que la exponenciación
módulo n es un problema fácil y hallar el logaritmo discreto es un problema difícil.
Logaritmos discretos de curva elíptica. Es una variación del problema anterior más cara
computacionalmente, lo que permite usar claves más pequeñas que mejoran las prestaciones
de los algoritmos y reducen el tamaño de los textos cifrados.
Tipos de algoritmo
En función de su relación matemática distinguimos varios tipos de algoritmo:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Reversible.
o Es aquel en el que un mensaje encriptado con la clave privada puede ser
desencriptado usando la clave pública y viceversa, es decir, uno encriptado usando la
clave pública puede ser desencriptado usando la privada.
Irreversible.
o Es aquel en el que un mensaje encriptado usando la clave privada, puede ser
desencriptado con la clave pública, pero la clave privada no desencripta los mensajes 108
cifrados usando la clave pública.
De intercambio de claves.
o Sólo permiten negociar de forma segura una clave secreta entre dos partes.
Hay que indicar que los algoritmos reversibles también se pueden emplear para esta función,
pero los irreversibles no.
Aplicaciones de los algoritmos
Este tipo de algoritmos tienen dos aplicaciones fundamentales:
Encriptación:
Si un usuario A quiere mandar un mensaje a otro usuario B, lo encripta usando la clave
pública de B.
Cuando B lo recibe lo desencripta usando su clave privada. Si alguien intercepta el mensaje
no puede descifrarlo, ya que no conoce la clave privada de B, de hecho, ni siquiera A es
capaz de desencriptar el mensaje.
Firmas digitales:
Si B encripta un mensaje usando su clave privada cualquiera que tenga su clave pública
podrá obtener el texto en claro correspondiente.
Si alguien quiere hacerse pasar por B tendrá que cifrar el mensaje usando la misma clave
privada o no se descifrará correctamente con la clave pública de B.
Lo que B ha hecho es firmar digitalmente el mensaje.
El proceso de desencriptar con una clave pública un mensaje firmado se denomina
verificación de firma.
Estos algoritmos son mucho más caros que los de clave secreta, por lo que no se usan para
encriptar mucha información.
Su principal aplicación está en la fase inicial de una comunicación, ya que permiten que los dos
extremos se autentifiquen e intercambien claves secretas para encriptar con un algoritmo simétrico.
El problema fundamental de este tipo de algoritmos es la distribución de las claves, aunque la clave
pública se puede distribuir libremente quedaría el problema de la suplantación.
Para generar MACs se pueden usar algoritmos de clave secreta, de clave pública y algoritmos de
resumen de mensajes.
Lo que realiza es generar el MAC aplicando una función de dispersión criptográfica a un conjunto
formado por un mensaje y un código secreto.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
De esta forma, quien recibe el mensaje puede calcular su propio MAC con el mensaje y el código
secreto, que comparte con el que ha generado el MAC.
Si no coinciden, sabemos que el mensaje ha sido manipulado.
Este tipo de técnicas se emplean para proteger comunicaciones a nivel de la capa de red.
El destinatario usa una clave de verificación para comprobar el origen del mensaje y que no ha sido
modificado durante el tránsito.
Para firmar los mensajes se emplean algoritmos de clave pública y funciones de dispersión.
El proceso es el siguiente:
1. El emisor genera un resumen del mensaje, lo encripta con su clave privada (clave de
firmado) y envía el mensaje y el texto cifrado que corresponde al resumen del mensaje.
2. El destinatario genera un resumen del mensaje que recibe y desencripta el resumen cifrado
que lo acompañaba usando la clave pública del emisor (clave de verificación).
Si al comparar los resúmenes, ambos son iguales, el mensaje es válido y ha sido firmado por el
emisor real, ya que de otro modo no se hubiera podido desencriptar correctamente con su clave
pública.
Hay que indicar que los MAC y las firmas digitales se diferencian en un punto importante, aunque los
MAC se pueden usar para verificar la autenticidad de los mensajes, no se pueden usar para firmar
los mensajes, ya que sólo se usa una clave secreta que comparten el emisor y el receptor, lo que
hace que ambos puedan generar la misma firma.
El publicar los algoritmos empleados por un sistema criptográfico para que sean revisados
públicamente es una buena práctica que permite que se mejoren algoritmos no totalmente seguros
o se considere que un algoritmo no tiene debilidades.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Rotura total. Se recupera la clave y se puede descifrar cualquier mensaje encriptado con la
misma clave.
Para que un sistema criptográfico sea considerado como seguro, debe contener las siguientes
características:
Debe disponer de un número muy elevado de claves posibles, de modo que sea poco
razonable intentar descifrar un mensaje por el método de la fuerza bruta (probando todas las
claves).
Debe producir texto cifrado que parezca aleatorio a un test estadístico estándar.
Debe resistir todos los métodos conocidos de romper los códigos, es decir, debe ser
resistente al criptoanálisis.
Aplicaciones de la criptografía
La criptografía es una disciplina con multitud de aplicaciones, muchas de las cuales están en uso hoy
en día.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
111
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Gracias al empleo de canales seguros y a los mecanismos de identificación se posibilita el
comercio electrónico, ya que tanto las empresas como los usuarios tienen garantías de que
las operaciones no pueden ser espiadas, reduciéndose el riesgo de fraudes y robos.
Fue publicado en 1977. En este documento se describe el DEA (Data Encription Algorithm o
Algoritmo de Encriptación de Datos.
Es el algoritmo de cifrado simétrico más estudiado, mejor conocido y más empleado del mundo.
El DEA (llamado con frecuencia DES) es un algoritmo de cifrado por bloques de 64 bits de tamaño.
Emplea una clave de 56 bits durante la ejecución (se eliminan 8 bits de paridad del bloque de 64).
El algoritmo se puede usar para encriptar y desencriptar mensajes, generar y verificar códigos de
autentificación de mensajes (MAC) y para encriptación de un sólo usuario.
Triple-DES
Consiste en encriptar tres veces una clave DES.
AES
El AES (Advanced Encription Standard o Estándar Criptográfico Avanzado) es un algoritmo de cifrado
por bloques destinado a reemplazar al DES como estándar.
RC2
El RC2 es un algoritmo de cifrado por bloques de clave de tamaño variable.
El algoritmo trabaja con bloques de 64 bits y entre dos y tres veces más rápido que el DES en
software.
Se puede hacer más o menos seguro que el DES contra algoritmos de fuerza bruta eligiendo el
tamaño de clave apropiadamente.
RC4
El RC4 es un algoritmo de cifrado de flujo.
Es un algoritmo de tamaño de clave variable con operaciones a nivel de byte. Se basa en el uso de
una permutación aleatoria y tiene un periodo estimado de más de 10100. Además, es un algoritmo
de ejecución rápida en software.
El algoritmo se emplea para encriptación de ficheros y para encriptar la comunicación en protocolos
como el SSL (TLS).
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
RC5
El RC5 es un algoritmo parametrizable con tamaño de bloque variable, tamaño de clave variable y
número de rotaciones variable.
Los valores más comunes de los parámetros son 64 o 128 bits para el tamaño de bloque, de 0 a 255
rotaciones y claves de 0 a 2048 bits.
113
El RC5 tiene 3 rutinas: expansión de la clave, encriptación y desencriptación.
En la primera rutina la clave proporcionada por el usuario se expande para llenar una tabla de claves
cuyo tamaño depende del número de rotaciones.
IDEA
El IDEA (International Data Encription Algorithm) es un algoritmo de cifrado por bloques de 64 bits
iterativo.
SAFER
El SAFER (Secure And Fast Encription Routine) es un algoritmo de cifrado por bloques no
propietario.
Está orientado a bytes y emplea un tamaño de bloque de 64 bits y claves de 64 (SAFER K-64) o 128
bits (SAFER K-128).
Blowfish
Es un algoritmo de cifrado por bloques de 64 bits.
Es un algoritmo de tipo Feistel y cada rotación consiste en una permutación que depende de la clave
y una sustitución que depende de la clave y los datos.
Todas las operaciones se basan en o-exclusivas sobre palabras de 32 bits.
La clave tiene tamaño variable (con un máximo de 448 bits) y se emplea para generar varios
vectores de subclaves.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Tipos de algoritmos de cifrado asimétrico
RSA
El RSA, llamado así por las siglas de sus creadores (Rivest, Shamir y Adelman), es el algoritmo de
clave pública más popular.
El algoritmo se puede usar para encriptar comunicaciones, firmas digitales e intercambio de claves. 114
La clave es de tamaño variable, generalmente se usan claves entre 512 y 2048 bits.
Las claves más grandes aumentan la seguridad del algoritmo pero disminuyen su eficiencia y
generan más texto cifrado.
Los bloques de texto en claro pueden ser de cualquier tamaño, siempre que sea menor que la
longitud de la clave.
La clave privada tiene la forma (d, n), donde d es el producto inverso de e modulo (p-1)(q-1) (es
decir, (ed - 1) es divisible por (p-1)(q-1)).
SHA y SHA-1
El SHA (Secure Hash Algorithm) es un algoritmo de resumen seguro desarrollado por el NIST.
El SHA-1 es una versión corregida del algoritmo publicada en 1994.
El algoritmo es un estándar ANSI.
El algoritmo toma un mensaje de menos de 264 bits y genera un resumen de 160 bits.
Es más lento que el MD5, pero la mayor longitud de clave lo hace más resistente a ataques de
colisión por fuerza bruta y de inversión.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Sobre ese mensaje se calcula un checksum de 16 bytes que se añade al mensaje y la función de
dispersión se aplica al mensaje resultante.
Con el MD4, el mensaje se rellena para que su longitud en bits más 448 sea divisible por 512.
Una representación de la longitud del mensaje de 64 bits se concatena entonces con el mensaje.
El mensaje se procesa iterativamente en bloques de 512 bits y cada bloque es procesado en tres
rotaciones distintas.
El algoritmo ha sido criptoanalizado y se han encontrado debilidades, de hecho es posible encontrar
colisiones en menos de un minuto en máquinas modernas, por lo que el algoritmo se considera a 115
todos los efectos roto.
El MD5 es, básicamente, el MD4 con mejoras en la seguridad, aunque es más lento que este.
El tamaño del resumen y la necesidad del relleno son iguales que en el MD4.
Consta de cuatro rotaciones que tienen un diseño ligeramente diferente a las del MD4.
El algoritmo ha sido criptoanalizado con técnicas similares a las del MD4 y se han encontrado
pseudo-colisiones en la función de compresión, pero no en el algoritmo completo.
Certificados digitales
Los certificados digitales son el equivalente digital del DNI, en lo que a la autentificación de
individuos se refiere, ya que permiten que un individuo demuestre que es quien dice ser, es decir,
que está en posesión de la clave secreta asociada a su certificado.
Certificados X.509
El formato de certificados X.509 es un estándar del ITU-T (International Telecommunication Union-
Telecommunication Standarization Sector) y el ISO/IEC (International Standards Organization /
International Electrotechnical Commission) que se publicó por primera vez en 1988.
El formato de la versión 1 fue extendido en 1993 para incluir dos nuevos campos que permiten
soportar el control de acceso a directorios.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Después de emplear el X.509 v2 para intentar desarrollar un estándar de correo electrónico seguro,
el formato fue revisado para permitir la extensión con campos adicionales, dando lugar al X.509 v3,
publicado en 1996.
Los elementos del formato de un certificado X.509 v3 son:
Versión. El campo de versión contiene el número de versión del certificado codificado.
Número de serie del certificado. Este campo es un entero asignado por la autoridad
certificadora.
116
Cada certificado emitido por una CA debe tener un número de serie único.
Identificador del algoritmo de firmado. Este campo identifica el algoritmo empleado para
firmar el certificado (como por ejemplo el RSA o el DSA).
Nombre del emisor. Este campo identifica la CA que ha firmado y emitido el certificado.
Periodo de validez. Este campo indica el periodo de tiempo durante el cual el certificado es
válido y la CA está obligada a mantener información sobre el estado del mismo.
El campo consiste en una fecha inicial, la fecha en la que el certificado comienza a ser válido
y la fecha después de la cual, el certificado deja de serlo.
Nombre del sujeto. Este campo identifica la identidad cuya clave pública está certificada en
el campo siguiente.
El nombre debe ser único para cada entidad certificada por una CA dada, aunque puede
emitir más de un certificado con el mismo nombre si es para la misma entidad.
Información de clave pública del sujeto. Este campo contiene la clave pública, sus
parámetros y el identificador del algoritmo con el que se emplea la clave.
Identificador único del emisor. Este es un campo opcional que permite reutilizar nombres de
emisor.
Identificador único del sujeto. Este es un campo opcional que permite reutilizar nombres de
sujeto.
Extensiones de certificado
Las extensiones del X.509 proporcionan una manera de asociar información adicional a sujetos,
claves públicas, etc.
Un campo de extensión contiene tres partes:
Tipo de extensión. Es un identificador de objeto que proporciona la semántica y el tipo de
información (cadena de texto, fecha u otra estructura de datos) para un valor de extensión.
Valor de la extensión. Este subcampo contiene el valor actual del campo.
Indicador de importancia. Es una etiqueta que indica a una aplicación si es seguro ignorar el
campo de extensión si no reconoce el tipo.
El indicador proporciona una manera de implementar aplicaciones que trabajan de modo
seguro con certificados y evolucionan conforme se van añadiendo nuevas extensiones.
El formato de certificados X.509 se especifica en un sistema de notación denominado sintaxis
abstracta uno (Abstract Sintax One o ASN-1).
Para la transmisión de los datos se aplica el DER (Distinguished Encoding Rules o reglas de
codificación distinguible), que transforma el certificado en formato ASN-1 en una secuencia de
octetos apropiada para la transmisión en redes reales.
Autoridades Certificadoras
Una autoridad certificadora es una organización fiable que acepta solicitudes de certificados de
entidades, las valida, genera certificados y mantiene la información de su estado.
Una CA debe proporcionar una Declaración de Prácticas de Certificación (Certification Practice
Statement o CPS) que indique claramente sus políticas y prácticas relativas a la seguridad y
mantenimiento de los certificados, las responsabilidades de la CA respecto a los sistemas que
emplean sus certificados y las obligaciones de los subscriptores respecto de la misma.
Las labores de un CA son:
Admisión de solicitudes. Un usuario rellena un formulario y lo envía a la CA solicitando un
certificado.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
La generación de las claves pública y privada son responsabilidad del usuario o de un sistema
asociado a la CA.
Autentificación del sujeto. Antes de firmar la información proporcionada por el sujeto, la CA
debe verificar su identidad.
Dependiendo del nivel de seguridad deseado y el tipo de certificado se deberán tomar las
medidas oportunas para la validación.
Generación de certificados. Después de recibir una solicitud y validar los datos, la CA genera
117
el certificado correspondiente y lo firma con su clave privada.
Posteriormente lo manda al subscriptor y, opcionalmente, lo envía a un almacén de
certificados para su distribución.
Distribución de certificados. La entidad certificadora puede proporcionar un servicio de
distribución de certificados para que las aplicaciones tengan acceso y puedan obtener los
certificados de sus subscriptores.
Los métodos de distribución pueden ser: correo electrónico, servicios de directorio como el
X.500 o el LDAP, etc.
Anulación de certificados. Al igual que sucede con las solicitudes de certificados, la CA debe
validar el origen y autenticidad de una solicitud de anulación.
La CA debe mantener información sobre una anulación durante todo el tiempo de validez del
certificado original.
Almacenes de datos. Hoy en día existe una noción formal de almacén donde se guardan los
certificados y la información de las anulaciones. La designación oficial de una base de datos
como almacén tiene por objeto señalar que el trabajo con los certificados es fiable y de
confianza.
Los mensajes de datos de la aplicación son transportados por la capa de registro y son
fragmentados, comprimidos y encriptados basándose en el estado actual de la conexión. Los
mensajes se tratan como datos transparentes para la capa de registro.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Autorización (authorization o access control): Mecanismo para asegurar que los usuarios
tienen permiso para realizar operaciones o para obtener acceso a la información.
Integridad de datos (data integrity): Mecanismo usado para probar que la información no ha
sido modificada por usuarios no autorizados.
Confidencialidad (confidentiality o data privacy): Mecanismo usado para asegurar que sólo
usuarios autorizados puedan ver cierta información.
No-rechazo (non-repudiation): Mecanismo para impedir que un usuario niegue haber 118
realizado alguna operación.
Auditoría (auditing): Mecanismo para capturar registros de operaciones, a prueba de
falsificaciones.
Los servicios de seguridad de Java EE se implementan mediante una o algunas de las siguientes
formas:
Anotaciones: La información de seguridad se especifica dentro de las mismas clases.
Declarativa: La información de seguridad se especifica en el deployment descriptor. (Los
valores especificados en el descriptor sustituyen a los de las anotaciones.)
Programática: Postulados embebidos en las clases.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Los Enterprise Java Beans (Session y Message Driven) pueden implementar la seguridad declarativa
y hace uso de la seguridad mediante las siguientes formas:
Declarando nombres de roles referenciados desde el código del bean.
Utilizando anotaciones.
Utilizando elementos en un deployment descriptor.
Para poder utilizar dichas características, será necesario tener acceso al “contexto de seguridad”,
que es un objeto creado por el contenedor de EJB. 119
Para tener acceso a dicho contexto de seguridad se utiliza la siguiente nomenclatura de código:
@Resource SessionContext contextoseguro
contextoseguro.getCallerPrincipal( )
contextoseguro.isCallerInRole(String roleName)
Un ejemplo de seguridad utilizando el método getCallerPrincipal().
Dicho método valida los usuarios dentro del propio código y se validaría el nombre del usuario.
package newpackage;
import java.security.Principal;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class NewSessionBean {
@Resource SessionContext contextoseguridad;
@PersistenceContext EntityManager em;
public void CambiarNombre() {
//obtenemos el usuario Principal de la aplicación.
Principal usuarioPrincipal;
String nombreusuario;
usuarioPrincipal = contextoseguridad.getCallerPrincipal();
//Obtenemos el nombre del usuario.
nombreusuario = usuarioPrincipal.getName();
//Para buscar usuarios, enviamos la entidad
//y el nombre del usuario, que estaría validado en
//el método findByPrimaryKey
Emp empleado =
em.findByPrimaryKey(Emp.class, nombreusuario);
//Si llegamos a este punto, podriamos modificar los datos
//del usuario mediante métodos implementados...
empleado.setEName("oldname","newname");
}
}
Como podemos comprobar, los usuarios se validarían antes de la acción del método, y una vez
validados, el propio método comprobaría su nombre de usuario para poder realizar las acciones.
Otro tipo de validación se puede realizar con el método isCallerInRole(role), que permite validar
usuarios mediante grupos o roles a los que perteneces, no validaría un usuario Principal, sino que
utiliza anotaciones en el propio bean para definir los grupos de usuarios a los que se les permite
acceso:
package newpackage;
import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.ejb.SessionContext;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
import javax.ejb.Stateless;
@DeclareRoles("EJECUTIVOS")
@Stateless
public class NewSessionBean {
@Resource SessionContext contextoseguridad;
Este role de seguridad permite poder modificar los datos de los empleados. Solamente están
admitidos los roles de EJECUTIVOS
<enterprise-beans>
<session>
<ejb-name> NewSessionBean</ejb-name>
<ejb-class> NewSessionBean</ejb-class>
<security-role-ref>
<description>
</description>
<role-name> EJECUTIVOS </role-name>
</security-role-ref>
</session>
...
</Enterprise-beans>
También podemos definir los permisos que necesitamos administrar a nivel de método de la clase.
Los permisos de métodos se pueden especificar a nivel de clase o a nivel de método (o ambos).
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
@Stateless
public class NewSessionBean implements MiBean extends MiClase
{
@RolesAllowed("usuarios")
public void PrimerMetodo () {...}
public void SegundoMetodo () {...}
public void OtroMetodo () {...}
} 121
Si analizamos el código anterior, los administradores podrán obtener acceso a los dos método del objeto
“MiClase”, pero en el método PrimerMetodo(), también tendrán acceso los usuarios, mientras que en el método
SegundoMetodo() solamente podrán acceder los administradores como roles.
Para poder crearnos Roles de seguridad tenemos dos formas de realizar la acción:
Mediante anotaciones en un servlet (por ejemplo)
@DeclareRoles("administrador")
public class MiServlet {
//CODIGO DEL SERVLET
}
Mediante el fichero web.xml:
<security-role>
<role-name> administrador</role-name>
</security-role>
También podemos especificar la seguridad propia de cada uno de los servlets en el fichero web.xml:
<servlet>
<security-role-ref>
<rol-name>admin</rol-name>
<rol-link>administrador</rol-link> Este sera el nombre del ROLE utilizando en el código del
servlet para la validación
</security-role-ref>
</servlet>
Al igual que con los EJB, podemos realizar mapeos de nombres a grupos, pero se escribirían en el
descriptor de la aplicación, no el fichero web.xml.
<sun-web-app>
<security-role-mapping>
<role-name>administradores</role-name>
<principal-name>admin1</principal-name>
<principal-name>admin2</principal-name>
</security-role-mapping>
<security-role-mapping>
<role-name>Becarios</role-name>
<group-name>beca</group-name>
</security-role-mapping>
..</sun-web-app>
Dentro de los servlets, tenemos tres métodos para implementar sobre la interfaz HttpServletRequest
que nos permiten el acceso a la información de seguridad:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
String getRemoteUser( )
Principal getUserPrincipal()
boolean isUserInRole(String roleName)
Por ejemplo, vamos a visualizar un servlet que valida los usuarios que se han conectado en nuestra
aplicación:
package newpackage;
import java.io.IOException; 122
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.annotation.security.DeclareRoles;
@DeclareRoles({"admin", "user"})
public class ServletSeguridad extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ServletSeguridad</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet con Seguridad</h1>");
if (request.isUserInRole("admin"))
{
out.println("Bienvenido administrador");
out.println("TIENE TODOS LOS PERMISOS");
}
if (request.isUserInRole("user"))
{
out.println("Bienvenido USUARIO");
out.println("SUS PERMISOS SON LIMITADOS...");
}
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
123
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Ver Video: Implementando Seguridad, en la Unidad 8,
en el Módulo 10, en la plataforma elearning
Objetivos
Comprobar el funcionamiento de la criptografía dentro del entorno de Java.
Aprender a cifrar y descifrar mensajes mediante la criptografía simétrica en aplicaciones
Java.
Enunciado
En este laboratorio realizaremos una aplicación gráfica de swing en la que cifraremos el contenido de
un texto mediante un password y lo descifraremos posteriormente.
El método de encriptación se realizará mediante base 64, por lo que escribiremos los bytes de la
encriptación dentro de un fichero para, posteriormente, leerlos y desencriptarlos.
Dicha encriptación nos permitiría guardar los datos en cualquier tipo de soporte para bytes[], por lo
que sería muy útil también para encriptar datos en Bases de datos.
Comenzaremos creándonos un nuevo proyecto Java Java Application en NetBeans.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Sobre el proyecto seleccionaremos un nuevo elemento:
125
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
126
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
JTextField txttexto
JTextField txtpass
JButton btncifrar
JButton btndescifrar
JTextArea txtresultado
127
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}catch (Exception ex)
{
JOptionPane.showMessageDialog(this, ex.toString());
return null;
}
}
A continuación, debemos crearnos un método que se encargará de escribir los datos binarios del
array byte[] dentro de un fichero. 128
Dicho método nos permitiría, posteriormente si lo desearamos, escribir sobre una base de datos o
sobre un documento xml.
private void escribirDatosFichero(byte[] entrada)
{
try
{
FileOutputStream fileOutput = new FileOutputStream("C:\\textocifrado.bin");
BufferedOutputStream bufferedOutput = new BufferedOutputStream(fileOutput);
bufferedOutput.write(entrada,0,entrada.length);
bufferedOutput.close();
}catch (Exception ex)
{
JOptionPane.showMessageDialog(this, ex.toString());
}
}
Ahora ya podemos implementar el código del ActionPerformed del botón de Cifrar.
Para ello, en el diseñador del JFrame, pulsamos dos veces sobre el botón de Cifrar y nos mostrará el
siguiente código:
private void btncifrarActionPerformed(java.awt.event.ActionEvent evt) {
}
Ahí implementaremos el código que nos permitirá cifrar el texto mediante un password y poder
escribir el resultado en un fichero.
El código que escribiremos será el siguiente:
private void btncifrarActionPerformed(java.awt.event.ActionEvent evt) {
try
{
//Generamos nuestra clave secreta para utilizada para cifrar nuestro mensaje
SecretKey clave = this.generarClave();
String mensaje = this.txttexto.getText();
byte[] resultadocifrado = this.encriptarTexto(mensaje, clave);
String textocifrado = new String(resultadocifrado);
this.txtresultado.setText(textocifrado);
this.escribirDatosFichero(resultadocifrado);
JOptionPane.showMessageDialog(this,"El mensaje encriptado es: " + new String(resultadocifrado));
}catch (Exception ex)
{
JOptionPane.showMessageDialog(this, ex.toString());
}
}
A continuación, debemos implementar los elementos para desencriptar el mensaje que hemos
almacenado en un fichero.
Nos crearemos un método que nos permite leer del fichero binario y devolver un array de bytes[]
con el resultado:
private byte[] leerDatosFichero()
{
try
{
FileInputStream ficherooriginal = new FileInputStream("C:\\textocifrado.bin");
BufferedInputStream lector = new BufferedInputStream(ficherooriginal);
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
ByteArrayOutputStream salida = new ByteArrayOutputStream();
byte [] array = new byte[1000];
int leidos = lector.read(array);
while (leidos > 0)
{
salida.write(array,0,leidos);
leidos=lector.read(array);
} 129
// Cierre de los ficheros
lector.close();
return salida.toByteArray();
}catch (Exception ex)
{
JOptionPane.showMessageDialog(this, ex.toString());
return null;
}
}
Ahora que ya tenemos todo el código para leer los bytes[] que deseamos desencriptar, pulsaremos
dos veces sobre el botón Descifrar y escribiremos el siguiente código:
private void btndescifrarActionPerformed(java.awt.event.ActionEvent evt) {
try
{
//Iniciamos ahora un objeto que se encargara de desencriptar el mensaje
Cipher desencriptar = Cipher.getInstance("DES/ECB/PKCS5Padding");
SecretKey clave = this.generarClave();
//Inicializamos el objeto en modo Desencriptar
desencriptar.init(Cipher.DECRYPT_MODE, clave);
byte[] datosentrada = leerDatosFichero();
byte[] msjDesencriptado = desencriptar.doFinal(datosentrada, 0, datosentrada.length);
JOptionPane.showMessageDialog(this,"\nEl mensaje desencriptado es: " + new
String(msjDesencriptado));
}catch (Exception ex)
{
JOptionPane.showMessageDialog(this, ex.toString());
}
}
Ya podremos probar nuestra aplicación y comprobar su funcionamiento:
Cuando pulsemos sobre Cifrar:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
130
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 9. Arquitectura de software
Introducción
La arquitectura de software es, independientemente del lenguaje con el que se implemente:
Un diseño de alto nivel. 131
La estructura del sistema.
Los componentes de un programa o sistema, sus relaciones, los principios que gobiernan su
diseño y su evolución en el tiempo.
Componentes y conectores.
Componentes, conectores, configuración y restricciones.
Estructura del sistema
La arquitectura tiene un impacto relevante ya que se detectan las partes más críticas de forma
temprana.
Los problemas se detectan antes y se solucionan mejor, debido a que toda la base ya está
estructurada
El coste del mantenimiento se reduce.
Permite identificar decisiones de diseño tempranamente.
Permite tener una idea general del sistema para aminorar riesgos.
Un intento de formalizar la forma en que se comunica y reusa la experiencia de diseño.
Captura la experiencia probada de diseño de software.
Describen problemas recurrentes que surgen en determinados contextos.
Describen esquemas de soluciones probados. Herramientas para los no expertos.
Un patrón de arquitectura de software es un esquema genérico probado para solucionar un
problema particular recurrente que surge en un cierto contexto.
Este esquema se especifica describiendo las componentes, con sus responsabilidades, relaciones y
las formas en que colaboran.
Existen multitud de definiciones para la arquitectura de software, todas ellas dependen del modelo
dónde se vayan a aplicar.
Objetivos
Comprender el análisis y la estructura de la arquitectura de software.
Su uso y desarrollo en los proyectos y su unión o diferenciación con UML.
Modelos de arquitectura
Modelos estructurales
Sostienen que la arquitectura de software está compuesta por componentes, conexiones
entre ellos y, en algunas ocasiones, otros aspectos tales como configuración, estilo,
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
restricciones, semántica, análisis, propiedades, racionalizaciones, requerimientos,
necesidades de los participantes.
El trabajo en esta área, está caracterizado por el desarrollo de lenguajes de descripción
arquitectónica (ADLs).
Modelos de framework
Son similares a la vista estructural, pero su característica principal radica en la estructura
coherente del sistema completo, en lugar de concentrarse en su composición.
Los modelos de framework a menudo se refieren a dominios o clases de problemas 132
específicos.
El trabajo que ejemplifica esta variante incluye arquitecturas de software específicas de
dominios, como CORBA, o modelos basados en CORBA, o repositorios de componentes
específicos.
Modelos dinámicos: Enfatizan la cualidad conductual de los sistemas.
La palabra “dinámico” puede referirse a los cambios en la configuración del sistema, o a la
dinámica involucrada en el progreso de la computación, tales como valores cambiantes de
datos.
Modelos de proceso
Se concentran en la construcción de la arquitectura, y en los pasos o procesos involucrados
en esa construcción.
En esta perspectiva, la arquitectura es el resultado de seguir un argumento (script) de
proceso.
Esta vista se ejemplifica con el actual trabajo sobre programación de procesos para derivar
arquitecturas.
Modelos funcionales
Una minoría considera la arquitectura como un conjunto de componentes funcionales,
organizados en capas que proporcionan servicios hacia arriba.
Podríamos pensar en esta visión como un framework particular.
Ninguna de estas vistas excluye a las otras, ni representa un conflicto fundamental sobre lo que es o
debe ser la arquitectura de software.
Por el contrario, representan un espectro en la comunidad de investigación sobre distintos puntos de
vista que pueden aplicarse a la arquitectura, involucrando sus partes constituyentes, su totalidad y
la forma en que se comporta una vez construida, o el proceso de su construcción.
Tomadas en su conjunto, destacan como una especie de elementos conjuntos que se separan en
capas.
Más allá de que existen numerosos conceptos en el plano detallado de las técnicas y metodologías,
la arquitectura de software se desarrolla alrededor de unos pocos conceptos y principios esenciales y
unas pocas herramientas características.
La arquitectura de software es el primer paso en la producción de un diseño de software, en una
secuencia que distingue tres pasos:
1) Arquitectura.
Asocia las capacidades del sistema especificadas en el requerimiento con los componentes
del sistema que habrán de implementarla.
La descripción arquitectónica incluye componentes y conectores (en términos de estilos) y la
definición de operadores que crean sistemas a partir de subsistemas o, en otros términos,
componen estilos complejos a partir de estilos simples.
3) Diseño ejecutable.
Remite al diseño de código a un nivel de detalle todavía más bajo y trata cuestiones tales
como la asignación de memoria, los formatos de datos, etc.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
133
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Estilos Un estilo es un concepto descriptivo que define una forma de articulación u organización
arquitectónica.
El conjunto de los estilos cataloga las formas básicas posibles de estructuras de software, mientras
que las formas complejas se articulan mediante composición de los estilos fundamentales.
Los estilos conjugan elementos o componentes, conectores, configuraciones y restricciones.
Al utilizar los conectores como componentes de primera clase, el concepto de estilo se sitúa en un
orden de discurso y de método que el modelado orientado a objetos en general, y UML en particular,
no cubren satisfactoriamente. 134
La descripción de un estilo se puede formular en lenguaje natural o en diagramas, pero lo mejor es
hacerlo en un lenguaje de descripción arquitectónica o en lenguajes formales de especificación.
A diferencia de los patrones de diseño, los estilos se ordenan en seis o siete clases fundamentales y
unos veinte ejemplares, como máximo.
Las arquitecturas complejas o compuestas resultan de la composición de estilos más básicos.
Algunos estilos típicos son las arquitecturas basadas en flujo de datos, las peer-to-peer, las de
invocación implícita, las jerárquicas, las centradas en datos o las de intérprete-máquina virtual.
Frameworks y Vistas
Existen unos organismos de estándares (ISO, CEN, IEEE, OMG) que han codificado diferentes
aspectos de la arquitectura de sofware, con el objetivo de homogeneizar la terminología, los
modelos y los procedimientos.
Los elementos que forman estos estándares son una serie de especificaciones y recomendaciones.,
Los marcos arquitectónicos, como las metodologías de modelado de los organismos, acostumbran
ordenar las diferentes perspectivas de una arquitectura en términos de vistas (views).
Una vista es un subconjunto resultante de practicar una selección o abstracción sobre una realidad,
desde un punto de vista determinado.
La estrategia de arquitectura de software utilizando vistas define, cuatro vistas principales,
ocasionalmente llamadas también arquitecturas: Negocios, Aplicación, Información y Tecnología.
La vista de aplicación es la que utiliza la arquitectura de software y está compuesta por los
siguientes elementos:
Descripciones de servicios automatizados: dan soporte a los procesos de negocios.
Descripciones de las interacciones e interdependencias (interfaces) de los sistemas
aplicativos de la organización.
Planes para el desarrollo de nuevas aplicaciones y la revisión de las antiguas, basados en los
objetivos de la empresa y la evolución de las plataformas tecnológicas.
La división de los diferentes escenarios que supeditan toda la arquitectura de software es la siguiente:
Arquitectura como etapa de ingeniería y diseño orientado a objetos.
Es un modelo estrechamente asociado al entorno de UML y Rational.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
La arquitectura se restringe a las fases iniciales y preliminares del proceso y concierne a los
niveles más elevados de abstracción, pero no está sistemáticamente ligada al requerimiento
que viene antes o a la composición del diseño que viene después.
Lo que sigue al momento arquitectónico es business as usual, y a cualquier configuración,
topología o morfología de las piezas del sistema se la llama arquitectura.
En este tipo, se reconoce el valor primordial de la abstracción y del ocultamiento de
información como concepto de encapsulación en clases y objetos.
Importa más la abundancia y el detalle de diagramas y técnicas disponibles que la 135
simplicidad de la visión de conjunto.
Cuando aquí se habla de estilos, se los confunde con patrones arquitectónicos o de diseño.
La definición de arquitectura que se promueve en esta corriente tiene que ver con aspectos
formales a la hora del desarrollo.
Esta arquitectura es isomorfa a la estructura de las piezas de código.
Arquitectura estructural, basada en un modelo estático de estilos, ADLs y vistas.
Utiliza el más alto nivel de abstracción, y además no tiene por qué coincidir con la
configuración explícita de las aplicaciones.
No se suelen encontrar referencias a los lenguajes de programación o piezas de código, y en
general, nadie habla de clases o de objetos.
Estructuralismo arquitectónico radical.
Utilizados dos tendencias, una que excluye la relevancia del modelado orientado a objetos
para la arquitectura de software y otra que procura definir nuevos metamodelos y
estereotipos de UML como correctivos de la situación.
Arquitectura basada en patrones.
Este tipo de arquitectura está claramente diferenciada de la tendencia a diagramas de UML.
Utiliza modelos de proceso tácticos.
El diseño consiste en identificar y articular patrones preexistentes, que se definen en forma
parecida a los estilos de arquitectura.
Arquitectura procesual.
Su función principal es establecer modelos de ciclo de vida y técnicas de requerimientos,
diseño, análisis, selección de alternativas, validación, comparación, estimación de calidad y
justificación económica específicas para la arquitectura de software.
La arquitectura de software debe cubrir una serie de requisitos mínimos para poder involucrar todo
un desarrollo de análisis:
Los individuos y las interacciones por encima de los procesos y las herramientas
El software que funciona por encima de la documentación exhaustiva
La colaboración con el cliente por encima de la negociación contractual
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
La respuesta al cambio por encima del seguimiento de un plan
Una de las herramientas más importantes y utilizadas para los desarrollos es el propio UML, que
permite crear diagramas de objetos y su interacción entre ellos.
En el campo del software, la arquitectura nos identifica los elementos más importantes de un
sistema así como sus relaciones, es decir, nos da una visión global del sistema.
Generalmente, las metodologías de desarrollo indican principios para identificar y diseñar una
arquitectura, aunque por ahora la ayuda real que ofrecen es muy limitada al basarse en principios 136
muy genéricos.
Las arquitecturas software no responden únicamente a requisitos estructurales, sino que están
relacionadas con aspectos de rendimiento, usabilidad, reutilización, restricciones económicas y
tecnológicas, e incluso cuestiones estéticas.
Actualmente existen muchas metodologías de desarrollo de software, desde métodos muy “pesados”
y burocráticos, métodos ajustables al proyecto y a las condiciones de desarrollo, hasta métodos
“ligeros” que surgen como respuesta a los excesos formales de otros métodos.
Evidentemente, partiendo de los principios de tantas y diversas metodologías es muy difícil sacar
una visión unificada sobre el diseño arquitectónico.
Es difícil encontrar elementos comunes entre tantos modelos de arquitectura, aunque existen una
serie de elementos o patrones que definen todas las estructuras.
El primero es la existencia de una fase en la que se establece o diseña una arquitectura base y el
segundo la altísima dependencia que definen entre los casos de uso y la arquitectura, definiendo un
caso de uso como una interacción (secuencia de acciones) típica entre el usuario y el sistema.
Desde un punto de vista arquitectónico, no todos los casos de uso tienen la misma importancia,
destacando aquellos que nos ayudan a mitigar los riesgos más importantes y sobre todo aquellos
que representan la funcionalidad básica del sistema a construir.
Esta arquitectura base estará especificada por diagramas que muestren subsistemas, interfaces
entre los mismos, diagramas de componentes, clases, descripciones diversas, y por el conjunto de
casos de uso básicos.
Este conjunto de especificaciones nos permiten validar la arquitectura con los clientes y los
desarrolladores, y asegurarnos que es adecuada para implementar la funcionalidad básica deseada.
A partir de aquí, lo normal sería desarrollar de forma iterativa el sistema hasta tenerlo
funcionalmente completo.
Una visión alternativa sería identificar el tipo de sistema que queremos construir.
Todos sabemos que no hay dos aplicaciones iguales, pero que existen claros paralelismos entre las
aplicaciones construidas para resolver problemas similares.
El fijarnos en aplicaciones del mismo tipo tiene muchas ventajas ya que nos ayuda a entender las
necesidades del cliente y las soluciones ya encontradas por otros.
Utilizar una metodología tradicional de desarrollo y arquitectura de software permite una serie de
características:
Centralizar los aspectos en parte del problema (el dominio del problema, sus requisitos y su
microestructura), obviando cuestiones como rendimiento, seguridad, protocolos de
comunicación, restricciones de hardware, software, y económicas, etc.
Proporciona una visión estrecha, ya que frecuentemente el cliente no expone adecuadamente
todos sus requisitos porque no los conoce.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Identificar el tipo de sistema a construir nos permite examinar la arquitectura de sistemas ya
construidos, comprender los requisitos a los que se enfrentan, y contrastarlos con nuestros clientes.
Si tenemos en cuenta que en cualquier tipo de sistema, existen necesidades similares, muchos de
los componentes que se usan en su desarrollo suelen ser los mismos (por ejemplo: Modelo Vista
Controlador, Bases de datos, , buscadores, carritos de la compra, gestores de contenidos, etc).
Las metodologías que gestionen de forma directa las cuestiones arquitectónicas y estructurales,
podrán producir no solo productos de mayor calidad, sino a un menor coste y en menos tiempo. 137
Esto se debe a que los riesgos arquitectónicos del proyecto son menores y están mucho mas
controlados, y que al poder integrar una visión orientada a componentes, las posibilidades de
reutilizar software ya desarrollado son mucho mayores, con las ventajas que ello implica.
Construir una arquitectura es una actividad donde desarrollar ideas nuevas basándose en la
experiencia acumulada en otros desarrollos estructurados, siendo casi siempre responsabilidad del
desarrollador crear un producto de calidad y, por tanto, conocer el tipo de sistema a construir.
Afortunadamente para esto último, los lenguajes de patrones nos pueden proporcionar una
inestimable ayuda.
Lenguajes de patrones
Los lenguajes de patrones se pueden definir de la siguiente forma: "La especificación de una serie
de elementos (patrones) y sus relaciones (patrones) de modo que nos permiten describir buenas
soluciones a los diferentes problemas que aparecen en un contexto específico".
El objetivo de los patrones de diseño es el de capturar buenas prácticas que nos permitan mejorar la
calidad del diseño de un sistema, determinando elementos que soporten roles útiles en dicho
contexto, encapsulando complejidad, y haciéndolo más flexible.
Por otro lado, con frecuencia se dice que la función define a la forma, es decir, que la estructura o la
arquitectura de cualquier sistema está muy relacionada con lo que dicho sistema tiene que hacer.
Esta es la razón por la que los sistemas con objetivos similares comparten también, una arquitectura
común, unos procesos bien definidos, y un conjunto de elementos similares (patrones de diseño).
Similar funcionalidad y servicio, similar estructura.
Cuando desarrollamos un sistema que se encuadra dentro de cierto tipo, es muy útil consultar
lenguajes de patrones que traten el dominio en el que estamos.
Un lenguaje de patrones nos sirve como referencia conceptual del dominio del problema, ya que
éstos parten como solución a un conjunto de casos de uso, e interacciones con actores específicos.
Además constituyen también un marco conceptual en el diseño de la arquitectura de nuestros
sistemas, ya que como la función define a la forma, sintetizan por lo general soluciones
arquitectónicas y estructurales bien probadas y muy útiles dentro del tipo de problemas que
modelan.
De alguna forma, los patrones nos permiten identificar y completar los casos de uso básicos
expuestos por el cliente, comprender la arquitectura del sistema a construir así como su
problemática, y buscar componentes ya desarrollados que cumplan con los requisitos del tipo de
sistema a construir, es decir nos permiten obtener, de una forma sencilla, la arquitectura base que
buscamos duran la fase de diseño arquitectónico.
Un lenguaje de patrones que modele un tipo de sistema debe de ser descrito incluyendo la siguiente
información:
Características básicas que lo definen y diferencian. Por ejemplo, un sistema web se
caracteriza por clientes ultra ligeros, o uso de protocolos sin estado, o centralización del
software de ejecución en servidores de tal forma que la aplicación es compartida por todos
los usuarios.
Definición de los actores principales que participan en dicho sistema así como sus casos de
uso básicos, descritos evidentemente de forma genérica.
Especificación de los principales componentes funcionales del sistema así como las relaciones
entre ellos.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Arquitectura lógica y flujos de información, que estructuran los diferentes subsistemas, el
intercambio de información de los mismos, etc. Por ejemplo, arquitecturas reflexivas,
modelo-vista-controlador, etc.
Arquitectura de componentes. Consiste en mapear los componentes funcionales en la
arquitectura lógica de la aplicación.
Arquitectura física. Especificación del despliegue de los componentes.
138
Estos lenguajes deberían, además, tener una visión orientada a la construcción de software y a
constituirse como elementos integrables en el proceso de desarrollo de las aplicaciones.
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.