TRES CAPAS CON Desarrollo de Aplicaciones en Tres Capas con VisualWorks Smalltalk y GemStone /S
TRES CAPAS CON
Desarrollo de Aplicaciones en Tres Capas con VisualWorks
Smalltalk y GemStone /S
Tres Capas con Smalltalk
Introducción al Diseño en Capas Características de las
Herramientas Conexión entre capas Persistencia de Objetos Ejemplo Práctico
Tres Capas
Breve introducción al diseño en capas
Tres Capas - Descripción
Presentación al Usuario Modelo del Negocio Persistencia de Datos
Tres Capas - Diagrama
Tres Capas - Presentación
Esta capa reúne todos los aspectos del software que tienen que ver con las interfaces y la interacción con los diferentes tipos de usuarios humanos
Tres Capas - Negocio
Esta capa reúne todos los aspectos del software que apoyan los procesos de negocio que llevan a cabo los usuarios
Tres Capas - Datos
Esta capa reúne todos los aspectos del software que tienen que ver con el manejo de los datos persistentes
Tres capas - Smalltalk
Características de las herramientas de desarrollo
Tres Capas – Smalltalk
Herramientas VisualWorks GemStone /S
Opciones Cliente Ventana, Cliente Web Servidor VW, Servidor GS Repositorio GS, RDBMS
VisualWorks
Multiplataforma (Windows – Linux – AIX – Solaris – MacOSX)
Completo Editor de Ventanas Soporte para aplicaciones Web (Web Services,
Smalltalk Server Pages, Servlets) Soporte a protocolos standard como FTP, POP,
SMTP, IMAP Seguridad (SSL) Soporte para CORBA y COM Soporte para mapeo Objeto – Relacional (Top Link –
GLORP) Código abierto
Gemstone /S Multiplataforma (Windows – Linux – AIX – Solaris –
MacOSX) Servidor de objetos multiusuario Soporte transaccional y control de concurrencia Soporte para consultas Soporta índices para procesar los objetos Soporte de conexión a repositorios de datos
externos (OODBMS – RDBMS) Administración de cuentas y seguridad Integración con VW a través de GemBuilder
Diagrama de Despliegue
Conexión entre Capas
Como realizar las conexiones entre las capas de presentación al
usuario y el servidor y entre el servidor y el repositorio de objetos
Conexión entre Capas
Estilo de Aplicación: Repositorio de Datos GemStone/S Servidor de Aplicaciones sobre
GemStone/S Cliente Ventana Smalltalk Cliente Web (servlets – ssp pages)
Herramientas Necesarias
Cargar las parcelas* GbsTools para poder conectarse a
GemStone (servidor-repositorio) WebToolKit (herramientas web) ContactsModel, ContactsUI y
ContactsWeb (el código fuente del ejemplo)
(*) Una parcela es un archivo externo que contiene un grupo de clases, objetos y dependencias
Conexión Cliente/Servidor/Repositorio Opción programática Definir los parámetros de conexión al
servidor Definir los parámetros de conexión al
repositorio| parameters |parameters := GbsSessionParameters
newWithGemStoneName: ‘!@localhost!gemserver61’username: ‘DataCurator’password: ‘swordfish’hostUsername: ''hostPassword: ''gemService: ‘!@localhost!gemnetobject’
*hostUsername y hostPassword son necesarios cuando el application server corre en un host diferente al del repositorio
Conexión Cliente/Servidor/Repositorio
Agregar conectores entre los objetos /clases del modelo y los objetos / clases persistentes
| connector |(connector := GbsClassConnector
stName: ‘ContactItem’gsName: ‘ContactItem’dictionaryName:‘ContactsClasses’).
parameters addConnector: connector
| connector |(connector := GbsClassVarConnector
stName: ‘ContactItems’gsName: ‘ContactItems’dictionaryName: ‘ContactsClasses’stvarName: ‘SoleInstance’gsvarName: ‘SoleInstance’) beForwarderOnConnect.
parameters addConnector: connector
Conexión Cliente/Servidor/Repositorio
Loguearse al repositorio de objetos
parameters loginRpc
Una vez hecho esto: Queda establecida la conexión entre el servidor de
aplicación y la base de datos Se replicó la clase ‘ContactItem’ Se conecto la variable de clase ‘SoleInstance’ de la clase
ContactItems entre la imagen servidor y la imagen cliente (todos los mensajes enviados a esta en el cliente se forwardean al servidor)
Conexión Cliente/Servidor/Repositorio Opción visual
Definir los parámetros de conexión
Conexión Cliente/Servidor/Repositorio
Agregar conectores entre los objetos /clases del modelo y los objetos / clases persistentes
Conexión Cliente/Servidor/Repositorio
Loguearse al repositorio de objetos
Para conectarse a equipos remotos debe utilizarse la opción Login Rpc
Una vez hecho esto el resultado obtenido es el mismo que al realizarlo programáticamente
Conexión Cliente Web
Como realizar la conexión entre el cliente web y el
servidor web
Servicios Web
Definir un servidor (Smalltalk HTTP Server) Crear el/los servlets necesarios Escribir las páginas dinámicas (Smalltalk
Server Pages –ssp-) que hagan falta Configurar el sitio web
Web – Crear servidor Desde la consola de server se crea y
configura un Smalltalk HTTP Server
Web - Servlets
Un servlet es una clase que es invocada desde una página web (puede ser html, ssp, jsp o asp)
Debe ser subclase de HttpServlet Protocolo: doPost, doGet,
doPost:response: y doGet:response:
<form action="servlet/ServletVerify" method="post" name="loginForm">
Web – Smalltalk Server Pages
Son páginas web que contienen código smalltalk embebido en el código html
El código smalltalk se ejecuta en el servidor<tr> <td colspan=2 align=center> <% msg := request anyParameterValueAt: 'msg'. msg notNil ifTrue: [ response write: '<p align="center" class="redbutton">'; write: msg; write: '</p>']. %> </td></tr
Web – Configuración del sitio
En el directorio $(VISUALWORK)/web debe existir un archivo de configuración (.ini) para el sitio[configuration contacts-site.ini]
#Note: Configuration parameters are case sensitive.#Configuration file of contacts site
directory = $(VISUALWORKS)/web/contactsenviroment = Smalltalkdescription = The contacts development sitehome = logon.ssp
Este se tiene que referenciar desde webtools.ini
contacts = contacts-site.ini
*contacts es el nombre del sitio web
Web – Configuración del sitio
Una vez creado y levantado el web server, escribiendo http://localhost:8008 en el browser podemos ver la herramienta de configuración de VisualWorks Web Toolkit
Si esta todo bien, en la parte inferior se va a encontrar el site contacts (configurado anteriormente)
Se puede acceder a los detalles del sitio para ver y/o modificar su configuración
Persistencia de Objetos
Como persistir los cambios realizados a los objetos del
negocio
Persistencia de Objetos
Al loguearse a GS se replican en el cliente (ambiente VW) los objetos persistidos en el repositorio
Persistencia de Objetos Luego de modificar algún objeto del
modelo, ese cambio debe persistirse en la base de datos
La manera de persistir / actualizar un objeto en la base de datos es la siguiente: enviándole el mensaje markDirty al objeto, lo
marcamos como que fue modificado y que este cambio debe verse reflejado en la base
al ejecutar el commit de la transacción es cuando se aplica el cambio
Persistencia de Objetos
El objeto es modificado en el contexto del cliente
Persistencia de Objetos El objeto modificado se marca como
sucio enviándole el mensaje markDirty
Persistencia de Objetos Al comitear la transacción se actualizan
todos lo objetos marcados como sucios
Persistencia de cambios
Ejemplo
aContactItemfirstName: firstName;lastName: lastName;homePhone: homePhone;workPhone: workPhone;email: email;markDirty
aGbsSession commit
Ejemplo Práctico
Desarrollo de un ejemplo práctico utilizando las
herramientas descriptas
Ejemplo - Definición
El ejemplo propuesto consiste en una agenda de contactos donde: Un usuario puede:
Agregar usuarios Agregar, modificar o eliminar contactos
Estructura de Aplicación
Ejemplo - Diagrama de Clases
+addProfileFor:()+allUserProfiles()+getOrAddProfileFor:()+inGemStone()+locateProfileFor:()+new()+changed:with:()+inGemStone()+initialize()
-user-contactItems
ContactBookUserProfile
+abort()+addConnectorsTo:()+commit()+createContactUserNamed:password:()+isLoggedIn()+loginIntoGemstone()+logout()+newClassConnectorFrom:to:()+newClassVarConnectorFrom:to:fromVariable:toVariable:()+newSessionParameters()+userContactData()+username()+users()
-session-userContactData-user
ContactBookSessionManager
+changed:with:()+defaultDisplayString()+displayFields()+displayString()+printOn:()
-user-firstName-lastName-homePhone-workPhone-email
ContactItem
+soleInstance()
ContactItems
+named:password:()+printOn:()
-username-password
ContactUser
+soleInstance()
ContactUsers
0..*
10..1
1
1
0..*
1
1
1
0..*1
0..*
Ejemplo – Diagrama de Tres Capas
ContactBookUserProfile
ContactBookSessionManager
ContactItem ContactItems
ContactUser
ContactUsers
ServletAdd ServletMainServletModify ServletVerify
«interfaz»logon.ssp
«interfaz»LoginView
«interfaz»ContactsBrowserWindow
«interfaz»ContactItemEditView
«interfaz»main.ssp
«interfaz»details.ssp
«interfaz»new.ssp
ContactBookUserProfileContactItem
ContactItems ContactUser
ContactUsers
Presentación
Negocio
Datos
Ejemplo – Diagrama de Componentes
PC Win Client
Application Server
Repository Server
Contacts List Window
Contacts Server
Contacts Repository
RPC/TCP
Session
GS Connector
RPC / TCP
Client Session
PC Web Client
web browser
HTTP
Servlet
Preguntas
Consejo Si algo se pone muy complicado de
seguro estamos haciendo algo mal, tomarse cinco minutos y repensar las cosas
Aplicar la filosofía K.I.S.S.
Keep It Simply Stupid