Document

Anuncio
Casa Abierta al Tiempo
UNIVERSIDAD AUTÓNOMA METROPOLITANA
UNIDAD IZTAPALAPA
División de Ciencia:; Básicas e Ingeniería
Departarnenfo de Ingeniería Eléctrica
Educación a Distancia
Reporte de Proyecto de Investigación I y I1
Tesis que presenta el alumno(a)
Cruz Norielga Alejandro
9627 7006
Para obtener el grado de :
__--
M. en I. David Uzziel López lllescas
Marzo 2007.
1
I ~ >
TABLA DE CONTENIDO.
225899 1
1. E D U C A C I ~ NA DISTANCIA .................................
OBJETIVOS
DEL
SKiWviA
2
2.
.......................................................................
2.1 Objetivos generales del proyecto. .......................................................
2
2.2 Objetivos específicos del proyecto..................................................... 2
3. MARCO TEÓRICO ...................................................................................... 3
3.1 Técnicas utilizadas en el desarrollo del proyecto................................. 3
3.1 .IAnálisis y diseño orientado a objetos. ........................................ 3
.IAnalisis de requerimientos.............................................. 4
3.1 .I
3.1.A .2 Ejemplo de Use Case. .................................................... 5
3.1 .,I.3 Diseñ0.L......................................................................... 7
3.1 .I
.4 Construcción .................................................................... 7
3.1.2 UM.................................................................................................. 8
3.1.3 Rational Rose. .............................................................................. 9
3.1.4 De programación en Java ............................................................ 9
3.1.5 De Programación
en HTML........................................................... 11
3.1.6 De Programación de Bases de Datos .......................................... 11
4. DESARROLLO PRACTICO (PRIMER PROTOTIPO)................................ 12
4.1 Modelo de requerimientos a nivel gerieral. ............................................. 12
4.2 Para cada Use Case del nivel general ....................................................12
15
4.2.1 Modelo de Requerimientos. ...........................................................
4.2.1 .IModelo de casos. ................................................................ 15
4.2.1.2 Modelo de lnterfaz............................................................... 15
4.2.1.3 Modelo del dominio del voblema ...................................... 15
4.2.2 Modelo de análisis........................................................................... 15
4.2.2.1 Escenarios explorados. ..................................................... 15
4.2.3 Modelo de diseño (Diagramas (le Secuencia)......................... 4 7
4.2.3.1 Escenarios explorados. (ver anexo 3).........................
47
.,
63
4.2.4 Modelo de construction..................................................................
4.2.4.1 Introducción................................................................... 63
5. DESARROLLO PRACTICO (SEGUNDO PROTOTIPO) ........................ I00
5.1 Modelo de Requerimientos a nivel general. .............................................1O0
5.2 Modelo de requerimientos para cada Use Case......................................IO 0
5.2.1 Use Case Valida Maestro ...............................................................1O0
5.2.2 Use Case Maestro Da Clases. .......................................................104
5.2.2.1 Use Case Maestro Pregunta.............................................104
.
5.2.2.2 Use Case Maestro Responde Pregunta............................107
Io9
5.2.3 Use Case Valida Ahmno .................................................................
5.2.4 Use Case Ahmno Torna C h X .......................................................112
5.2.4.1 use Case Ahmno Pre!iunta ...............................................113
114
5.2.4.2 Use Case Alumno Responde Pregunta............................
5.3 Modelo de Análisis para cada Use Case..................................................116
5.4 Modelo de diseño.^. .................................................................................120
.,
123
5.4.1 Modelo de Implantation.-.................................................................
6. DESARROLLO PRACTICO(TERCER PROTOTIPO)
6.1 Modelo de Requerimientos a nivel cieneral ..........................................125
6.2 Modelo de requerimientos para cada Use Case....................................125
6.2.1 Use Case Avisos Profesor..............................................................127
6.2.1 Modelo de Requerimientos.................................................... 127
6.2.1.IModelo de Casos................................................................. 128
2
6.2.1.2 Modelo de lnterfaz .................................................................129
6.2.1.3 Modelo del dominio del problema........................................132
6.2.2 Modelo de análisis. .......................................................................133
6.2.2.1 Escenarios explorados .........................................................
134
6.2.3 Modelo de diseño (Diagramas de Secuencia) ........................
I34
6.2.3.1 Diagrama de Colaboracion..................................................133
6.2.3.1 Diagrama de Secuencia.......................................................
134
6.2.3 Codigo Fuente. ..................................................................................... 134
6.2.3 Use Case Consulta Aviso. ....................................................................... 144
6.2.1 Modelo de Requerimientos....................................................145
145
6.2.1.IModelo de casos........................................................
6.2.1.2 Modelo de Interfaiz..................................................... 146
6.2.1.3 Modelo del domiriio del problema ............................148
6.2.2 Modelo de análisis ..............................................................................149
6.2.2.1 Escenarios explorados .........................................................149
6.2.3 Modelo de diseño (Diagramas de Secuencia) ......................... I 4 9
6.2.3.1 Diagrama de Colaboracion..................................................150
6.2.3.1 Diagrama de Secuencia ......................................................151
6.2.3 Codigo Fuente....................................................................................152
167
6.2.4 Use Case Enviar Archivo ........................................................................
6.2.1 Modelo de Requerimientos...................................................167
.
6.2.1.IModelo de Casos. ......................................................167
6.2.1.2 Modelo de Interfeiz.....................................................168
6.2.1.3 Modelo del dominio del problema-..........................168
.
6.2.2 Modelo de análisis..............................................................................168
6.2.2.1 Escenarios explorados .........................................................169
6.2.3 Modelo de diseño (Diagramas de Secuencia). ..............................169
6.2.3.1 Diagrama de Colaboracion..................................................169
6.2.3.1 Diagrama de Secuencia.......................................................
170
171
6.2.5 Use Case Descargar Archivo ..................................................................
6.2.1 Modelo de Requerimientos.................................................... 171
171
1 Modelo de Casos........................................................
6.2. I.
6.2.1.2 Modelo de Interfaz.....................................................172
6.2.1.3 Modelo del dominio del problema ............................172
6.2.2 Modelo de análisis .............................................................................. 173
6.2.2.1 Escenarios explorados. .......................................................173
6.2.3 Modelo de diseño (Diagramas (le Secuencia) .......................... 174
6.2.3.1 Diagrama de Colaboracion..................................................174
6.2.3.1 Diagrama de Secuencia ......................................................174
176
6.2.4 Use Case Registro.......................................................................................
6.2.1 Modelo de Requerimientos...................................................176
.
6.2.1 .IModelo de casos ........................................................ 176
6.2.1.2 Modelo de Interfciz............................................... 1.77
6.2.1.3 Modelo del dominio del problema ...........................178
.
179
6.2.2 Modelo de análisis.............................................................................
6.2.2.1 Escenarios explorados. ................................................
1.79
6.2.3 Modelo de diseño (Diagramas de Secuencia) .......................... 1.80
6.2.3.1 Diagrama de Colaborac;ion.~
180
................................................
3
180
.......
6.2.4 Use Case Consulta ...................................................................................... 182
6.2.1 Modelo de Requerimientos....................................................182
6.2.1 .IModelo de casos........................................................182
6.2.1.2 Modelo de Interfaz.....................................................
182
6.2.1.3 Modelo del domiriio del problema............................185
185
6.2.2 Modelo de análisis..............................................................................
6.2.2.1 Escenarios explorados.........................................................185
6.2.3 Modelo de diseño (Diagramas de Secuencia).......................... 1-86
6.2.3.1 Diagrama de Colaboracion~
.................................................186
186
6.2.3.1 Diagrama de Secuencia.......................................................
6. CONCLUSlONES .......................................................................................
7. B l B L n x A F í A
.........................................................................................
4
187
.......
189
........
1.EDUCACION A DISTANCIA.
Este proyecto surgió con el fin de poder dar cursos o clases de Posgrado vía
Internet en el área d~ Ciencias Sociales y Humanidades de la Universidad Autónoma
Metropolitana Iztapalapa. Esta idea fue propuesta por la division de Ciencias Sociales y
Humanidades en conjunto con el Laboratorio de Ingenieria de Software (LIS) area de
proyectos de software.
Este proyecto nace para facilitar la difusión de clases o cursos de Posgrado, dar
información en la red de dichas clases o cursos, además para tener la opción de poder
tomar una clase fuera de las aulas, así como poder tomar el curso desde cualquier lugar
en el que se cuente con Internet.
Es necesario destacar que dicho proyecto se creo como ya mencionamos para
impartir clases del área de Ciencias Sociales pero se puede ampliar a otras areas.
Sobre el documento:
El siguiente documento muestra; algunas técnicas utilizadas para la elaboración
del proyecto, como lo es el Análisis y Diseño Orientado a Objetos, UML, además de la
programación que se realizo en Java, así como referencias a libros o páginas utilizadas.
También se hace mención en aquellas cosas que no se toman en cuenta en los
manuales y se llegan a descubrir cuando se programa. Así como problemas con los que
se encuentra el programador en la práctica.
5
2. OBJETIVOS DEL SISTEMA.
Objetivos Generales:
.
.
Elaborar una aplicación Cliente-Servidor vía Internet donde los maestros puedan dar
clases desde su máquina, y los alumnos se puedan conectar a esta.
Las clases se darán a través del envío y recepción de texto.
así como el envió y la recepción de imágenes.
Recepción de preguntas por parte de los alumnos al profesor.
El maestro podrá enviar texto.
El alumno podrá enviar texto.
Objetivos Específicos:
O
O
La aplicación debe ser amigable
La programación será en Java, haciendo uso de applets y servlets.
Se crearan hojas en HTML, para presentarlas en la RED.
Cada alumno tendrá una clave de acceso para dicha clase.
Los alumnos podrán enviar preguntas a los maestros.
No existirá la comunicación entre los alumnos, únicamente por medio del profesor.
El maestro podrá abrir archivos que podrá enviar a los alumnos tanto a la pantalla de
exposición como a páginas HTML ya previamente establecidas para éstos fines.
El maestro puede enviar preguntas o comentarios a los alumnos.
El maestro podrá ver que alumnos estén conectados, así como las preguntas que le
envíen.
6
3. MARCO TEÓRICO
A continuación se citan las técnicas utilizadas para el desarrollo del proyecto. Así como
sus puntos finos en la construcción, de la cual se hace un énfasis especial en el análisis y
diseño orientado a objetos porque ha sido la base de todo el desarrollo del proyecto.
3.1 Técnicas utilizadas en el desarrollo dlel proyecto.
Las principales técnicas utilizadas para el desarrollo del proyecto, son en la
Ingeniería de Software el análisis de riesgo:;, el análisis y el diseño orientado a objetos, el
desarrollo por prototipos, estrategias para tratar el riesgo, la codificación y las pruebas.
-
3.1.1 Análisis y diseño orientado a objetos.
El proyecto se desarrolló sobre la base de una metodología de Análisis y Diseño
Orientada a Objetos, que tiene como meta el desarrollo de prototipos incrementales, es
decir, partiendo de un prototipo O con solamente unas cuantas funciones básicas, se van
generando prototipos subsecuentes con mayor funcionalidad, cada uno de los cuales es
alimentado por el anterior. El desarrollo incremental por prototipos minimiza el riesgo de
entregar un producto con errores en todos sentidos, pues cada uno de ellos
paulatinamente incrementa la utilidad del sistema y permite la revisión por parte de los
usuarios desde etapas tempranas. Así, el cliente retroalimenta el desarrollo participando
activamente como un aliado y no como un (enemigoa vencer.
El análisis y diseño orientado a objetos se divide en varias etapas, cada una con
entregables bien específicos que alimentan a la etapa siguiente. Estas etapas son:
Etapa
Entregable
1.- Levantamiento de Requerimientos.
IVodelo de requerimientos.
Modelo de Casos(USE CASE).
Modelo de Interíaz:
Pantallas principales.
Diagramas de transición de estados.
Modelo de dominio del
problema.
2. - Análisis.
IModelo de Análisis.
3. - Diseño.
Modelo de Diseño.
4. - Construcción.
Modelo de Construcción.
7
Cada uno de los prototipos se desarrolla siguiendo estas etapas en estricto orden,
puesto que cada una alimenta a la siguiente. Por lo tanto, cada uno de los prototipos es
un micro-desarrollo, como se muestra en la figl.
Prototipo 1
1
Requerimientos
Prototipo 2
+
1
1
Requerimientos
Analisis
1
Construcción
Requerimientos
1
1
Diseño
Prototipo n
Diseño
1
konstrucción
Diseño
Construcción
.....
3.1 .I.IAnálisis de Requerimientos.
Esta etapa se encarga de levantar los requerimientos y especificaciones de los
usuarios, de modo que queden lo suficientemente claros para evitar errores en las etapas
posteriores. Esta parte es crucial porque los requerimientos obtenidos alimentarán todo
el desarrollo posterior, y entonces se debe garantizar que lo que el usuario desea sea lo
que el desarrollador entiende, con Io que se tiene una base confiable. Aparte de estas
importantes implicaciones, el levantamiento de requerimientos sirve para que el equipo de
desarrollo vaya adquiriendo un conocimiento aceptable del entorno sobre el que va a
trabajar, pues son especialistas en desarrollar sistemas, no en la materia sobre la cual va
a desarrollar. El aprendizaje del entorno permite la elaboración de un producto mas
eficiente y libre de errores, pues así desarrolla una solución de un problema que conoce
(o que va conociendo). Todo este conocimiento lo absorbe de usuarios clave, que
conocen lo más perfectamente posible el problema. El entregable aquí es el modelo de
requerimientos, que se constituye a su vez de tres modelos:
0
0
0
Modelo de Casos
Modelo de lnterfaz
Modelo del Dominio del Problema
El Modelo de Casos extrae el conocimiento funcional fundamental del problema
de una forma estructurada y progresiva, siendo la base para establecer la estructura del
sistema. Este modelo orienta todos los demás procesos del método. Para plasmar
exactamente lo que hace un sistema, se necesita definir las transacciones principales que
lo componen, como se comunican y el orden que siguen para describir su funcionalidad.
8
3.1 .I
.2 Ejemplo de Use Case.
Un USE CASE es precisamente una descripción de una transacción, donde no
sólo exhibe lo que hace, sino también incluye una serie estructurada de pasos para
realizarla y los entes que interactuan con él o Actores. Cada USE CASE se trata por
separado como un objeto.
El sistema completo puede constar de una infinidad de transacciones, pero se
ordenaran con una jerarquía de herencia, en la que cada nivel hará uso o derivara a su
vez otras transacciones o USE CASES hasta describir la totalidad, siempre tratando de
guardar la proporción de 5-9 o f 7 objetos #encada nivel para asegurar la percepciÓn(una
cantidad mayor será difícil de entender, uria cantidad menor podría ser incluida en otro
nivel).
Ejemplo de USE CASE.
Sobre el Modelo de lnferfaz establece el vínculo visual entre el desarrollador y el
usuario para concretar aspectos de la interacción que el sistema pudiese tener con su
entorno externo, permitiendo la retroalimeiitación temprana de aspectos fundamentales
para el conocimiento de la aplicación. Consta de las pantallas principales que se utilizarán
al desarrollar una transacción y su correspondiente Diagrama de transición de estados.
Sobre el Modelo del Dominio del Problema se establecerán los principales objetos
que constituirán al sistema y las relaciones que tienen entre sí. Los objetos persistentes
almacenarán información, es decir, la base de datos real, que después se tendrá que
pasar irremediablemente a un modelo relaciona1 y no orientado a objetos; por lo que las
relaciones obtenidas aquí serán muy Útiles.
Orden de Compra
Articulo
gCeArtic @
DescAriic
@PrecioAriic
QExistenciasAriic
~
~
S e utiiiza en
O '
+FechaOC @
+FolioOC Q
rticulosoc
8antidadesOC
~
~
,
-
-~
1
1'
Conesponde
./
S e ufdna en
,o*
9
101
Ejemplo de Modelo de dominio del problema
El proceso completo de levantamiento de requerimientos se desarrolla de la
sigu¡ente manera:
Inicialmente se entrevista a los usuarios principales o con poder de decisión de la
empresa y se les pide que definan las transacciones principales que definen al sistema,
se tratarán de acotar a solamente aquellas de las cuales no se pueda prescindir y sobre
las que se enfocará el mayor esfuerzo. Después se convendrá una cita con los usuarios
más expertos en las transacciones principales para que describa los pasos a realizar para
llevarlas a cabo. Se desarrolla un modelo inicial con el o los USE CASE que se
obtuvieron, pantallas iniciales y demás componentes. En citas posteriores se propondrán
estas pantallas y descripciones al usuario y se refinarán con las observaciones que haga.
Esta etapa termina cuando loscambios que se hagan al modelo sean mínimos.
Es importante recalcar que el prcicedimiento más pesado de levantamiento de
requerimientos como se indica anteriormente, y el análisis y diseño se hace al principio
del proyecto. En los prototipos subsecuentes se realiza también estas etapas para añadir
nuevas transacciones y modificar las existentes, pero el trabajo ya no es tan completo.
Sobre el Análisis aquí se dan las relaciones que existen entre los diversos objetos
encontrados y se diseñan nuevos que puedan ayudar a la tarea específica de cada uno.
AI final se tendrá una descripción detallada del comportamiento y comunicación que existe
entre los diversos objetos que realizan una transacción. Para entender mejor estas
relaciones se construyen escenarios, que son instanciaciones de una transacción, es
decir, descripción de los pasos necesarios y los valores reales que se obtienen o se
transmiten. Este escenario es referente a un comportamiento perfecto, y los errores y
excepciones se toman en cuenta hasta que un escenario es perfectamente interpretado.
Aquí es importante recalcar la utilidad del inodelo de tres capas. En dicho modelo todos
los objetos que interactuan en una transacción se dividen en tres grupos de acuerdo a su
funcionalidad: los objetos de interfaz que solamente se encargan de capturar o exhibir
información, los objetos de negocio que rnanejan la lógica para manipular y procesar
datos, ya sea para entregarlos a un objeto de interfaz o para obtenerlos de un objeto de
datos, cuya única función es servir como un mensajero eficiente hacia o desde la base de
datos permanente. AI separar los objetos en estos tipos su ordenamiento es adecuado y
el mantenimiento es más sencillo.
El producto principal de este proceso es el diagrama de colaboración, que
describe todos los objetos en juego para (cada transacción, las llamadas que reciben y
hacen hacia otros objetos con sus pariimetros respectivos(con sus tipos de datos
recibidos y a retornar).
10
El diagrama de colaboración debe ser lo suficientemente detallado para entender
estas relaciones.
4 SuifidoOC
1 GetOCPendientes(cLis1aOC)
->
3 SelecOC
>
ListaCiCPendkntes
<
PantallaLzaOC c 1
Pordenescompra
I
ozrdenCompT
c dencompra
~~
Almacenisla
5 Show(0CSelaccionada)
V
6 GeneraAE
~
'
A
7 CreaAE(OCBelecci0nada)
V
Datos
-
1 oAwsoEntrada
--
avisoentrada
--S
~
2 GetData(QuerylD Parámetms DatosLetdas)
1 0 WriteData(QuerylD Parámelms Datos-a-escnbir)
OV
I o A d Im n
_____---
-+
D
_________
WrleC ata(QuevlD Parámelms Datos-a-escnbTr)
-
~~
->
~
, ~ A i f i c ~ I o!
1
11 AcluaiiraInventano(tinteger. tlnleger, iliiteger. ifechd)
'
1
1
-A
~
12 GeIDala(QueiylD, Parámetms. DatosLeidos)
+
writeData(QueviD'Para~e'ros~Da'os-a-escnb'r)
Ejemplo de Diagrama de Colaboración.
3.1.I
.3 Diseño.
Prácticamente es una extensión all análisis con la adición de que contempla
aspectos de implantación, es decir, toma en cuenta las características especiales de la
plataforma en que va a utilizarse para decidir que tipo de datos se utilizara, el tipo de
estructuras de almacenamiento mas ade'cuadas y demás detalles característicos. El
entregable es el diagrama de secuencia, que es una interpretación gráfica exacta y en
orden estricto de todas las llamadas que liacen y reciben los objetos que realizan una
transacción. Aquí todos los métodos de los distintos objetos tienen ya bien especificados
sus tipos de datos en base a una plataforma dada. Estos diagramas son la especificación
completa a seguir para desarrollar el producto y tiene que ser lo mas clara y precisa
posible para que el programador la siga al pie de la letra.
3.1.I
.4 Construcción.
Es ya la elaboración del producto. Culmina todos los esfuerzos con un prototipo
funcional que sigue las especificaciones de todas las etapas anteriores, listo para
probarse y modificarse alimentando un prototipo subsecuente. Para un buen entregable
habrá que colocar comentarios amplios eri el código donde hagan falta para facilitar el
mantenimiento y tener un producto legible.
Cabe hacer notar que el proceso de pruebas se encuentra inmerso en todas las
etapas anteriores y por eso no se le considera una más. AI realizar el levantamiento de
11
requerimientos en un principio los cambios son extensos por las observaciones y
modificaciones propuestas por el usuario, tendiendo a estabilizarse, con lo cual el
procedimiento de prueba se encuentra inrrierso en el trabajo. Cuando los cambios son
mínimos entonces el usuario ya ha dado de forma implícita una prueba y una aceptación,
dando luz verde para el arranque de las demás etapas, alimentadas ya con
requerimientos sólidos. AI desarrollar las demás etapas de análisis y diseño y explotar una
transacción dada, al sobresalir algunas rectificaciones para integrar, al realizar pruebas
de escritorio y resolver dudas de los programadores acerca de especificaciones, diseños y
aspectos relacionados, se están realizando pruebas. AI entregar un prototipo para revisión
la entrega misma es una prueba, con la ventaja de que se hace en etapas muy tempranas
del desarrollo, permitiendo verificar y corregir a tiempo. En suma, durante todo el
desarrollo se hacen pruebas, tomando cclmo un hecho que una etapa alimenta a la
siguiente con entregables sin errores en la medida de lo posible, y que además con esta
metodología es sencillo corregir un fallo, pues nunca serán errores trascendentales.
Todas estas etapas son repetidas eri el desarrollo de cada prototipo, que a su vez
alimentara a uno posterior hasta que el nivel de errores y cambios sea bajo y se haya
logrado atacar con eficacia las transacciones mas importantes.
3.1.2.- UML
Para seguir una metodología orien’tada a objetos es indispensable un lenguaje
standard bien establecido que permita modelar las ideas de una manera correcta y que
permita su traslado a código sin errores. Para plasmar toda la información en cuanto a
levantamiento de requerimientos, análisis y diseño se utilizo el lenguaje unificado de
modelado o UML, que a ultimas fechas SE! ha convertido en un estándar en el área de
análisis y diseño orientado a objetos. Los sencillos ejemplos mostrados en la sección
anterior de diagramas de estados, colaboración y secuencia han sido elaborados con
base en este lenguaje. AI ser un lenguaje estándar nos da un punto de partida ideal para
que cualquier gente que tenga nociones de el entienda nuestras ideas y su contexto,
transformándose en un medio de comunicación efectivo, sin tener que extenderse
demasiado en explicaciones, ejemplos, etc. Algunos elementos más importantes del
lenguaje son los sigs. :
G?
Actor
Autotransicion
O
(DJntcio
USE CASE
Transicion
~-
\
/’
Generalizacion
A w c i aci on
Agrega ci on
,
12
I
-9
-+
Estado
Liga hacia si mismo
1
NewClass 5
f \
-~
~~~
I: Liga o mensaje
NewClas~6
E
3
I
Clase
[
j
Asociacion
Objeto
3.1.3.- Rational Rose.
Para poder diseñar en base a un lenguaje se necesita una herramienta que facilite
el trabajo. La que mejor se adapto a las niecesidades y disposición que se tenia para el
presente trabajo fue Rational Rose, una herramienta CASE que proporciona una interíaz
gráfica para el modelado. Con ella se tiene una buena administración de los proyectos
porque permite el desarrollo de prototipos iricrementales y su uso es bastante sencillo. En
el caso del proyecto el trabajo se dividió en partes que pudieran desarrollarse
paralelamente, se analizo el resultado de cada una y al final se unieron en un proyecto
principal. Cada cambio que se le hacia al diseño era efectuado en el proyecto de rose
principal de manera que todo mundo los apreciara y pudiera modificarlo avisando desde
luego de dichos cambios.
3.1.4.- Técnicas de programación en Jawa.
Como el proyecto esta basado en el uso de Internet el lenguaje ideal es Java. Este
lenguaje es multiplataforma y el acceso a través de Internet tiene como Único requisito el
uso de un browser compatible con Java. Las ventajas son evidentes y se citan a
continuación:
1. - Java es multiplataforma. Puede un mismo programa correr en diferentes
maquinas sin compilar y modificar nuevamente.
13
2. - AI utilizarse paginas HTML dinámicas o Applets el código reside realmente en
la maquina servidor(gateway) y es transpori:ado e interpretado en la maquina cliente, así
que para realizar modificaciones y mantenimiento se trabajará Únicamente sobre el código
que esta disponible en el servidor y no en toidas las maquinas cliente.
3. - La programación del lado servidor en Java es sencilla y eficiente, ya que a
diferencia de guiones CGI los servlets o clases especializadas en proporcionar servicios
HTTP permanecen residentes en memoria. pueden mantener conexiones costosas con
bases de datos y su programación no es tan laboriosa. Por otro lado, el uso de JDBC o
conexión abierta con bases de datos, permiite que su uso sea flexible a este respecto y
tenga fácil mantenimiento. JDBC (Java DataBase Connectivity) es un API de Java que
permite al programador ejecutar instrucciones en lenguaje estándar de acceso a Bases de
Datos, SQL (Structured Query Language, lenguaje estructurado de consultas), que es un
lenguaje de muy alto nivel que permite crear,
examinar, manipular y gestionar
Bases de Datos relacionales. Para que un8 aplicación pueda hacer operaciones en una
Base de Datos, ha de tener una conexión con ella, que se establece a través de un driver,
que convierte el lenguaje de alto nivel a sentencias de Base de Datos. Es decir, las tres
acciones principales que realizará JDBC son las de establecer la conexión a una base de
datos, ya sea remota o no; enviar sentencias SQL a esa base de datos y, en tercer lugar,
procesar los resultados obtenidos de la base de datos.
4. - Como es un lenguaje 100% orientado a objetos, es el lenguaje más idóneo
para un análisis y diseño correcto orientado a objetos.
5. - Como las clases predefinidas que posee tienen una alta orientación al uso de
Internet, mucho del trabajo de bajo nivel y más complicado ya se encuentra resuelto y
probado, con lo que se ahorra mucho tiempo en programación.
6.- El parecido con el lenguaje C es sorprendente, con lo que se facilita mucho el
aprendizaje.
Java es el primer lenguaje que tiene la virtud de ser compilado e interpretado de
forma simultánea. Cuando un programador realiza una aplicación o un applet en Java y lo
compila, en realidad, el compilador no trabaja como un compilador de un lenguaje al uso.
El compilador Java únicamente genera el denominado Bytecode. Este código es un
código intermedio entre el lenguaje máquina del procesador y Java. Evidentemente este
código no es ejecutable por sí mismo eri ninguna plataforma hardware, pues no se
corresponde con el lenguaje de ninguno de los procesadores que actualmente se conocen
(habrá que esperar a ver qué ocurre cor1 los procesadores Java). Por lo tanto, para
ejecutar una aplicación Java es necesario disponer de un mecanismo que permita
ejecutar el ByteCode. Este mecanismo es la denominada Máquina Virtual Java. En cada
plataforma (Unix, Linux, Windows 95/NT,Macintosh, etc.) existe una máquina virtual
específica. Así que cuando el ByteCode llega a la máquina virtual, ésta lo interpreta
pasándolo a código máquina del procesador donde se esté trabajando, y ejecutando las
instrucciones en lenguaje máquina que se deriven de la aplicación Java. De este modo,
cuando el mismo ByteCode llega a diferentes plataformas, éste se ejecutará de forma
correcta, pues en c a d i una de esas plataformas existirá la máquina virtual adecuada. Con
este mecanismo se consigue la famosa multiplataforma de Java, que con sólo codificar
una vez, podemos ejecutar en varias plataformas. En realidad la máquina virtual
desempeña otras funciones, como la de aislar los programas Java al entorno de la
máquina virtual, consiguiendo una gran seguridad.
Como herramienta se utiliza JBuilder 2.0, que es una herramienta RAD eficiente
hasta cierto punto. Las máquinas utilizadas para el desarrollo son potentes y no tienen
14
problema, pero cuando se intenta utilizar en maquinas mas sencillas, los recursos que
consume son importantes.
En el principio del proyecto se intento realizar la conexión entre cliente y servidor
mediante métodos remotos (RMI) inmersos en un applet cliente y un servidor. Este
método no funcionó, pues generó muchas restricciones en cuanto a seguridad. Los
navegadores o browsers no permiten tan fácilmente una conexión de este estilo y si
existen firewall y proxys entre las conexiones la comunicación es muy difícil. Por todo lo
anterior se decidió cambiar a servlets, con lo cual la comunicación se realiza de forma
conveniente y muy fácil.
3.1 S.-Técnicas de programación en HTMIL
Para que cualquier persona tenga un acceso fácil a la clase virtual así como
información relativa con los cursos de la Uiiiversidad y acceso a información detallada y
de uso gral., el recurso más sencillo es el uso de paginas HTML. Como un único requisito
el usuario debe tener un navegador como Internet Explorer o Netscape. AI utilizar Java del
lado servidor las mismas paginas pueden ser generadas de forma dinámica lo que hace
muy rico su contenido y posibilidades. Lals versiones actuales de HTML(Lenguaje de
Marcas para HiperTexto) proporcionan la posibilidad de cargar imágenes animadas, crear
ligas, botones con acciones predefinidas en un script (por ejemplo JavaScript) y otras
posibilidades sin la necesidad de contar coin una máquina virtual como en el caso de los
applets, con lo que su uso es mucho más eficiente ai no necesitar demasiados recursos y
cargase de manera rápida. Sin embargo, como no almacenan información a través del
tiempo ni tienen la capacidad de desplegar ventanas independientes (para un aviso por
ejemplo) su uso se restringió al papel de interfaz donde fue posible.
Las técnicas de programación del lenguaje de HTML es relativamente sencillo, ya
que no necesariamente se debe de hacer la construcción paso a paso, si no que es
realmente con interfaces que facilitan el trabajo como los son el FrontPage u otros, estos
mismos generan instantaneamente el código y las lineas como para ligar algunas paginas
son relativamente sencillas.
3.1.6.-Tecnicas utilizadas en Bases de Datos
(Access e Interbase).
Este es un manejador de bases de datos muy popular y sencillo de manejar. Su
efectividad no es lo más conveniente para un trabajo de este estilo pero como su uso es
extensivo y no tiene que hacerse un programa particular para la introducción de datos ni
modificación de ellos, fue la elección más pertinente en su momento. Este problema se ha
considerado como no trascendental porque la Única ocasión en que se utiliza arduamente
la base de datos es cuando los alumnos ingresan a la clase virtual. En todo el demás
tiempo el maestro es el único que hace uso de ella para actualizar calificaciones o
consultar historiales. Sin embargo, se hace notar que su eficiencia no es la adecuada, y al
usarse JDBC en el lado servidor, se puede cambiar la BD con facilidad sin necesidad de
alterar otra cosa que el driver odbc particular de la nueva base de datos en todos los
servlets que la utilizan, en caso de tener problemas de desempeño.
15
4. Desarrollo práctico (Primer Prototipo).
En la etapa práctica del proyecto, se hizo el desarrollo, empleando las técnicas del
Análisis y Diseño Orientado a Objetos (ADOO), en las que se aplicó el diseño de Use
Cases (Casos de uso UC); así, para cada UC se analizó su modelo de requerimientos,
que, de acuerdo con lo ya mencionado en el marco teórico del presente reporte, dicho
modelo comprende los modelos de casos, dle interfaz y del dominio del problema.
Es importante mencionar, que hasta esta etapa el proyecto consta de dos
prototipos, en esta parte explicaremos el desarrollo del primer prototipo para finalmente
pasar a la descripción del segundo prototipo.
4.1 Modelo de requerimientos a nivel general.
En ésta etapa, se estableció la forma de trabajo el equipo y se comenzó con la
familiarización del equipo de desarrollo con el problema (el diagrama se encuentra en el
ANEXO 1).
ANEXO I
MODELO DE REQUERIMIENTOS (nivel general)
Diagrama General de Use Cases del Chal:
-/
"
\
I \
MaestroDa
Clase
MAESTRO
AlumnoToma
Clase
/
\
Nlaestro
Expone
Maestro
Pregunta
Alumno
Responde
Maestro
Contesta
Alumno
Pregunta
Maestro
Accesa
Expediente
16
Especialización de Use Case Maestro Pregunta y Alumno Responde
\
I
Alumno
MAESTRO
Maestro
Alumno
Contesta
Pregunta
MaestraPregunlaAbierta
\
\
Maestrocalifica
Respuesta
Termina
Selecci6n
~
AlumnoRespondePregDlrecta
Maestrocalifica
ReS1)"eSta
Especialización de Use Case Maestro Contesta
x
MAESTRO
A
ALUMNO
,
~~
6-ALUMNO
M a e s t r o contesta
1,
-
MaestroContestaCOn
P re d e t e r m i n a d a
M a e s t r o C o ntesta D ire c l a m e nte
17
PREGUNTA
Especialización de Use Case Maestro Expone
x
MAESTRO
Maestro
Expone
)
MAESTROENVIAIMAGEN
<<USA>>
MODIFICAR IMAGEN
SELECCIONAIMAGEN
4.2 Modelo de requerimientos para cada IUse Case.
Aquí se especifica la secuencia de acciones a tomar por el sistema para cada
intercambio de información (Ver diagramas 'en ANEXO 2).
4.2.1 Modelo de requerimientos:
4.2.1.1 Modelo de casos (Ver ANEX02).
4.2.1.2 Modelo de lnterfaz (Ver ANIEX02).
4.2.1.3 Modelo del dominio del problema (Ver ANEX02).
4.2.2 Modelo de Aná?isis.
4.2.2.1 Escenarios explorados.
Los escenarios que se exploraron, (corresponden Únicamente al encontrado en el
marco de "Simple Correcto", ya que al ingresar a otro escenario, en el que la clave de
acceso del alumno o el profesor sean incorrectas, el sistema simplemente no entra en
ejecución, por lo que se omitieron diagramas que no tiene gran valor ilustrativo.
4.2.3 Modelo de Diseño (Diagramas de Secuencia).
4.2.3.1 Escenarios Explorados.
18
Como se estableció en el modelo de análisis, el Único escenario descrito es el que
presenta las características de ser el "Simple Correcto", por lo que se presentan los
diagramas de secuencia para cada Use Case para éste escenario en particular (Ver
ANEX03).
ANEXO 2:
Modelos de Requerimientos para cada UC
1. Use Case MaestroPreguntaAbierta
-
-
\
,
~
\
MaestroPreguntaAbierta
MAESTRO
PASOS
1.-Maestro presiona -pregunta abierta
2.-Teclea pregunta en el área de texto.
3.-Maestro presiona enviar.
4.-Sistema lleva pregunta a todos los alumnos.
5 -Sistema trae la solicitud de los alumnos (que quieren responder y los marca en el área
de alumnos presentes.
6.-Maestro selecciona alumno que responderá y presiona -Aceptar.
7.-Sistema avisa a alumno que ha sido seleccionado para responder, comienza un timer y
trae su respuesta al área de texto, difundiendo ésta a todos los demás clientes.
8.-U.C. MaestroCalificaRespuesta y regresa a 6 o pasa a 9.
9.-U.C. TerminaSelecciÓn.
Diagrama de Estado (Use Case Maestro Pregunta Abierta)
Selecciona
Teclea
Entra
!,'
-2- AlumY--nospresentes
I
A
-
P a n t P rin
Pregunta A biertd
4
7
--
~
-
Fin
&Aceptar y Selecciona otro( PreguntaHecha )
Aceptar( Alumno )
Aceptar y U C Term inaSeleccion
uc
v
JL
PantCalificacion
(
19
~
AreaDeTexto
-
Diagrama de Clases (Use Case Maestro Pregunta Abierta)
cMAESTRO
(from L o g i c a l V i e w )
6
e
CveCurso @
&Fecha
@
+Hora
Q
e C a l i f P articip
+Nombre
P a s s word
\
Esta en
\
I n s c r i f o en
\
1
1
0
1
1
* eCveEmpleado
&C lave ho ra r io
1
rc1
cinscripcion
(from L o g i c a l V i e w )
t+C
alif‘rotal
/’
(Irom L o g i c a l v i e w 1
&C
red ! t o s
2. Use Case MaestroCalificaRespuesta
MAESTRO
MaestroCalificaReswesta
PASOS
Maestro otorga una calificación a la respuesta o comentario del alumno.
I.-Sistema trae un cuadro de dialogo con los datos del alumno previamente seleccionado
y un área de texto para que el maestro ponga la calificación.
2.-Maestro teclea la calificación y presiona aceptar.
3.-Sistema guarda calificación del alumno.
4.-Sistema muestra al alumno seleccionado mediante un cuadro de dialogo el aviso de
que su respuesta fue calificada y la calificación correspondiente.
5.-Sistema despliega en todos los clientes de alumnos la participación exitosa y
calificación del alumno en el área de texto.
20
Diagrama de Clases (Use Case MaectroCiilificaRespuesta)
cMAEST RO
.
.
Password
cClase
( t mLogICal View)
Esta en
(fran Logical View)
\
&Fecha
NumClase
@Impartida
Fecha Fi n
Tiene
\
/
\
Creditos
cDlAS
1..1
,+Dia 3
@Dia 4
&Dia 5
1
hora de inicio
tiene
%clave dias
\
L
I
I
I
+actualiza hora de inicio(
+actu a I iza du raci Ón ()
+Modifica dias()
3. Use Case Termina Selección pregunta Abierta
-
-
~-
/
\
~
\
TerminaSeleccion Preg Abierta
ALUMNO
PASOS
1.-Maestro presiona cancelar.
2.-Sistema borra todas las marcas de los aspirantes a contestar.
3.-Sistema avisa a todos losalumnos que s'e ha terminado la oportunidad de contestar.
21
Modelo de lnterfaz
Diagrama de Estado (Use Case Termina Selección Pta. Abierta)
C a n c / T e r m i n a r Pregunta A b i e r t a
0 1IN IC IO
1
,
Pantalla S e l e c c i ó n d e p r e g A b t a
(
IL
,/'
Eliminar m a n o s alzadas
I
I
I
J
4
L
S e genera Aviso d e F i r de Oportunidad p a r a contestar
Diagrama de Clases (Use Case Termina Selección Pta. Abierta)
CMAESTRÓ
1
(from Logical View)
%CveEmpleado @
4. Use Case MaestroPreguntaDirecta
MaestroPreguntaDirecta
MAESTRO
PASOS
Maestro realiza una pregunta específica para un alumno y la califica.
1.-Maestro selecciona alumno en la pantalla de alumnos presentes.
2.-Maestro presiona pregunta directa.
3.-Maestro teclea la pregunta en el área de texto y presiona enviar.
4.-Sistema lleva pregunta a todos los alumrios.
Ei.-Sistema avisa a alumno mediante cuadro de dialogo que ha sido seleccionado para
contestar y comienza un timer..
6.-Sistema trae respuesta y la despliega en todos losclientes.
7.-U.C. MaestroCalificaRespuesta.
8.-Sistema termina.
22
Modelo de lnterfaz
Diagrama de Estado (Use Case MaestroPreguntaDirecta)
Diagrama de Clases (Use Case MaestroPreguntaDirecta)
XAE
s TRO
view)
&CveErn pleado Q
&Nombre
&Pass word
(from L o g i c a l
g4.,.
-
1
Q
%Hora
Esta e n
.1
.
1
Tiene
--/--
En
parfe de
1
\
Lzzz&Nombre
Q
1 .I
'nscrito e n
O.'
5. Use Case MaestroContestaDirectamente
MaestroContestaDirectarnente
MAESTRO
Ante las diversas preguntas que el maestro puede ver en el area de preguntas que
realizan los alumnos, selecciona una para responder y la contesta .
PASOS
1.-Maestro selecciona la pregunta correspondiente en el área de preguntas.
2.-Maestro presiona responder.
3.-Sistema prepara envío.(Pregunta, alumno).
4.-Maestro teclea respuesta en el área de texto y presiona enviar
5.-.Sistema despliega en todos los alumnols la pregunta , el alumno que la realizó y la
respuesta dada por el Maestro.
Layouts de pantallas( Use Case MaestroContestaDirectamente)
24
1.-Maestro selecciona la pregunta correspcindiente en el área de preguntas.
2.-Maestro teclea respuesta en el área de texto y presiona enviar
Diagrama de Estado (Use Case MaestroCOntestaDirectamente)
Selecciona Pregunta
/
O
Entrar
>
PantPnn
3
~~
1
~
Desplegar Preguntas
I
~
A
~~
Área Preguntas
~~
l
Enwar( Todo+,lumno$Alumno,Pregunta,Respuesta 1
Responder(Aiumno,Pregunta )
Fin
g’
(0;
Teclea
/
-
\
7
ÁreaDel-exto
25
<
Diagrama de Clases (Use Case MaestroContestaDirectamente)
i
cum
(from Logical View)
&&Urn
&,Nombre
@
1 1
&Creditos
nene
CParticipaciwi
(tmm Logical View)
O'
En
epm @
O *
&CalllPartlclp
Esta en
,
11
l..I/'
Y
~
cMAESTRO
(fmm Logical View)
&&Emplead0
&Nombre
&Password
@
&Matncula @
0 * +,cleCUrsO@
&Fecha @
I
ALUMNO
1
(from Logical View)
iwMatnx@
pmbre
YgPasswrd
1
26
I
6. Use Case MaestroContestaConPredeterminada
~
MaestroContestaConPredeterrninada
MAESTRO
Maestro contesta una pregunta de las que se han hecho en el area de preguntas y la
contesta mediante una respuesta que previamente ha capturado y puesto a disposición.
PASOS
1.-Maestro selecciona la pregunta que desea responder en el area de preguntas.
2.-Maestro presiona -Responder.
3.-Sistema prepara respuesta(Pregunta, alumno).
4.-Maestro presiona -Cargar.
Ei.-Sistema trae todas las opciones que se han precargado en un cuadro de opciones que
contiene la pregunta y la respuesta.
6.-Maestro selecciona la pregunta y respuesta correspondiente y presiona -Aceptar.
7.-Sistema despliega en el área de texto la pregunta y respuesta seleccionada.
8.-Maestro presiona -Enviar.
9.-Sistema lleva la pregunta, el alumno que la realizó y la respuesta dada a todos los
alumnos de la clase.
Diagrama de Estado (Use Case MaestroContestaConPredeterminada)
Selecciona Pregunta
Enviar( TodosAlumnos.'Alumno,Pregunta.Respuesta )
R e s p o n d e r y Cargar( A l u m n o , P r e g u n t a )
I
'n
k
S e l e cc'o n a Re sp u e Sta
1-I-
$1
ÁreaDeT e x t o
Aceptar( A l u m no .P regu n t a ,Respuesta )
27
Pant
Diagrama de Clases (Use Case MaestroContestaConPredeterminada)
cUEA
(hanLqlC4MRY)
&CveUEA @
&Nombre
&Creditoc
1 1
Jene
O '
'
ccum
(han LqldUew)
o +
CveCum Q
1 1
&CvecUi53
&CveEA
&Fechalnic @
&FechaFin
QCveEmpleado
&Clavehorano
~
$,CalifPaiticip
O'
1 1
En
~
Fmm pade de
Esta en
1 1
O *
-~
clnmpcion
1
l~
Inccnto en
7. Use Case AlumnoRespondePregDirecta
-\
I
'
\
\
AlurnnoRespondePreg. Directa
ALUMNO
PASOS
1.-Sistema avisa que el alumno ha sido seleccionado para responder la pregunta directa .Despliega un timer(re1oj).
2.-Alumno teclea respuesta y presiona envi,ar.
3.-Sistema lleva respuesta a servidor o avisa del fin del tiempo.(para contestar).
4.-Sistema despliega mensaje de respuesta recibida o puntuación otorgada.(privada).
28
Diagrama de Estado (Use Case AlumnoRespondePregDirecta)
INICIO
>
Pantalla Principal
1
Sistema avisíl al alumno que ha
sido escogida para responder la
preg hecha
~
~
~-~~
Mensaje de seleccion
1
3
c -
I
I
~~
~~
Alumno teclea respuesb y envia si fue
selehionado
FIN
~
-!
-
Respuesta a la preg realizada
No fue posible la
generacion de la
calificacion
Finaliza respuesta del alumno
Calificaciori
<-
-~
&&posible seFnera la calificaci'on
Diagrama de Clases (Use Case AlumnoRespondePregDirecta)
CP articipacion
c c c aiiíic a c i
i
%C
ó
n
(from L o g i c a l V i e w )
7
&Matricula
Q
&CveCurso
Q
&Fecha
Q
&Hora
Q
%.CaIifP
articip
alificac ion a s ign a d a
29
8. Use Case AlumnoRespondePregAbierta
AlumnoRespondePreg.Abiería
ALUMNO
PASOS
1.-Sistema trae a la pantalla la pregunta y la marca como abierta(Area de
Exposición).
2.-Alumno presiona solicitud de Participación .
3.-Sistema lleva solicitud al servidor.
4.- Sistema trae respuesta de servidor
5.-Alumno teclea respuesta y presiona enviar.
6.-Sistema lleva respuesta del alumno.
7.-Sistema notifica a los alumnos del termino de la sección de Respuestas.
Layouts de pantallas (Use Case AlumnoRespondePregAbierta)
Diagrama de Estado (Use Case AlumnoRiespondePregAbierta)
Solicitud de Participacion
pala contestar pregunta
~
V
R e s p u e s t a a Solicitud
A A
F IN
~
~-
~~
E l a l u m n o r e s p o n d e la p r e g u n t a
1
L a solicitud n o fue a c e p t a d a
~~A !
! - __
~
Respuesta del alumno
~
E n v i a r respuesta a l servidor
-
~
~~~-
Diagrama de Clases (Use Case AlumnoRespondePregAbierta)
&Nombre
WP a s s w o rd
30
Layouts de pantallas:
AlumnoRespondePreguntaAbierta
225899
9. Use Case MAESTRO EXPONE DIRECTO
,
MAESTRO
MaestroExponeDirecto
PASOS
1.- Maestro elige expone directo
2.- Sistema muestra pantalla del maestro.
3.- Maestro teclea en el área de pizarrón.
4.- Sistema envía información a alumnos
5.- Maestro termina clase.
31
Layouts de pantailas(Use Case MAESTRO EXPONE DIRECTO)
3.- Maestro teclea en el área de pizarrón.
4.- Sistema envía información a alumnos
32
Diagrama de Estado (Use Case MAESTRO EXPONE DIRECTO)
maestro teclea informacion
/
a '
opciones del maestro
muestra
--
-
T
'\
7
~
> pantalla del maestro
I
<
toma otra opcion
termina clase
fin de clase
fin de clase
-v
-~
~~
'pantalla de fin de clase 1
,
Modelo del Dominio del problema
Diagrama de Clases(Use Case MAESTRO EXPONE DIRECTO)
~
cMAES7'RO
(from Logical View)
,
Password
10. Use Case MaestrolniciaSesión
PASOS
1.- MAESTRO TECLEA PASWORD.
2.- MAESTRO TECLEA CLAVE DE EMPLE:ADO.
3.- SISTEMA MUESTRA PANTALLA DE ElLECClON DE EXPOSICION.
4.- MAESTRO ELIGE TIPO DE EXPOSICION.
6.- SISTEMA MUESTRA PANTALLA DEL MAESTRO.
7.- U.C. MAESTRO DA LA CLASE.
8.- MAESTRO TERMINA SESION
10.-SISTEMA VERIFICA LA HORA DE TERMINACION
11.- SISTEMA AVISA LA TERMINACION DE LA CLASE
12.- SISTEMA CIERRA LA CLASE
33
Diagrama de Estado (Use Case MaestrolniciaSesión)
error de pasword o
matricula
digita pasword y clave
d e em pledado
-activa
panta I I a
Modelo del Dominio del problema
Diagrama de Clases (Use Case MaestrolniciaSesión)
1
~
~~
ccurco
(from Logical View)
L - -
,
se imparte
+actualiza (:la= cursos()
+actualiza $:la= empleado()
' ~ C v e C U r s O@
&CEUEA
áFechalnic @
QFechaFin
QCveEmpleado
l &Clawhorario
I
~
~~
~
-
~~~
11. Use Case AlumnoEntra a clase
\
AlumnoEntra
ALUVNO
PASOS
1.- ALUMNO DlGlTA PASWORD.
2.- ALUMNO DlGlTA MATRICULA.
3,- SISTEMA VERIFICA LA HORA Y CLASE QUE PUEDE
34
TOMAR A ESA HORA.
4.- SISTEMA MUESTRA LA PANTALLA DEL CURSO.
5.- ALUMNO TECLEA DE ACEPTACION.
6.- SISTEMA MUESTRA PANTALLA DEL ALUMNO.
7.- U.C.ALUMN0 TOMA CLASE.
8.- SISTEMA TERMINA SECION.
9.- ALUMNO TERMINA CLASE
10.-ALUMNO VISUALIZA PUNTUACION AL. FINALIZAR LA
11.- SISTEMA REGRESA A LA PANTALLA PRINCIPAL
Modelo de Interfaz:
Layouts de pantallas
1 .- ALUMNO DlGlTA PASWORD.
35
CLASE.
..
6.- SISTEMA MUESTRA PANTALLA DEL ,ALUMNO
Diagrama de Estado (Use Case AlumnoEntra a clase)
D I A G R A M A D E E S T A D O DE U C A L U M N O E N T R A A C L A S E
INVALID0 P A S W O R D
O MATRICULA
0
, '
INICIO
L
-
~-
v---
ECPECIFICACIOhI D E L C U R S O
~
P A S W O R D Y MATRICULA
_
~-
~-
CURSO A TOMAR
-
V_
~
PANTALLA ALUMNO
TERMINA CLASE
(a)T
R E G R E S A A PANTALLA
PRINCIPAL D E L ALUMNO
~
~
PUNTUACION D E L ALUMNO
_
PANTALLA DE TERMINO D E CLASE
~
VISUALIZA PUNTUACION
EL A L U M N O
36
~
____
~~
I
Modelo del Dominio del problema
Diagrama de Clases (Use Case AlumnoEnltra a clase)
c
P U N T U A C IO
D E TA-L L E
N
-DEP U N f i A c ION
+clave
detalle
num de clase
*clave
detalle
untos obtenidos
+actualiza clac e()
+guarda puntoso
+ a c t u a l i z a p u n t o s ()
%mete m atricula()
I
nombre
+actualiza m atricula()
+actualiza c u r s o s ()
%actualiza nombre()
n
tom a
cCURSO
+clave
curso @
+nombre
curso
+inicio
de curso
e9num .de clases
&clave h o r a r i o
&u!’0
.+CveMestro
4-
9 a c tualiz a
+actualiza
+actualiza
+a c t u a l i z a
1
n
Tiene
1
I
CM I
M
I
c DA
I-
+Dia
3
Dia 4
+Dia
5
1
clave()
d u r a c i o n ()
tnic io()
c u P O ()
+clave
s e imparte
+actualiza
+actualiza
-
+Modifica
c H O R A R IO
horario
dias()
37
hora de inicio()
duraciono
12. Use Case MaestroAccesaExpediente
\
MaestroAccesaExDediente
MAE5TRO
PASOS
Maestro accesa a el historial académico de im alumno en particular.
1.-Maestro selecciona alumno de la pantalla de alumnos presentes.
2.-Maestro presiona Historial.
3.-Sistema muestra el historial del Alumno y Io despliega en una pantalla especial.
4.-El
Maestro presiona el botón mostrar foto de la pantalla especial.
5.-EI sistema despliega la foto del Alumno en la pantalla especial.
6.-El Maestro presiona aceptar.
7.-El sistema deshabilita la pantalla de historial y regresa a la pantalla principal.
Modelo de lnterfaz
Diagrama de Estado (Use Case MaestroAccesaExpediente)
o...
S el e c c i o n a A l u m n o
~ntrar
1
.
P a n tPri n
@
Mostrar Expediente( A l u m n o )
38
Modelo del Dominio del problema
Diagrama de Clases (Use Case MaestroAccesaExpediente)
cMaestro
@ZÍrga apunte
&forma enwo
&Eleccion
cAlumno
I
&Nombre
&Nombre Maestro
&Clave Maestro
&Recibe-Apunte()
&Revisa-Historial()
,&Consulta-Foto()
&Recibe-Alumnos()
&Eiige-Aiumno()
&Muestra-Alumnos()
~
I
&Nombre
&Matricula
&Promedio
+O..n
&Carrera
&Tiempo
&Clases Asignadas
&Muestra-Hi storial()
&Muestra-Fiito()
13. Use Case CargaEnviaComoDocumento
Maestro
US CargaEnviaComoDocumento
PASOS:
El maestro selecciona enviar un texto como Documento
1.Maestro selcciona del CheckBoxGroup 'texto'
2. El sistema activa boton 'Carga Apunte'
3. El maestro presiona botón 'Carga Apunte'
4. El sistema despliega pantalla de opción 'Enviar como documento'
5. El sistema abre pantalla de selección del destino del archivo
6. El sistema despliga pabntalla de selección de archivo
7. El maestro busca selecciona archivo cor1 texto
8. El maestro presiona 'Abrir en la pantalla (le selección
9. El sistema cierra pantallas de selccion
1O. El sistema envia el documento al destino indicado
39
11.El maestro continúa con la clase
.
Modelo de lnterfaz
Diagrama de estados UC CargaEnviaComioDocumento
J - inicio
F4
selec ChBG Texto
\
Cargar Apunte activo
Pantalla de Sele
,J
Enviar como Documento
Modelo del Dominio del Problema
UC CargaEnviaComoDocumento
cPantallaSeIDestiii0
&Enviar directamente
I1
~
cArchivo-
cSelección
&Archivos
@Di rectonos
1 &Unidades de disco
40
@Finanzas
&Sociaologi a
Q,Psicología
I
Modelo de Colaboración
223899
UC CargaEnviaComoDocumento
1: CargaApunte
2: SetDocumento
3: SetDestino
4: SetFuente
4
5: GetHistorial(Alumno)
: Maestro
oDHistor
I d e l
6:
Layouts de pantallas
1 . Pantalla de selección de tipo de envio
41
ExecSQL\
L
2. Pantalla de selecci6n de destino de envío
14. UC CargaEnviaDirectamente
NewClass
US CargaEnviaDirectamente
PASOS
1. Maestro selcciona del CheckBoxGroup 'texto'
2. El sistema activa boton 'Carga Apunte'
3. El maestro presiona botón 'Carga Apunte'
4. El sistema despliega pantalla con opción 'Enviar Directamente'
5. El Sistema despliega pantalla de selccion de archivo
6. El maestro busca y selecciona archivo con texto a enviar
7. El sistema cierra pantalla de seleccion
8. El sistema despliega el documento en el #areade texto
9. El maestro continúa con la clase
42
Modelo de Interfaz
Diagrama de Estado UC CargaEnviaDirectamente
Inicio
Selec ChBG Texto
Pantalla del Maestro
Cargar Apunte activo
Cancel
Cargar Apunte
Modelo del Dominio del Problema
UC Carga Env iaDirectamente
cMaestro
&Nom breMaestro
&D irectamente
%Password
I 1
%Di rectorios
43
Modelo de Colaboracion
UC CargaEnviaDirectamente
3: Se1 de otro archivo
-+
n
1: CargaApunte
2: SelArchivo
/ \
4: Abre archivoTxt(archivo)
: (Maestro)
: GetArchivoTxt(archivo)
\1
6: Exec SQL
LAYOUTS DE PANTALLAS
1. Pantalla de Selección de tipo de envío
44
+
J nuilnuii
chat
chucho
hello-lava
Hellolava
Maequee
prueba
$
J P-ElegirEnvio
3 PMaestro-PreguntasPredefinidas
3 Hellolwa Helldava "him
9 CuadioDialogo
33
e
E4
suw
chuchow
ChatE DCervlet
Chat: ervlet
ErrAliimnoNoSei
4 maestro
uP-
&%
EnviaResum
I
p-Pantatiacarg
Q PMaestro
PMaestro-Abo
/@ PMaestro-Preg
@ PMaestro-Preg
Administracion
Bombre de archivo.
xipo de euchwos
2. Pantalla de selección de archivo a enviar
15. USE CASE CARGAENVIAIMAGEN.
PASOS
A
UC CargaEnialmagen
Maestro
(EN LA PANTALLA DEL MAESTRO, SELECCIONAN UN ICONO)
1 . Maestro selecciona del checkBoxGroup 'Imagen'
2. El sistema activa botón 'Carga Imagen'
3. El maestro presiona botón 'Carga Imageri'
4. El sistema despliega pantalla 'Clmagenea'
5. Maestro presiona 'Abrir Imagen'
6. El sistema despliega pantalla de selección de archivos
7. El maestro busca y selecciona archivo caln Imagen (*.gif, *.jpg, *.jpeg, *.bmp, etc ...)
8. Maestro presiona botón 'Abrir' de la pantalla de selección
9. El sistema muestra la imagen en un recuadro
I O . Maestro presiona botón 'Enviar Imagen'
11. Sistema desaparece pantalla Cimagenes
12. El sistema coloca la imagen en el recuadro del pizarrón
13 El maestro continua la clase en la pantalla de maestro
45
Modelo de lnterfaz
Diagrama de Estado(Use Case CargaEnvialmagen)
Presiona Cargar Imagen
Selec ChBG Imagen
Abrir Imagen
w
Selec de Archivos
Fin de Clase
Selec de Otra
Imagen
Presiona Abrir
P
Visualiza Imagen
i
Presiona Enviar Imagen
Continua Clase
Pantalla del Maestro con Imagen
Diagrama de Coiaboracion
Clicklmagen
>
2 ClickCargalmagen
3 AbnrArc.hivo
>
9
5 Getlmagen(Nombre1mg)
4
Abrelmg(Nombre1mg)
9: EnUarlmci(1magen)
w
IO.
ReqresaPMaestro
46
->
Diagrama de Secuencia
Modelo del Dominio del problema
Diagrama de Clases (Use Case CargaEnvialmagen)
Layouts de pantallas (Use Case CargaEnvialmagen):
&Nom breMaestro
maestro
&Password
&EspacioP Imagen
I..*
+EnvialrnqO
P&C\R
4
r cseieccion
rchims
Irectorios
cArchiw
I
'
47
16.
Use Case Alumno Pregunta
/ \
ALUMNO
a
AlurnnoPre unta
4
PASOS
1.-Alumno teclea pregunta y presiona enviar.
2.-Sistema lleva pregunta a maestro.
Modelo de lnterfaz
Diagrama de Estado(Use Case Alumno Pregunta)
Alumno teclea pregunta y
la env'ia
0
1'
INICIO
~
('
-
c--
Pantalla Alumno
I
Layouts de pantallas(Use Case Alumno Pregunta)
17. Use Case Modificarlmágen
1
Modificarlmágen
MAESTRO
49
PASOS
1.-Maestro presiona modificar imágen.
2.-Sistema trae componentes de dibujo.
3.-Maestro modifica imágen.
4.-Maestro presiona salir de los componentes de la paleta( dejar de dibujar).
Modelo de lnterfaz
Diagrama de Estado(Use Case Modificarlmágen)
Modificar imágen
-
INICIO
Pantalla Pnncipai
A
-
~
~~
~~
-~
< ~-_ _
,
Fin de modificación
Modelo del Dominio del problema
Diagrama de Clases (Use Case Modificarlimagen)
CIWI
agen
50
-A!
~
Herramientas para modificar imiien
-~
7----
ANEX03: Modelo de Diseño (Diagramas de Secuencia)
1.
(Use Case Maestro Pregunta Abierta)
maestro pregunta abierta
oPantPrin
' \
MAESTRO
>
Presiona
- 3
habiiitar(PregAbierta)
>
-
Presiona
-~
3
-
J
>
oArea
<
%Texto
-
-
envia(Preg
'
Servidor envia(PregAbierta.Pregunta)
_1
poCii?,a
recibeSolicitudes
I
1
-_
~
- 1
&Texto recibe
~
Selecciona
-
->r
OC Servidor avisa(Alurnno)
->
p~
I
I
oCServida recibe
OCSkidci difuide
OCTextorecibe
f
~-
51
-
~
1 '<
-
-
2. (Use Case Maestro Califica Respuesta)
Q
: MAESTRO
I oPÁreaTexto : 1
II
cPMAreaTexto I
--
Y
oArea
+I
xto.procesaca
oCCali i ación.guardaC2
)
Alumno
D.guardaCalif(S1 ZL2
3
1
2. (Use Case Termina Selección Prgunta Abierta)
P\
: MAESTRO
r
OP Cancelar:
Selecciona CanLelar (Terminar) '
Elimina Manos Alzadas
Exec SQL
I
1
,
I
Sin Manos a los alumnos
u--
Terminar Modificación
1A
I
I
!I
U '
I
I
I
I
I
I
1
(Use Case Maestro Pregunta Directa)
A
MAESTRO
oPantPrin c
P a n t Prin
'rr]
Presentes c
cPMAreaTe
U C Maestro
Califica
~~
n-
r-1
oCTexto c
CTexto
oCSeNidor c
CServidor
c
d
-
o P A Iu m Present es I Iurn i n a (A Iurn n c )
I
Selecciona
I
>O
l e s i o n a P r e g u n t a Directa
0-1
I
oPAreaTexto habilita
I
'
u
Teclea Pregunta
o P Á re alT ex t o . pro ce saT xt
'
~
-1
f
exto e n via (P reg Dir A Iu rn n o .Preg u n t a )
7u rn
o CS e rvid o r e n via (P reg D i r A I
n o P re g )
U
I
I
nI
o C S e w i d o r corn T irn e r()
la
OCSeNidOr recibeRespuesta(PregDir Alurnno.Respuesta
0'7
I
o Ctrl C h a t d ifu n de(Alurn n o Re spuesta)
I
o CT exto re c i b e Re sp (A Iu m n o x s p u e s/a )
I
o-
O
Califica
-
o P AreaT e Kto d esp IIe g a Re sp (A Iurn n o , Respuesta)
>--=c
7
I
3.
(Use Case Maestro Contesta Directamente)
oPantPrin
.
1
oPÁre!a
Preguntas
F
oCTexto
OPÁreaTexto
oCServidor
Sen';
IoPArea
Selec
Pres¡<
-oPÁrea
Teclea
-A
OPP
Texto.proceca
-c
oCTexto.envia
CServifdor.difundi
1
i'5
5. (Use Case ContestaConPredeterminatla)
maestro contesta con predeterminada
1
oF'AreaTexto
oPÁrea
Preguntas c
MAESTRO
,
oPCuad ro
Opciones
ZMAreaTexto
-
~
'
'
oCTexto
oCServidor
-
~~~
>
Señal
Seleccion
Presiona
>
>
<
A
oPÁrea
Presiona Cargar
>
>
oPCuad ro
oPCuadro
-1
Se Iecci on a
<
>
A
oPÁrea
<
oCiexto envia(Alumno,Pregunta,Respues
,
~~
~~~
__
1
~~
->
oCSetvidor difunde
I]
~
I4-
<
<
<
56
-~
4.
(Use Case AlumnoRespondePregunitaDirecta)
:ALUMNO
Alumno Teclea Respuesta y presiona enviar
T
II
RespLiesta es llevada al
1
%ensaje Recibido o Calificación
I
Show
"
,
Terminar de Responder
U
'
U
u
n'
U
5.
I
(Use Case AlumnoRespondePregun'taAbierta)
A
: ALUMNO
1
=I
oPSolicitudParticipación:
cCFinal
--T
--
Solicitud
\
u
r;
Teclea Respuesta a Preg.y preciona
I1
Teminar de
\
/
'
I
J
\ I
'
L
U
57
(Use Case AlumnoRespondePreguntaAbierta)
6.
II
O
'
oPSolicitudParticipación :
cPSolicitudParticipación
I--
oCServidor :
cCSeNidor
Mensaje en el
area de texto :
oCFinal :
cCFinal
Selecciona Solicitud de
Solicitud
n
/I
>ii
U
Show Respuesta a la ,
n
\
I
Terminar (No se otorgo (el derecho a
U'
58
7.
(Use Case Maestro entra a dar clase)
-
: MAESTRO
oPinicia clase : oPMuetraüatos
oVOpciones
--
digita pasword y clave be ernWamX2g
>
ocontoi:~
oPPantalla
OBD:CDBMS
control
-__
UCTIPODE
EXPOSICION
~
I
oC.TraeDbtosProfeso(Cv&impleado)
>
1
Exe SQL
>
show(Datos del empleado)
>
,
I
pdsa
,
-
>
Show(Pantal1alylrlestro con pantalia de opciones)
>
iiecciona opcion
I
>
>
I
1 1
-
I
digita tdmina
i
:
'
&.verifica h m l d e tenninacibn I
-
&.Trae
- _ _
I
-->
1
Exe SQL
show(pantal1a de
>
I
fin de clase
I
59
>;
>
(Use Case Maestro Expone Directo)
8.
ji-
maestro expone directo
~
Selecciona expone predeterminado
>
Traepantallla(maestro)
Exe SQL
>
show(pantal1a del maestro)
>
selecciona boton de texto
->
actim el area de texto
-
->
~~
show cursor en area de texto
31'
escribe + enwar
-
:>
~
p
enviardatos ,
-->/,
1-1
I
I
60
IEvia al senidor
1
>
(Use Case Alumno Entra a clase)
9.
225899
Exe SQLO
I
I
+
trae pantalla alumno
-
~~
~
r
1
I
&oMpantalla alumno)
I
> I
tomadas
1
~
-
-
I
-
--
-
terninadace
-
I
+
>
I
I
I
I
I
I
I
I
I
I
I
I
1 trae puntuacion 1
I
>
I
I
Exe SQLO
---__
I
21
~
enviar puntuacion
i
3 - d
how(puntuaaon del alumno)
aceptar
- 3
,
j
i
I
--
--
I
I
trae pantalla pnncipai
~1 -
--->
I
I
Exe SOLO
~
--
how( pantiilla pnnapal alumno)
I
-~
-3
I
I
61
>
I O . (Use Case Alumno Pregunta)
O
A
:ALUMNO
1-
-
Respuesta : c
Teclea Pregunta ;presiona
\ ,
1
-
oCSemidor : c
oPPre .Alumno
ii
enviar'
Pregunta es llemda al servidor
n.
Show Mensaje de recibida o respuesta
iY--+lI
Terminar de Preguntar
U
1
I
1
3
1
I
62
I
11.
(Use Case Modifica Imagein)
/
- - ~
-
'
oPSelecc
Modificlmá en :
I
__ _ -
Imáqen : c
~
Selecciona Modificar Imágen
-
oPModific
-
~-
oC?omDonentesDibuio : c
CCom onentesDibu'o
~
L--I
~
OBD :
cDBMS
,
>
3-
Dibujo
Show IComponentes dd
Dibujd
-7
-~
Modificar Imágen
1
--y
Terminar Modificación
-
'
-+
-I
63
*-
OC Final :
cCFinal
-
15.
(Use Case Carga Envia corno Documento)
oiSel
Doamento
SeiFuente
I
I
I
3
______y1
I
64
(Use Case Carga Envia Directamente)
16.
j
1
-
1
x.
: (Maestro)
Documento
C a rgaA punte
-n
U
-
Selhchivo
-1
J
T
Se1de otro archivo
1 -I
1
U
17.
(Use Case Carga Envia Imagen)
1
/’
\
1
OlPantalla
PMaestro
Chcklrnagen
OlPantallalmg
I
ClickCargalmagen
I
I
>
AbrirArchim
>
Abrelmg(NornbrIlrng)
+
I
GetImagen(Nornbrelrng)
>
I
ExecSQL
---
I
Regresalrng
~ _
,<<
Pasalrng
1
->r
-
I
->.
RegresaPMaestro
-
->
4.2.4 Modelo de Construcción.
El modelo de construcción es en gran parte el diagrama de secuencia, pero con
las relaciones que tiene con respecto a la codificación, este modelo de construcción
representa en gran parte la codificación que se realizo en la implantación del sistema.
4.2.4.1 Introducción.
para obtener el modelo de construcción se tiene que tomar el modelo de análisis
dinámico para generar un modelo de diseñlo que contemple aspectos de implantación y
aspectos de implantación y aspectos de calidad, posteriormente se toma el modelo de
diseño como entrada para la obtención del inodelo de construcción.
Modelo de Construcción
A continuación se presenta la codificación que nos da en gran parte el modelo de
construcción esta ,codificación es la origiinal que nos presenta los Servlets, Applets,
paginas y codificación mas importante con respecto al proyecto de Educación a Distancia.
import java.awt.*;
import java. awt .event .*;
import com.sun.java. swing.*;
import borland.jbcl.layout.*;
import java.net.*;
import java.io.*;
import java.util.*;
import borland.jbcl.control.*;
import borland.jbcl.control.lmageControl;
public class PMaestro extends JFrame implements Runnable{
private stat ic f ina I String S ERVLET-PATH ="/servlet/c hat. ChatServlet" ;
private static final String servletURL="http://lis-server01:8080";
volatile private boolean bEntro;
//Pendiente de capturar.
String cveMaestro="l ";
String cveUEA=" 1
URL chatURL;
URLConnection conexion;
String usuario='lmaestro'l;
boolean bRespondePreg=false;
Thread HiloColector;
//Construct the f rame
JMenuBar menuBarl = new JMenuBar();
JMenu menuFile = new JMenu();
JMenultem menuFileExit = new JMeriultem();
JMenu menuHelp = new JMenu();
JMenultem menuHelpAbout = new JMenultem();
JLabel statusBar = new JLabel();
XYLayout xYLayoutl = new XYLayoLitO;
TextArea txtaAreaTexto = new TextAreaO;
'I;
List IistaUsuarios = new List();
Button btnEnviar = new Button();
Button btnCargar = new Button();
List listapreguntas = new List();
CheckboxGroup chkboxglmgTxt = niew CheckboxGroup();
Checkbox chkboxlmg=new Checkbalx("1mágen",chkboxglmgTxt ,false);
Checkbox chkboxTxt=new Checkbo:c("Texto",chkboxglmgTxt,true);
Button btnResponder = new Button();
Label IblAreatexto = new Label();
Label IblListaAlumnos = new Label();
Label IblListaPreguntas = new Label();
TextArea Area2= new TextAreaO;
Textcontrol textControl1 = new TextCoritrol();
Stringlnput stringlnputl = new Stringlnput();
Button BGuardar = new Button();
ButtonControl btnCargarHis = new ButtonControl();
List Lista2 = new List();
Panel panel1 = new Panel();
ImageControl imageControl1 = new ImageControl();
ImageControl imageControl3 = new ImageControl();
ImageControl imageControl2 = new ImageControl();
ImageControl imayeControl4 = new ImageControl();
/*inicia pantalla del maestro*/
public PMaestroO {
enableEvents(AWEvent. WINDOW-EVENT-MASK);
try {
1
iniciaHilo();
jbinit();
entrar();// Funcion de entrada en el servidor
catch (Exception e) {
e. printStac kTrace() ;
1
1
/*Este metodo controla los procesos (hilos) dado un cierto tiempo*/
public void run(){
w hiI e(true){
try{
//Funciones leidas del servlet .
colectaF'reguntas();
colectaLista();
HiloColector.sleep(100);
1
catch(1nterruptedException e){
e.prints1ackTrace() ;
1
t5 8
/*muestra los los componentes del area del maestro*/
public static void main(String args[]){
PMaestro pantalla=new PMaestro();
pantalla.show();
1
//Component initialization
/**inicio de jbinit*/
private void jbinit() throws Exception {
this.getContentPane().setLayout(xYLayoutl);
this.getContentPane().setBackground(newColor(l29, 181, 172));
this.setSize(new Dimension(759, 589));
this.addWindowListener(newjava.awt.event. WindowAdapter()
{
public void windowClosed(WindowEvent e)
{
t hi s w indowCIosed(e) ;
1
1);
this.setTitle("Maestro");
statusBar.setText(" ");
xY Layout1.setHeight(727);
txtaAreaTexto.setBackground(Color.white);
btnEnviar.setBackground(new Color(201, 255, 232));
btnEnviar.setLabel("Enviar");
bt nEnviar.addActionListener(newjava. awt .event.ActionListener() {
public void actionPerformed(ActionEvente) {
btnEnviar-actio nPerformed(e) ;
1);
?
btnCargar.setBackground(newColor(201, 255, 232));
btnCargar.setLabel("Cargar");
btnCargar.addActionL¡stener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
btncargar-actionPerformed(e);
1);
1
btnResponder.setBackground(newColor(201, 255, 232));
btnResponder.setLabeI("Responder");
btnResponder.addActionListener(newjava.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e) {
btnResponder-'actionPerformed(e);
1);
IblAreatexto.setText("
Area de Texto");
lblListaAlumnos.setText(" Lista de Alumnos Presentes");
IblListaPreguntas.setText("Lis1:a
de Preguntas");
Area2.~etEditable(faIse);
Area2.setFont(new Font("SansSerif', 3, 12));
69
Area2.~etBackground(newColor( 178, 255, 255));
textcontrol 1.setText(" Texto Eviado");
BGuardar.setBackground(new Color(201, 255, 232));
BGuardar.set Label("Guardar") ;
btnCargarHis.setBackgroundl(newColor(201, 255, 232));
btnCargarHis.setLabeI("HistoriaI");
imageCont rol 1.setImageNams("\\\\Lisserver0 1\\csh\\EducDistancia\\Profesor.gif
imageControl3.~etlmageName("\\\\Lisserver01\\csh\\EducDistancia\\libro2.gif');
imageControl4.setlmageName("\\\\Lisserver01\\csh\\EducDistancia\\Bajalnf.gif
btnCargarHis.addActionListerier(newjava.awt.event.ActionListener()
{
public void actionPerformed(ActionEvente)
{
bt nCarga rHis--actio nPerformed(e,Lista2) ;
I);
I);
1);
1
BGuardar.addMouseListener(newjava.awt.event.MouseAdapterO
{
public void mouseClicked(MouseEvent e)
{
BGuardar-moLiseClicked(e);
1);
1
xYLayoutl .setWidth(lO36);
menuFile.setText("File");
menuFileExit.setText("Exit");
menuFileExit.addActionListener(newActionListener() {
public void actionPerfcrmed(ActionEvent e) {
fileExit-actionPerformed(e);
1);
1
menuHe1p.setText ("Help") ;
menuHelpAbout .setText("About");
menuHelpAbout.addActionListener(newActionListener() {
public void actionPerformed(ActionEvente) {
helpAbout-actionPerformed(e);
1);
1
menuFile.add(menuFileExit);
menuHelp.add(menuHelpAbout);
menuBar 1.add(me nuFile) ;
menuBar 1.add(me nuHeIp) ;
this.setJMenuBar(menuBar1);
this.getContentPane().add(staitusBar,new XYConstraints(307, 650, 751, -
1>);
166));
this.getContentPane().add(txtaAreaTexto,
new XYConstraints(20, 220, 498,
this.getContentPane().add(listaUsuarios,
new XYConstraints(642, 32, 235,
328));
'70
this.getContentPane().add(btnEnviar, new XYConstraints(37, 612, 123,
this.getContentPane().add(btinCargar, new XYConstraints(198, 612, 77,
this.getContentPane().add(chkboxlmg, new XYConstraints(43, 572, 113,
this.getContentPane().add(chkboxTxt,new XYConstraints(43, 548, 113,
this.getContentPane().add(listaPreguntas,new XYConstraints(645, 425,
this.getContentPane().add(btiiResponder,new XYConstraints(785, 646,
this.getContentPane().add(lblAreatexto,new XYConstraints(162, 196, 139,
this.getContentPane().add(lblListaAlumnos,new XYConstraints(676,9,181,
this.getContentPane().add(lblListaPreguntas,new XYConstraints(780,405,
thi~.getContentPane().add(Area2,
new XYConstraints(22,34,502, 158));
this.getContentPane().add(te,ctControll
, new XYConstraints(189, 9, 129,
this.getContentPane().add(BC;uardar, new XYConstraints(533,35,72,28));
this.getContentPane().add(btriCargarHis,new XYConstraints(900,35, 105,
this.getContentPane().add(panell, new XYConstraints(743,53,42,37));
this.getContentPane().add(imageControll
, new XYConstraints(919,86, 64,
85));
new XYConstraints(101, 648,
31,47));
new XYConstraints(214, 648,
37,47));
1
/*finde jbinit*/
/*iniciode funciones para jbinit*/
protected void iniciaHilo(){
int prioridadActual=Thread.currentThread().getPriority();
int
prioridadNueva=prioridadActual==Thread.MIN-PRIORITY?Thread.M IN-PRIORITY:priorid
adActual-I;
HiloColector=new Thread(thic,"AplicacionColectora");
HiloColector.setDaemon(true);
HiloColector.setPriority(prioridadNueva);
HiloColector.start();
p("lniciandocolección...");
1
//FileI Exit action performed
public void fileExit-actionPerformed(ActionEvente){
if( HiloColector!=nuli&&HiloColector.isAlive()){
'7 1
HiloColector.stop();
///cuando cierra el chat se destruye el hilo colector
1
abandonar();
HiloColector=null;
System.exit(0);
HiloColector.destroy();
1
//Conexion al chat especifico
protected void entrar() throws MalformedURLException{
chatURL=new URL(servletUF1L);
usuario=" maest ro";
String
queryString=SERVLET-PATH+"?modo=nuevo_usuario&usuario="+URLEncoder.encode(
usuario) ;
p("Tratando de entrar.");
try{
conexion=(new URL(chatURL,queryString)).openConnection();
conexion.setDefaultUseCaches(false);
conexion.setUseCaches(false);
conexion.setDolnput(true);//Flujo de Entrada
conexion.setDoOutput(false);
conexion.connect();
p("Rea1izando conexion con"+conexiori);
BufferedReader
in
=new
BufferedReader(new
InputStreamReader(conexion.getlnputStrearn()));
String respuesta=in.readLine();
if( respuesta.startsWith("+")){ //Detecta si se pudo conectar
setEntro(true);
p("Entro corno: "+usuario);
repaint () ;
1
else{
p("Error al intentar conectarse: "+respuesta);
System.exit(0);
1
1
catch(Ma1formedURLException e){
p("Error en URL:");
System.err. printIn(e);
e.printStackTrace(System.err);
1
catch(l0Exception e2){
p("Error IO al intentar conexion");
System.err.println(e2);
e2. printStackTrace(Syctem.err);
I
'72
protected void setEntro(boo1ean set)#[
bEntro=set;
1
protected boolean yaEntro(){
return bEntro;
1
/*metodo que elimina a un alumno de la clase*/
protected void abandonar() {
if (!yaEntro() 11 usuario == null) return;
String
querystring
+
SE RVLET-PATH
"?modo=borra-usuario&usuario="+URLEncider.encode(usuario);
try {
conexion = (new URL(chatURL,queryString)).openConnection();
conexion.set UseCaches(fa1se);
conexion.setDolnput(tiwe);
conexion.setDo0utput (false);
conexion.connect ();
BufferedReader
in
new
BufferedReader( new
InputStreamReader(conexion.getlnputStreaim()));
String respuesta = in.readLine();
if (respuesta.startsWith("+")) {
setEntro(fa1se);
p("Usuario + usuario + ha salido del chat");
I'
else {
I'
1
1
p("Error al salir" + respuesta);
Systerri.err.println("Error al salir" +respuesta);
in.close();
} catch (MalformedURLException e2) {
System.err. priritln(e2);
e2.printStackTiace(System.err);
p("Error al intentar salir");
} catch (IOException e l ) {
System.err.priritln(e1);
e 1.printst ac kTrace(System.err);
p("Error al salir");
1
1
/*metodo enviar, envia a todos losalumnos los mansajes que el maestro escribe
en el area de texto*/
protected void enviar() {
String mensaje;
String nulo;
int inicio;
int fin;
//asignaciones
mensaje= txtaAreaTexto.getSelectedText();
inicio=txtaAreaTexto.getSelectionStart();
73
fin=txtaAreaTexto.getSelectionEnd();
if (mensaje.equaIs("l')) {
mensaje = txtaAreaTexto.getText();
if (mensaje.equals("":)) return;
225899
1
I
p("Enviand0 mensaje.");
//realiza la conexion para enviar mensajes
try {
conexion=null;
conexion
(new
URL(chatURL,SERVLET-PATH)).openConriection();
conexion.setUaeCaches(false);//Para este
conexion.setDefaultUseCaches(false);
conexion.setDolnput(true); //Manda objetos con el metodo
POST
conexion.setDoOutput(true);
conexion.setRequestProperty("ContentType","application/octet-stream");
Outputstream im=conexion.getOutputStream();
ObjectOutputStream
out=new
ObjectOutputStream(/*conexion.getOutputStream()*/os);//Envia
losobjetos
out.writeObject(mensaje);
out.flush();
=
new
BufferedReader(new
BufferedReader
in
InputStreamReader(conexion.getlnputStream()));
String response = in.readLine();
if (response.startsWith("+")) {//Acepto el mensaje
if(inicio!=fin) //si hay algo seleccionado en el area de texto para enviar
txtaAreaTexto.replaceText("",inicio,fin)
;
else
txtaAreaTexto.setText("");
//AREA DE TEXTO1
p("Mensaje enviado");
Area2. append("\n");
Area2.append(meiisaje);
else {
p("Error al enviar mensaje'' + response);
1
in.close();
out.close();
bRespondePreg=false;
} catch (MalformedURLException e2) {
p("Error al enviar mensaje");
//System .err.println(e2);
e2.printStackTi-ace(System.err);
} catch (IOException e l ) {
74
1
1
p("Error al enviar mensaje IO");
//System.err. print In(e 1) ;
e l .printStackTrace(System.err);
/*metodo donde el maestro recibe informacion del servidor*/
protected void colectaPreguntas() {
String
querystring
SERVLET-PATH
+
"?modo=colecta&usuario="+URLEncoder.er~code(usuario);
try {
BufferedReader
in
=
new
BufferedReader(new
InputStreamReader(new URL(chatURL,queiyString).openStream()));
String nextLine = in.readLine();
if (!nextLine.startsWith("+")) { //Si acepto la peticion de
preguntas
p("Error obteniendo mensajes del servidor");
return;
1
nextLine = in.readLine();
if (nextLine!=nuII){
p("usuarios colectados");
while (iiextLine != null && !nextLine.equals(".")) {
//Recibe Preguntas
1
1
System.err.println(nextLine);
listaPreguntas.addltem(nextLine);
repaint();
riextline = in.readLine();
else p("ningun usuario");
in.close();
} catch (IOException e) {
System.err.println(e);
e.printStackTrace(System.err);
p("Error al checar el mensaje");
1
//Pregunta por la lista de usuarios
protected void colectalista() {
String querystring = SERVLET-PATH + "?modo=lista";
Vector usuarios = new Vector();
try {
System.out.println("chatURL: + chatURL);
System.out.println("queryString:" + querystring);
URL IistaURL = new LlRL(chatURL,queryString);
System.out.printIn("list aURL: + I istaURL);
URLConnection listacon = listaURL.openConnection();
listaCon.setDefaultUseCaches(false);
listaCon.setUseCaches(false);
I'
75
listacon .connect();
BufferedReader
in
new
BufferedReader(new
InputStreamReader(listaCon.getl
nputStrearri()));
String sigLinea = in.readLine();
if (!sigLinea.startsWith("+")){ //acepto la peticion de lista
del
p("Error obteniendo lista de usuarios
servidor"+sigLinea);
return;
1
sigLinea = in.readLine();
while (sigLinea != null && !sigLinea.equals(".")) { //Recolecta lista
p("Leyendo usuario: "+sigLinea);
usuarios. addEleme nt (sigLinea);
sigLinea = in.readLine();
1
if (!usuarios.isEmpty())l { //Hay usuarios
IistaUsuarios. removeAll() ;
int size = usuarios.size();
for (int i = O; i < size; i++) {
listaUsuarios.addltem((String)usuarios.elemen~t(i));
1
1
else {
1
IistaUsuarios.removeAll();
listaUcuarios.addItem("Ningunusuario dentro");
repaint();
in.close();
} catch (IOException e) {
System.err.priritln(e);
e.printStackTraice(System.err);
p("Error al obtener Iista"+e);
/////////////////
//Overriden so we can exit on System Close
protected void processWindowEvent(WindowEvente) {
super. processWindowEvent(e);
if (e.getlD() == WindowEventWINDOW-CLOSING) {
file Exit-act ionPerformed(null);
1
1
/*manda mensajes a la consola*/
protected void p(String mensaje){
System.out. println(mensaje);
1
76
protected void abreCargaTxt(){
Frame f=new Frame();
String linea;
String archivo;
FileDialog fd = new FileDialog(f,"ABRIR ARCHIVO");
fd.show();
archivo= fd.getDirectory()+fd.getFile();
try{
FilelnputStrearn is = new FilelnputStream(archivo);
BufferedReader
ds
=new
BufferedReader(new
InputStreamReader( is));
while ((linea=ds.readLine())!=
null)
{
txtaAreeTexto.append(linea);
txtaAreaTexto. append("\n");
I
I
ds.close();
catch(l0Exception e){
System.out.println("ERR0R DE ARCHIVO:" + e);
I
I
protected void abreCargalmagen(){}
protected void abreCargaRespuesta(){
new
PMaestro-PreguntasPredefinidas
dlg
PMaestro_PreguntasPredefinidas(this,SER\/LET_PATH,servletURL,txtaAreaTexto,cveMa
estro,cveUEA);
Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getsize();
Point loc = getlocation();
dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height dlgSize.height) / 2 + 10c.y);
dlg.setModal(true);
dlg.show();
void btnEnviar-actionPerformed(ActionEvente) {
imageControl4.setVisi ble(fa1se);
//
imageControl5.setVisible(false);
imageControl3.setVisible(false);
enviar();
I
void btncargar-actionPerformed(ActionEvente) {
String Ibl=chkboxgImgTxt.getSelectedCheckbox().getLabel();
if( bRespondePreg==false){
if(I bl.equaIs("Texto")) abreCargaTxt();
77
I
1
else abrecargalmageno;
else abreCargaRespuesta0;
void btnResponder-actionPerformed(A3ionEvent e) {
String pregunta=null;
pregunta=listaPreguntas.getSelectedltem();
p("Select");
if(pregunta==null)
errorPregNoselec();
else{
t xt aA reaTexto.setText("") ;
txtaAreaTexto.append("\nPREGUNTA DE "+pregunta+"\n");
1
/////////l/lllllll*q ui t ar cuando sea el
bRespondePreg=true;
verdadero*/
}
void BGuardar-mouseClicked(MouseEvent e)
{
GuardaTxtO;
1
void btnCargarHis-actionPerformed(ActionEvent e,List Lista2)
{
String nombre=nuII;
nombre =listaUsuarios.getSelectedltem();
System.out.println(nombre);
if (nombre == null)
error-Alumno-No-Selec();
// aqui madar nombre al sewlet para que busque en la base
else
// de datos y llene una IistaUsuarios o un vector para
mandarlo
/I al cuadro de dialogo que Io mostrara en el area de texto
I / de este mismo. falta otro metodo de recepcion de datos
//recibe la imformacion del servelt paira la consulta
MuestraHistorial(nombre,L~ste2);
/*guarda en un archivo lo que se le ha enviado a los laumnos*/
protected void GuardaTxt(){
Frame f=new Frame();
String linea;
String archivo;
78
FileDialog
fd
new
ARCH IVO",FileDialog.SAVE);
fd .show();
archivo= fd.getDirectoiy()+fd.getFile();
GUARDAR
FileDialog(f,"GUARDAR
//CAMBIAR PARA
linea=Area2.getText();
try{
FileOutputStream os = new FileOutputStream(archivo);
DataOutputStream ods=new DataOutputStream(0s);
ods.writeUTF(Iiinea);
ods.close();
1
catch(l0Exception e){
System.out.println("EIRROR DE escritura ARCHIVO:" + e);
1
/*aqui recibo la cadena con la imforniacion para desplegar
//quitar
en el area de texto*/
//Help IAbout action performed
public void helpAbout-actionPerformisd(ActionEvent e) {
PMaestro-AboutBox dlg = new PMaestro-AboutBox(this);
Dimension dlgSize = dlg.getPi.eferredSize();
Dimension frmSize = getsize();
Point loc = getlocation();
dlg.setLocation((frmSize.width- dlgSize.width) / 2 + loc.x, (frmSize.height dlgSize.height) / 2 + 10c.y);
d Ig.setModaI(true) ;
dlg.show();
1
/*manda llamar la clase PMaestro-PregNoSelec para crear un cuadro de dialogo*/
protected void errorPregNoSelec(){
PMaestro-PregNoSelec dlg = new PMaestro-PregNoSelec(this);
Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getsize();
Point loc = getlocation();
dlg.setLocation((frmSize,width- dlgSize.width) / 2 + loc.x, (frmSize.height dlgSize.height) / 2 + 10c.y);
dIg.set ModaI (true) ;
dlg.show();
protected void MuestraHistoríal(String nombre,List Lista2)
{
/**cambiar**/
79
CuadroDialogo d = new CuadroDialogo(this,nombre,Lista2);
Dimension dlgSize = d.getPreferredSize();
Dimension frmSize = getsize();
Point loc = getlocation();
d.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height
dlgSize.height) / 2 + 10c.y);
d.setModal(true);
d.show();
-
1
protected void error-Alumno-No-Selec(){
ErrAlumnoNoSel dlg-error= new ErrAlumnoNoSel(this);
Dimension dlgSize =dig-error.getPreferredSize();
Dimension frmSize = getsize();
Point loc = getlocation();
dlg-error.setLocation((frmSize.width- dlgSize.width) / 2 + loc.x, (frmSize. height
dlgSize.height) / 2 + 10c.y);
dig-error.setModal(true);
d Ig-e rror.show();
1
void thiswindowClosed(WindowEvent e)
{
if(HiloColector!=null&&HiloColector.~sAlive()){
HiloColector.stop();
///cuando cierra el chat se destruye el hilo colector
1
HiloColector=null;
abandonar();
System.exit (O) ;
//HiloColector.destroy();
1
}/*de todo*/
import java. awt .*;
import java.awt.event.*;
import java.util.*;
import java. net.*;
import java. net. URL.*;
import java. io.*;
import com.sun.java.swing.*;
import com .sun.java. swi ng.border.*;
public class PMaestro-PreguntasPredefinidas extends Dialog implements ActionListener{
String SERVLET-PATH;
JPanel panel1 = new JPanelO;
JPanel panel2 = new JPanel();
80
JPanel insetspanell = new JPanel();
JPanel insetsPanel2 = new JPanelO;
JPanel insetsPanel3 = new JPanelO;
JButton button1 = new JButton();
JLabel imageControl1 = new JLabel();
lmagelcon imagelcon;
JLabel label2 = new JLabelO;
BorderLayout borderLayout2 = new E3orderLayoutO;
FlowLayout flowLayoutl = new FlowLayout();
FlowLayout flowlayout2 = new FlowLayout();
GridLayout gridLayout1 = new GridLayoutO;
String product = "Error.";
String version =
String copyright = "Pregunta no seleccionada";
String comments = "Reintentar";
List IstPreguntas = new List();
TextArea txtaRespuesta = new TextArea();
TextArea txtaPadre=new TextAreaO;
String cveMaestro;
String cveUEA;
Vector pregs;
String servletUFiL;
Ctrl Preguntas ct rlPregs;
Button btnAceptar = new Button();
Button btncancelar = new Button();
Button btnCargarResp = new Button();
Label IblPregs = new Label();
Label IblResp = new Label();
'I1';
public
PMaestro-PreguntasPredefinidas(Frame
parent,
String
SERVLET-PATH,String urlBase,TextArea padre,String cveMaestro,String cveUEA) {
super(parent);
this.cveMaestro=cveMaestro;
this. cveUEA=cveUEA;
this. SE RVLET-PATH=S ERVLET-PATH ;
this. servlet URL=servletURL;
this.txtaPadre=padre;
enableEvents(AVVTEvent.WlbJDOW_EVENT_MASK);
try {
jblnit();
ctrlPregs=new
CtrlPreguntas(SERVLET-PATH,servletURL,cveMaestro,cveUEA);
cargapregso;
1
1
catch (Exception e) {
e. printStackTrace();
}
//imageControll .setlcon(imagelcon);
pack0;
81
private void jblnit() throws Exception {
//¡magelcon = new Imagelcon(getClass().getResource("your
image name
goes here"));
this.setTitle("About");
setResizable(fa1se);
panel1.setLayout(null);
panel2.setLayout(borderLayout2);
insetspanell .setLayout(flowL;ayoutl);
insetsPanel2.setLayout(flowLiayoutl);
insetsPanel2.~etBorder(new
EEmptyBorder(1O, 1O, 1O, 1O));
gridLayout1setRows(4);
gridLayout1.setColumns(l);
istPreguntas.setBounds(newIRectangle(29, 93, 213, 303));
txtaRespuesta.setBounds(ne\iv Rectangle(374, 93, 365, 300));
btnAceptar.setBounds(new Rectangle(470, 419, 184, 43));
btnAce ptar .set Label("Aceptar'l);
btnAceptar.addActionListener(newjava.awt.event.ActionListener()
{
public void actionPerformed(ActionEvente)
{
btnAceptar-actionPetformed(e);
1);
1
btnCancelar.setBounds(newFZectangle(86, 425, 93, 33));
btnCancelar.setLabel("Cancelar");
btnCancelar.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvente)
{
bt nCance lar-ac:t io nPerformed(e) ;
1
1);
J
btnCargarResp.setBounds(newRectangle(254, 203, 112, 36));
btnCargarResp.setLabel("Cargar Respuesta");
btnCargarResp.addActionListener(newjava.awt.event.ActionListener()
{
public void actionPerformed(ActionEvente)
{
btnCargarResp.-actionPerformed(e);
1);
1
IblPregs.setBounds(new Rectangle(95, 62, 61, 24));
IblPregs.setText("Preguntas");
IblResp.setBounds(new Rectangle(539, 68, 70, 24));
IblResp.setText("Respuesta");
label2.setText(version);
insetsPanei3.setLayout(gridLayout1);
insetsPanel3.~etBorder(new
EmptyBorder(1O, 60, 1O, 1O));
button 1.setText("OK");
button 1.addActionListener(th¡s);
insetsPanel2.add(imageControl?, null);
112
I
panel2.add(insetsPane12,BorderLayout.WEST);
this.add(panel1, null);
insetsPanel3.add(labe12,
null:);
panell .add(btnAceptar, null);
panell .add(btnCancelar, null;);
panel 1.add(btnCargarResp, riull);
panell .add(lblPregs, null);
panell .add(lblResp, null);
panell .add(lstPreguntas, null);
panell .add(txtaRespuesta, null);
panel2.add(insetsPane13,6orderLayout.CENTER);
panell .add(insetsPanell, null);
insetsPanel1.add(buttonl , null);
panell .add(panel2, null);
protected void processWindowEvent(WindowEvent e) {
if (e.getlD() == WindowEvent.WINDOW-CLOSING){
cancel();
1
I
super.processWindowEvent(e);
void cancel() {
dispose();
I
public void actionPerformed(ActionE\rente) {
if (e.getSource() == buttonl) {
cancel();
I
I
protected void cargaPregs(){
Enumeration pregs=ctrlPregs.getPreguntas();
while(pregs. hasMoreElements()){
IstPreguntas.addltem((String)pregs.nextElement0);
I
void btnAceptar-actionPerformed(Ac1:ionEvente)
{
String sTexto=txtaRespuesta.getText();
txtapadre. append(sText0);
dispose();
1
void btncancelar-actionPerformed(ActionEvente)
{
dispose();
II3
void btnCargarResp-actionPerformed(ActionEvente)
{
int index=lstPreguntas.getSelectedlndex();
String texto=null;
//texto= ctrlPregs.getPregunta(index);
txtaRespuesta.append(text0);
1
class CtrlPreguntas{
String cveMaestro;
String cveUEA;
String SERVLET-PATH;
String cervletURL;
CtrlPreguntas(String SERVLET-PATH,String servletURL,String cveMaestro,String
cveUEA){
this.cveMaestro=cveMaestro;
this. cveUEA=cv eUEA;
this. S ERVLET-PATH=S ERVLET-PATH ;
this.servletURL=servletURL;
1
protected Enumeration getPreguntas(){
Vector pregs=nuII;
String
query="?modo=lst_preguntas&cveUEA="+c\~eUEA+"&cveUsuario="+cveMaestro;
query=SERVLET-PATH+queiy;
try{
URL urlServlet=new URL(serv1etURL);
URL urlServletGet=new URL(urlServlet,query);
URLConnection conexiion= urlServletGet.openConnection();
conexion.setDefaultUseCaches(false);
conexion.setUseCaches(false);
conexion.set Dolnput(true);
conexion.setDoOutput(false);
ObjectlnputStream
in=new
ObjectlnputStream(conexion.getlnputStream());
pregs=(Vector)in.readObject();
1
catch(l0Exception e l ) {
e l .printStackTrace();
1
catch(C1assNotFoundException e3){
e3. printStackTrace0;
1
Enumeration enum=pregs.elernents();
return enum;
protected String getRespuesta(String cvePregunta){
String sigLinea=null;
String query="?modo=repues,ta&cvePregunta="+cvePregunta;
query=SERVLET-PATH+query;
try{
URL urlServlet=new LlRL(serv1etURL);
URL urlServletGet=new URL(urlServlet,query);
URLConnection conexion= urlServletGet.openConnection();
conexion.setDefaultUseCaches(false);
conexion.setUseCachles(false);
conexion.setDolnput(true);
conexion.setDoOutput(false);
conexion.connect();
BufferedReader(new
BufferedReader
in=new
InputStreamReader(conexion.getlnputStreaim()));
sigLinea=in.readLine();
if(sigLinea.startsWith("+")){
sigLinea=in.reaidline();
return siglinea;
1
1
else sigLinea="Error al cargar respuesta"+sigLinea;
catch(l0Exception e l ) {
e l .printStackTrace();
1
//E
numerat io n enum=pregs.e Iement s() ;
return siglinea;
import borland.jbcl.*;
import java.awt.*;
import java.util.*;
import java. awt .event .*;
import borland.jbcl.control.*;
import borland.jbcl.layout.*;
import com.sun.java.swing.*;
public class CuadroDialogo extends Dialog {
Button BtnCerrar=new Button();
public CuadroDialogo(Frame padre,String nlombre,List Lista2) {
super(padre,"Historial de "+ nombre, false);
enableEvents(AWTEvent.WINDOW-I3/ENT_MASK);
try{
cuadro();
dibujaArea(Lista2);
dibujaBoton();
85
I
catch(Exception e){
e.printStackTrace();
I
1
pack();
private void cuadro() throws Exception{
this.setBackground(new Color( 129, 181, 172));
this.setLayout(nul1);
setLocation(450,15);
resize(340,550);
I
private void dibujaArea(List Lista2) throws Exception{
TextAreaControl Area= new TextAreaControl();
//Area.
Area.setBackground(new Color(255, 255, 255));
Area.setBounds(new Rectangle(15,25310,450));
Area.appendText( Lista2.getSelectedltem());
Area. set Editable(faIse);
this.add(Area);
I
private void dibujaBoton() throws Exception{
BtnCerrar.setBounds(new Rectangle(105,500,135,32));
BtnCerrar.setLabel("Cerrar");
BtnCerrar.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEIvente){
Bt nCerrar-Act i(3nPerformed(e);
I
1);
1
this.add(BtnCerrar);
//cierra el cuadro de dialogo con el icono :>(
protected void processWindowEvent(:WindowEventevt){
if (evt.get IDO==WindowEvent.WI NDOW-CLOSI NG){
this.dispose();
I'
'I
1
I
super. processWindowEvent(evt);
//cierra el cuadro de dialogo
pubIic void Bt nCerrar-Act ion Performed(ActionEvent e){
dispose();
}
CHAT APPLET
import java.applet.Applet;
import java. awt.*;
import java. net.*;
import java.io.*;
import java.util.*;
public class ChatApplet extends Applet implements Runnable{
private static final String SERVLET-PATH = "/servlet/chat.ChatServlet";
Label userlnfo;
Label messagelnfo;
Label listlnfo;
Button sendButton;
TextField userText;
TextArea messageText;
List userList;
URL chatURL;
URL servletURL;
URLConnection connect;
volatile private boolean loggedin = false;
String username=null;
Thread pollingThread = null;
//Lista de parametros.
public String[][] getParameterlnfo0 {
return null;
1
//Describe el applet.
public String getAppletlnfo() {
return "ChatApplet - Applet";
1
public synchronized void init() {
if (pollingThread != null) return; //LlamaIra a init() siempre antes de hilar
super.init();
resize(500,300);
userlnfo = new Label("Teclea mensaje:");
messagelnfo = new Label("Area de meiisajes:");
userText = new TextField(40);
send Butt on = new Button("Enviar'l);
messageText = new TextArea( 10,40);
messageText.seiEditable(fa1se);
//Inicializa el panel principal
Panel mainp = new Panel();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = O;
gbc.weighty = O;
gbc.gridx = O;
gbc.gridy = O;
gbc.gridwidth = 10;
gbc.gridheight = 1;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fil1 = GridBagConstraints.NONE;
mainp.setLayout(gb1);
gbl.setConstraints(userlnfo, gbc);
mainp.add(userlnfo);
gbc.gridy = 1;
gbc.gridwidth = 9;
g bc.f iII = GridBagCo nst raint s. HOR IZOIVTA L;
g bl.setConstraints(userText,gbc);
mainp.add(userText);
gbc.gridx = 9;
gbc.gridwidth = 1;
gbc.fill = GridBagConstraints.NONE;
g bI.setConst raint s(se nd Button , g bc) ;
mainp.add(sendButton);
gbc.gridx = O;
gbc.gridy = 2;
gbc.gridwidth = 10;
g bI.setConst raint s (message Info , g bc) ;
mainp.add(messagelnfo);
gbc.gridy = 3;
gbc.weighty = 100;
gbc.gridheight = 1O;
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(messageText,gbc);
mainp.add(messageText);
Panel userp = new Panel();
userp.setLayout(new BorderLayoutO);
listlnfo = new Label("Usuarios en el chat:");
userp.add("Nortt-i",listlnfo);
userList = new List(l0, false);
userList.addltem("Ningun usuario.");
userp.add("Center",userlist);
setLayout(new BorderLayoutO);
add("Center" ,mainp) ;
add("East",userp);
// URL base(Donde se cargo el applet.
chatURL = getCodeBase();
//Inicializa y comienza el hilo colector.
int currPriority = Thread.currentThread().getPriority();
int newpriority = currPriority == ThreadMIN-PRIORITY ? Thread.MIN-PRIORITY
currPriority - 1;
pollingThread = new Thread(this,"Chat colector");
pollingThread.setDaemon(true);
pollingThread.setPriority(newPriority);
pollingThread.start();
p("Chat: Iniciando coleccion");
username=getParameter("nickname");
System.out.println("us: "+username);
login();
1
//Inicializa o reanuda el hilo
I**
* Start polling thread if not already runniing.
*/
public synchronized void start() {
if (!isLoggedin() && username != null) {
//login () ;
1
if (pollingThread != null && pollingThread.isAlive()) {
pollingThread.resume();
p("Chat: reanudando hilo");
} else {
p l ("Chat: No hay hilo colector!");
pollingThread = new Thread(this,"Chat colector");
pollingThread.setDaemon(true);
polIingTh read.start() ;
p("Chat: iniciando coleccion");
1
1
/**
*
*I
public synchronized void stop() {
if (pollingThread.isAlive())
{
pollingThread.suspend();
p("Chat: suspendiendo coleccion");
} else {
p l ("Chat: hilo principal muerto y en stop()!");
I
logout();
1
public synchronized void destroy() {
if (pollingThread != null && pollingThread.isAlive()){
pollingThread.stop();
pollingThread = null; //En caso de regresar
p("Chat: parando coleccion");
1
1
logout();
public void run() {
p("Chat: iniciando run()'');
while (!Thread.interrupted()) {
if (isLoggedin()) {
polllist();
p0~~0;
p("Chat: colectando");
} else {
1
1
1
pollList();
p("Chat: no ha entrado al chat paIra coleccion");
try {
Thread.sleep(5000); // Dormir por 1 seg
} catch (InterruptedException e) {}
//Aqui Io cambie
p("Chat: saliendo de run()");
private void login() {
if (username == null) return;
String
querystring
+
SE RVLET-PATH
"?modo=nuevo_usuario&usuario="+URLEncoder.encode(username);
p("Tratando de entrar como: "+usernarne);
try {
connect = (new URL(chatURL,queryString)).openConnection();
connect.setDefauItUseCaches(faIse);//Para futuras conexiones
connect.setUseCaches(faIse);//No usar caches para acelerar envio
connect .setDolnput(true);
connect.setDoOutput(false);
connect.connect();
p("Rea1izando conexion con: "+connsct);
-BufferedReader
in
new
BufferedReader(new
InputStreamReader(connect.getlnputStreaml()));
String responze = in.readLine();
if (response.startsWith("+")) {
setLoggedin(true);
showStatus("Entro al chat como 'I + username);
p("Entro como "+username);
userlnfo.setText("Tecleamensaje: ");
repaint();
} else {
showStatus("Error al entrar" + response);
p("No pudo entrar como "+username);
System.err.println("Error al intentar conexion:" +response);
1
} catch (MalformedURLException e2) {
System.err.println(e2);
e2. printStackTrace(System.err);
showStatus("Error al tratar de conectarse");
} catch (IOException e l ) {
System.err.println(e1);
e l .printStackTrace(System.err);
showStatus("Error al tratar de conectarse");
1
1
private void logout() {
if (!isLoggedin() 11 username == null) return;
90
String
querystring
+
SERVLET-PATH
"?modo=borra_usuario&usuario="+URLEncoder.encode(username);
try {
connect = (new URL(chatURL,queryString)).openConnection();
connect.setUseCaches(false);
connect.setDolnput(true);
connect.setDoOutput(false);
connect.connect();
-BufferedReader
in
new
BufferedReader(new
InputStreamReader(connect.getlnputStreanl()));
String response = in.readLine();
if (response.startsWith("+")) {
setLoggedin(fa1se);
showStatus("Usuario" + username + "ha salido del chat");
} else {
showStatus("Error al salir" + response);
System.err.println("Error al salir" +response);
1
} catch (MalformedURLException e2) {
System.err.println(e2);
e2. printStackTrace(System.err);
showStat us("E rror aI intentar saIir");
} catch (IOException e l ) {
System.err.println(e1);
e l .printStackTrace(System.err);
showStatus("Error al salir");
1
1
private void send() {
if(!isLoggedin()){return;}
String message = userText.getText();
if (message.equals("")) return; //No enviar un mensaje vacio
userText.setText("");
showStatus("Sending message");
String
querystring
+
SERVLET-PATH
"?modo=envia&usuario="+URLEncoder.encode(username);
querystring = querystring +"&mensaje=:"+URLEncoder.encode(message);
try {
connect = (new URL(chatURL,queryString)).openConnection();
connect.setUseCaches(false);//Para este
connect.setDolnput(true);
connect.setDoOutput(false);
connect.connect();
-BufferedReader
in
new
BufferedReader(new
InputStreamReader(connect.getlnputStream()));
String response = in.readLine();
if (response.startsWith("+")) {
showStatus("Mensaje enviado");
} else {
showStatus("Error al enviar mensaje" + response);
System.err.println("Erroral enviar mensaje" + response);
1
} catch (MalformedURLException e2) {
System.err.println(e2);
e2. printStackTrace(System.err);
showStatus("Error al enviar mensaje");
} catch (IOException e l ) {
System.err.println(e1);
e 1.printStackTrace (Syst em.err) ;
showStatus("Error al enviar mensaje");
1
private void poll() {
String
querystring
S ERVLET-PATH
"?modo=colecta&usuario="+URLEncoder.ericode(username);
try {
connect=(new URL(chatURL,queryString)).openConnection();
connect .setUseCaches(false);
connect.setDefaultUseCaches(false);
ObjectlnputStream in=new ObjectlnputStream(connect.getlnputStream());
String nextLine = (String)in.readObject();
if (!nextLine.startsWith("+")) {
showStatus("Error obteniendo meiisajes del servidor");
System.out.println("Error obteniendo mensajes : "+nextLine);
return;
1
nextLine = (String)in.readObject();
while (nextLine != null && !nextLine.equaIs(".")) {
System.out.println("Linea:"+nextLiiie);
messageText.append(nextLine+"\r'\n");
repaint();
nextLine = (String)in.readObject();
1
1
catch (IOException e) {
System.err.println(e);
e.printStackTrace(System.err);
showStatus("Error al checar el mensaje");
1
catch(C1assNotFoundExceptione l ) {
System.err.println(e1);
e l .printStackTrace(System.err);
showStatus("Error al checar el mensaje OBJ");
1
//Pregunta por la lista de usuarios
private void pollList() {
String querystring = SERVLET-PATH + "?modo=lista";
Vector users = new Vector();
92
+
try {
System.out.println("chatURL: + chatURL);
System.out.println("queryString: + querystring);
URL IistURL = new URL(chatURL,queryString);
System.out.println("listURL: + IiistURL);
URLConnection IistConn = listURL.openConnection();
listConn.setDefaultUseCaches(false);
listConn.setUseCaches(false);
listconn. connect();
BufferedReader
in
new
BufferedReader(new
InputStreamReader(listConn.getlnputStream()));
String nextLine = in.readLine();
if (!nextLine.startsWith("+")) {
showStatus("Error al obtener lista de usuarios del servidor");
p l ("Error obteniendo lista de usualrios del servidor");
return;
'I
'I
'I
1
nextLine = in.readLine();
while (nextLine != null && !nextLine.eqiuals(".")) {
p("Read user: "+nextLine);
users.addElement(nextLine);
nextLine = in.readLine();
1
if (!users.isEmpty()) {
userList.removeAll();
int size = users.size();
for (int i= O; i size; i++){
userList.addltem((String)users.elementAt(i));
1
} else {
userlist.removeAll();
userList.addItem ("Ningun usuario dentrol');
1
repaint() ;
} catch (IOException e) {
System.err.printIn(e);
e.printStackTrace(System.err);
showStatus("Error al obtener lista"+e);
I
I
//Checa si el usuario esta dentro.
public boolean isLoggedin() {
return loggedin;
1
//Pone variable
protected void setLoggedin(boo1ean newval) {
loggedin = newval;
1
public boolean action(Event evt, Object arg) {
93
if (evt.target == sendButton 1) evttarget == userText) {
if (isLoggedin())
send();
else {
username = userText.getText();
if (username.length() > IO) {
showStatus("1O o menos caracteres!");
} else {
userText.setText("");
login();
1
I
1
return true;
return super.action(evt,arg);
private void p(String debug) {
System .err.println("Chat:"+debug);
I
private void p l (String debug) {
System.err. printIn("Chat:"+debug);
I
private String getString(String q) {
return "/servlet/chat.ChatServlet" + "'?" + q;
1
public ChatApplet() {
try {
jbinit();
I
catch (Exception e) {
e. printStackTrace();
1
1
private void jblnit() throws Exception {
this.setBackground(new Color(129, 181, 180));
1
1
CHAT SERVLET
package chat;
import javax.servlet.http.*;
import javax.servlet. *;
import java.io.*;
94
import java.util.*;
public class ChatServlet extends HttpServlet implements Runnable {
private ListaUsuarios usuarios = new ListaUsuarios();
private final static String paginaDefault = '"/public-html/ChatApplet.html";
private Thread recolector;
// Timeout
protected static final int TIMEOUT = 95 * 150 * 1000;//5 minutos
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
int currPriority = Thread.currentThread().getPriority();
int newPriority = currPriority == Thread.MIN-PRIORITY ? Thread.MIN-PRIORITY :
currPriority - 1;
recolector = new Thread(this,"Chat Recolector");
recolector.setDaemon(true);
recolector.setPriority(newPriority);
recolector.start();
return;
1
public void destroy() {
super.destroy();
if (recolector != null && recolector.isAlive()) {
recolector. stop();
1
1
return;
public void doGet(httpServ1etRequest req, HttpServletResponse res)
throws IOException, ServletException {
Administracion admon=new Administracion(res,req);
String usuario, modo ;
if (req.getQueryString() == null) { //Regresar a la pagina inicial...
if (getlnitParameter("startpage"
)== null)
res.sendRedirect(paginaDefault);
res.sendRedirect(getInitParameter("ctarpage"));
ret urn;
1
modo = req.getParameter("modo");
usuario = req.getParameter("usuario");
if(usuarios.existe("maestro")l lusuario.equals("maestroll)>(
if (modo == null) {
admon.enviaError("Modo no iniciado");
return;
1
else if (usuario == null && !modo.equals("lista")) {
admon.enviaError("Usuario no indicado");
return;
1
95
1
1
else if (modo.equals("nuevo-usuario"))
admon.addNuevo(usuario,usuarios);
else if (modo.equals("borra-usuario"))
admon.borraUsuario(usuario,usuarios);
else if (modo.equals("colecta"))
admon.colectaMensajes(usuario,usuarios);
else if (modo.equals("envia"))
admon.envia(usuario,usuarios);
else if (modo.equals("lista"))
admon.regresa-listaUsuarios(usuarios);
else
admon.enviaError("Modo invalido.");
else
admon.enviaError("Clase no iniciada");
public void run() {
while (!Thread. interrupted()) {
Enumeration inactive = usuarios.inac:tive(TlMEOUT);
while (inactive. hasMoreElements()) {
String usuario = (String)inactive.nr?xtElement();
usuarios. borra(usuario);
ha finalizado su
usuarios.addMensaje(new Mensaje("Chat",usuario +
Timeout ."));
usuarios.addMensaje(new Men!;aje("Chat","Desechando "+usuario+" del
chat."));
log("Usuario "+usuario+" fuera de tiempo. Desechado del chat.");
'I
I
1
1
try {
Thread.sleep(TIME0UT); I/ Dormir por el TIMEOUT
} catch (InterruptedException e) {}
public
void
doPost(HttpServ1etRequect
req,HttpServletResponse
IOException,ServletException{
Adm inistracion admon=new Adm inistracion(res,req) ;
admon.envia(usuarios);
}
}//Fin servlet
.............................................................................
Clases básicas
............................................................................ I
class Administration{
HttpServletResponse res=nuil;
HttpServletRequest req=null;
Administracion(HttpServletResponseres,Hl:tpServletRequestres){
this.res=res;
96
res)throws
1
this. req=req;
protected void addNuevo(String usuario,LiistaUsuarios usuarios){
if (usuarios.existe(usuario)) {
enviaError("Usuario existe");
return;
1
if (!usuarios.add(usuario))
{
enviaError("Prob1ema al añadir usuario");
ret urn;
1
usuarios.addMensaje(new Mensaje("Au1a Virtual: ",usuario + ha entrado."));
enviaResp("Usuario ha entrado al Aula \/irtual.");
I'
protected void borraUsuario(String usuario,ListaUsuarios usuarios){
if (!usuarios.existe(usuario)){
enviaError("Usuario no existe");
return;
1
else if (!usuarios. borra(usuario)){
enviaError("Prob1ema al borrar al iisuario");
return;
1
usuarios.addMensaje(new Mensaje("Ch;it",usuario + ha dejado el chat."));
enviaResp("Usuario ha salido.");
I'
protected void colectaMensajes(String usu,ario,ListaUsuariosusuarios){
if (!usuarios.existe( usuario)){
enviaError Invalido usuario") ;
ret urn;
(I'
1
//Para maestro
if(usuario.equalc("maestro")) regresapreguntas( usuarios.getMensajes("maestro"));
//Para alumno
else regresaMensajes(usuarios.getMensajes(usuario));
usuarios. resetUsuario(usuario);
1
//Alumno envia pregunta
protected void envia(String usuario,ListaUsuarios usuarios){
String msjusuario = req.getParameter("mensaje");
if (msjusuario == null) {
enviaError("Mensaje no inicializado par,a envio");
return;
1
usuarios.addPregunta(newMensaje(usuririo,msjusuario));
enviaResp("Mensaje aceptado.");
97
1
//Maestro envia mensaje
protected void envia(ListaUsuarios usuarios){
try{
String mensaje=nuII;
ObjectlnputStream in=new ObjectlnputStream(req.getlnputStream());
mensaje=(String)in.readobject();
if (mensaje == null) {
enviaError("Mensaje no inicializado para envio");
return;
1
1
usuarios.addMensaje(new Mensaje('lmaestro'I,mensaje));
enviaResp("Mensaje aceptado.");
catch(l0Exception e){
e. printStackTrace();
1
catch(C1assNotFoundException e l ) {
e l .printStackTrace();
1
1
protected void enviaError(String error) {
try {
Printwriter pout = new PrintWriter(res.getOutputStream());
pout print("-ERR "+error+"\r\n");
pout.flush();
pout.close();
} catch (IOException e) {
// Pendiente
1
1
protected void enviaResp(String resp) {
try {
res.setDateHeader("Expira",System.currentTimeMillis());
Printwriter pout = new PrintWriter(res.getOutputStream());
pout. print("+OK "+resp+"\r\n");
pout.flush();
pout.close();
1
catch (IOException e) {
// Pendiente
protected void regresaPreguntas(Enumeration lista-mensajes) {
try {
res.setDateHeader("Expira",System.currentTimeMillis());
Printwriter pout = new PrintWriter(res.getOutputStream());
pout. print("+OK\r\n");
98
while (lista-mensajes. hasMoreElements()){
Mensaje mensaje = (Mensaje) lista-mensajes.nextElement();
pout.print(mensaje+"\r\n");
1
1
pout.print(".\r\n");
pout.fl ush() ;
pout.close();
catch (IOException e) {
// Pendiente
1
I
protected void regresaMensajes(Enumerationlista-mensajes){
try{
res.setDateHeader("Expira",System.cLirntTimeMillis());
ObjectOutputStream out=new ObjectCiutputStream(res.getOutputStream());
out.writeObject("+OK\r\n");
while (Iista-mensajes .hasMo reElements()) {
Mensaje mensaje = (Mensaje) lista-mensajes.nextElement();
out .writeObject(mensaje+"\r\n");
I
out .writeObject(".\r\n");
out.flush();
out.close();
1
catch(l0Exception e){
e.printStackTrace();
1
1
protected void regresa-listaUsuarios(ListaUsuariosusuarios) {
try {
res.set DateHeader("Expira",System.currentTimeMillis());
Printwriter pout = new PrintWriter(res.getOutputStream());
pout.print("+OK\r\n") ;
Enumeration IistaUsuarios = usuarios.lista();
while (IistaUsuarios.hasMoreElements()){
pout.print((String)listaUsuarios.nextl_lement());
pout.print("\r\n");
1
1
pout.print (" .\r\n") ;
pout.flush();
catch (IOException e) {
//Pendiente
I
1
}//Fin administración
//Lista de usuarios y S ~ J Soperaciones.
class ListaUsuarios {
99
private Hashtable lista = new Hashtable();
private Hashtable active = new Hashtable();
ListaUsuarios() {
1
protected synchronized boolean add(Stririg usuario) {
if (existe(usuario)) return false;
lista. put(usuario, new ColaMensajes())
touch (usuario) ;
return true;
1
protected synchronized Enumeration lista() {
return lista.keys();
1
protected synchronized boolean borra(String usuario) {
if (!existe(usuario)) return false;
lista.remove(usuario);
active. remove(usuario);
return true;
1
//Checa la existencia de un usuario
protected boolean existe(String usuario) {
return lista.containsKey(usuario);
1
protected void addMensaje(Mensaje mensaje) {
Enumeration todosUsuarios = lista.keys();
while (todosUsuarios.hasMoreElements()){
String usua=(String) todosUsuarios.nextElement();
if(!usua.equals("maestro"))
addMensajeUsuario(usua,mensaje1;
1
1
protected void addPregunta(Mensaje mensaje){
addMensajeUsuario("maestro",mensaje);
I
private void addMensajeUsuario(String usuario, Mensaje mensaje) {
1
((ColaMensajes)lista.get(usuario)).add(rnensaje);
protected void resetUsuario(String usuario) {
((ColaMensajes)lista.get(usuario)).recetl();
I
//Regresa una enumeracion de los mensajes esperados por el usuario
protected Enumeration getMensajes(String usuario) {
to uch (usuario);
1O0
1
return ((ColaMensajes)lista.get(usuario)).listaMensajes();
//Actualiza el Timeout para un usuario
protected synchronized void touch(String usuario) {
if (existe(usuario)) {
active.put(usuario, new Long(System.currentTimeMillis()));
}
1
//Regresa una enurneracion de los usuariois inactivos
protected synchronized Enumeration inactive(int timeout) {
Vector inactive = new Vector();
long now = System.currentTimeMillis();
long when = now - timeout;
Enumeration usuarios = lista.keys();
while (usuarios. hasMoreElements()) {
String usuario = (String)usuarios.nextElement();
if (((Long)active.get(usuario)).longValue()when) {
inactive.addElement(usuario);
1
1
1
return inactive.elements();
}//Fin Listausuarios
//Lista de mensajes
class ColaMensajes {
private Vector cola-mensaje = new Vector();
ColaMensajes() {}
//Anade mensajes a la cola
protected synchronized void add(Mensaje mensaje) {
cola-mensaje. addElement(mensaje);
notifyAll();
1
//Regresa una lista de mensajes en la cola y se bloquea hasta que un mensaje
//esta listo para envio
protected synchronized Enumeration listalVlensajes() {
try {
if (cola-mensaje.isEmpty()) {
wait(30*1000); //30 second timeouit
1
} catch (InterruptedException ¡e) {
//Pendiente
1
1
return cola-mensaje.elements();
protected synchronized void reset() {
cola-mensaje. removeAIIElements();
1
101
}//Fin ColaMensajes
//Mensaje que envia un usuario y que guarda en la cola de todos los usuarios
class Mensaje {
private String usuario;
private String mensaje;
Mensaje(String usuario, String mensaje) {
this.usuario = usuario;
thkmensaje = mensaje;
1
public String tostring() {
return usuario+": "+mensaje;
1
protected String getuser() {
return usuario;
1
protected String getMensaje() {
return mensaje;
1
}//Fin Mensaje
I o2
MODELO DEL DOMINIO DEL PROBLEMA GENERAL
\
'\
Esta en
Tiene
1 1
Fonm p i e de
11
en
-
CUAS
~ ~ üse
r %e
m
\ n i
I
fiene
103
5. DESARROLLO PRACTICO (Segundo Prototipo).
En la etapa práctica del proyecto, elanálisis se hizo empleando las técnicas
del Análisis y Diseño Orientado a Objetos (ADOO), por lo que primeramente
mostraremos un modelo de requerimientos general y después centraremos la
atención en los casos individuales y sus especializaciones. En cada caso se
presentara el modelo de casos, de interfaz y de dominio del problema.
5.1 Modelo de requerimientos a nivel general.
Diagrama General de Use Cases del Chat
\
h
Maestro
ValdaMaestro
MaestroDaCiase
AlummTmaClase
ValidaAlunno
Alumno
Maestm
Pregunta
Alumno
Maestro
Respwde Pregunta
Regune
5.2 Modelo de requerimientos para catla Use Case.
En esta parte analizaremos cada UC del Modelo de requerimientos a nivel
general, la forma de hacerlo será primeramente el lado de los UC del Maestro y
después continuaremos con los UC del Alumno.
5.2.1 Modelo de Requerimientos: Use Case ValidaMaestro
Modelo de Casos.
El siguiente diagrama de casos muestra la validación que tendrá que realizar el
maestro, cada vez que ingrese al sistema.
ValidaMaestro
Maesiro
I04
Descripción del caso:
8
emdeado. Password v Dresiona enviar.
El sistema valida la clave de empleado y su password.
Si los datos son correctos el sistema despliega una lista de cursos donde
el maestro esta dado de alta para impartir clases.
El maestro elige el curso al que desea ingresar y presiona enviar.
El maestro entra al Aula Virtual.
I Fin del Caso.
Modelo de Interfaz.
105
106
Diagrama de Navegación de Pantallas
Diagrama de navegacion de inieriaz
Dalolncamdo
t
OITestMaestm
I
~
\
OILiStaCum
ValidaMaestm
-
SeleuonaCum
3
SelecionaMaeStw
A
107
Modelo del Dominio del Problema.
Paso
1
2
3
4
5
6
7
8
Descripción UC Valida Maestro
El sistema despliega una lista de modo de entrada.
El maestro selecciona el modo de entrada maestro.
El sistema despliega una pantailla donde el maestro introduce su Clave
de empleado, Password y presiona enviar.
El sistema valida la clave de empleado y su password.
Si los datos son correctos el sistema despliega una lista de cursos
donde el maestro esta dado de alta para impartir clases.
El maestro elige el curso al que desea ingresar y presiona enviar.
El maestro entra al Aula Virtual.
IFin del Caso.
:
I
I
-
cMaestro
ccurso
NombreProfesor
5.2.2. Modelo de Requerimientos: Use! Case MaestroDaClases
Este Use Case tiene dos especializaciones, que son:
Use Case Maestro Pregunta
0
Use Case Maestro Responde Pregunta
0
Estos Uses Cases se describen a continuación.
5.2.2.1. Modelo de Requerimientos: Use Case Maestro Pregunta
Modelo de Casos.
El siguiente diagrama de casos nos muestra como el maestro puede enviar una
pregunta a los alumnos.
~*
/
\
Maestro
Maestro
Pregunta
108
A\
/’
Alumno
Descripción del caso:
Paso Descripción UC Maestro Pregunta
Maestro teclea pregunta en el área de teclea mensaje a enviar.
1
Maestro presiona enviar.
2
I 3 I Sistema lleva la Dreaunta a todos los alumnos.
4 TFin del caso.
~
~~
Modelo de Interfaz.
109
I
Diagrama de Navegación de Pantallas.
Teclea
Pregunta
O
/
I
:Se coloca en
\
u~
~-
~~
Pantalla Principal del Maesro)
&-
EnWar
Modelo de/ Dominio de/ Problema.
ivbestro
NombreProfesor
__
*E nvia ()
110
_
_
.
j
I
I
->
\
\
1-3
I
Area de teclea mensaje
I‘
I
5.2.2.2 Modelo de Requerimientos: Use Case Maestro Responde Pregunta
Modelo de Casos
El siguiente diagrama de casos se muestra como el maestro puede responder a la
pregunta de un alumno.
,
-I.
Maestro
/,
\
\
;
Res ponde Pregunta
-
\
I--
Alumno
Descripción del caso:
IPaso I Descritxión UC Maestro Responde Pregunta
1
2
3
4
5
Sistema trae al área de mensajes la pregunta del Alumno.
Maestro teclea la respuesta dentro del área de teclea mensaje a enviar.
I Maestro presiona enviar.
1 Sistema envia a todos los alumnos la respuesta.
IFin del caso.
111
Modelo de Interfaz.
Diagrama de Navegación de Pantallas
Teclea
Respuesta
-1
' Pantalla
Pnncipal del Maestro
,
Maestro
Observa
Pregunta
Area de Mensajes
~
~-
>
A
Enwar
I12
\
Secoloca
-
~
>
t
Area de mensajes a enwar
Modelo del Dominio de/ Problema.
la respuesta.
~
~
Maestro
CGProfesor
PasswordP rofesor
Nombreprofesor
~
WoiecteP regunta()
*En\na()
5.2.3. Modelo de Requerimientos: Use Case ValidaAlumno
Modelo de Casos.
El siguiente diagrama de casos muestra la validación que tendrá que realizar el
alumno, cada vez que ingrese al sistemai.
ValidaAlumno
ALimru
Descripción del caso:
Paso
I
2
3
4
5
6
7
8
Descripción UC Valida Alumno
El sistema despliega una lista de modo de entrada.
El alumno selecciona el modo de entrada alumno.
El sistema despliega una pantallla donde el alumno introduce su matricula,
password y presiona enviar.
El sistema valida la matricula y le1password.
Si los datos son correctos el sistema despliega una lista de cursos donde
el alumno esta dado de alta, para tomar clases.
El alumno elige el curso al que desea ingresar y presiona enviar.
El alumno entra al Aula Virtual.
1 Fin del Caso.
113
Modelo de Interfaz.
114
115
Diagrama de Navegación de Pantallas
Diagrama de navegacion de interfa2
A
SelecionaNumno
Modelo del Dominio del Problema.
I Paso 1 DescriDción UC Valida Alumno
1
2
3
4
5
6
7
8
El sistema despliega una lista de modo de entrada.
El alumno selecciona el modo (de entrada alumno.
El sistema despliega una pantalla donde el alumno introduce su
matricula, password y presiona enviar.
El sistema valida la matricula y el password.
Si los datos son correctos el sistema despliega una lista de cursos
donde el alumno esta dado de ,alta, para tornar clases.
El alumno elige el curso al que desea ingresary presiona enviar.
El alumno entra al Aula Virtual.
I Fin del Caso.
I
I
~-
cCurso
~~
cAlurnno
__
MaQicula
PasswrdAlumno
NombreAlumno
~~
I
I
1,
,
~-
I
5.2.4 Modelo de Requerimientos: Use Case AlumnoTomaClase
Este Use Case tiene dos especializaciones, que son: \
Use Case Alumno Pregunta
0
Use Case Alumno Responde Pregunita
0
Estos Uses Cases se describen a contiriuación.
116
5.2.4.1 Modelo de Requerimientos: Use Case Alumno Pregunta
Modelo de Casos.
El siguiente diagrama de casos muestra como el alumno puede realizar una
pregunta al maestro.
Alumno
Alumno
P mgu nta
Descripción del caso:
Modelo de Interfaz.
117
Maestro
Diagrama de Navegación de Pantallas
Teclea
Pregunta
/
A I
I
\
-
Se coloca
~
--
-7
-
~
f
s
Pantalla Principal del Alumno
\
JL
~-
~~
-~
Area de mensajes a enviar
I
/
-p
p
-
--
I
~
Enviar
Modelo del Dominio del Problema.
Paso
1
2
3
4
Descripción UC Alumno Pregunta
Alumno teclea pregunta en el area de teclea mensaje a enviar.
Alumno presiona enviar.
Sistema lleva pregunta al maestro y a los demás alumnos.
Fin del caso.
Aluinno
-
~-
---
PasswordAlumno
5.2.4.2 Modelo de Requerimientos: Use Case Alumno Responde Pregunta
Modelo de Casos.
El siguiente diagrama de casos muestra como un alumno puede contestar la
pregunta realizada por el maestro.
A
,
/A\\
Alumno
Alumno Responde Pregunta
Maestro
Descripción del caso:
I Paso I Descrimión UC Alumno ResDonde Preaunta
Sistema trae al área de mensajes la pregunta del Maestro.
Teclea la respuesta dentro del área de teclea mensaje.
El Alumno presiona enviar.
El Sistema envia al maestro la respuesta junto con el nombre del alumno.
Fin del caso.
Modelo de Interfaz.
I19
Diagrama de Navegación de Pantallas.
Teclea
respuesta
a
Alumno
Obsetw
Pregunta
A
~
~~~
/
Se coloca
-
/Area de mensajes
Pantalla Principal del Alumno
+
:
-
- - > I
1 Area de mensajes a enuar
A
Enwar
Modelo de/ Dominio del Problema.
1 Paso 1 Descrbción UC Alumno ResDontle Preaunta
1
2
3
Sistema trae al área de mensajes la pregunta del Maestro.
El Alumno teclea la respuesta dentro del área de teclea mensaje de
enviar.
El Alumno roresiona enviar.
El Sistema envía al maestro la respuesta junto con el nombre del
alumno.
Fin del caso.
Aiuinno
~~
~
.__
Matricula
PasswordAlumno
Nombre
~~
K o l e c t a P regunta()
+En\na()
5.3 Modelo de Análisis para cada Use (",ase.
5.3.1 Escenarios explorados.
Los escenarios que se exploraron. corresponden únicamente al encontrado
en el marco de "Simple Correcto", ya que al ingresar a otro escenario, en el que la
120
clave de acceso del alumno o el profesor sean incorrectas, el sistema simplemente
no entra en ejecución, por lo que se omiitieron diagramas que no tiene gran valor
ilustrativo.
Diagramas de Colaboración.
Modelo de Análisis: Use Case ValidaMaestro
DIAGRAMA DE COLABORACION DE UCVALIDAMAESTRO
1 Selecciona Maedm+Envia
J\
>--I
I
1 -
OIE~~~~MO~O-
__
~
~
Maedm
2 Siítema DespliegaPantalla
V
3 Captura CveEmpIeado+Paswd
>
\
5 GeiDala(0deErnpl Pa5Vlbid)Dalos
4 Valida(CveEmp P a s w d ) Cuiais
OIPamd
h
lv
'
Maedm
ñ Sistema DepliegaCursos
9 SeleccionaCum
-
V
OISeleccionaGNpo
v2Padaedm
>
I
,
1
-
~
6 Clasfic4GNpo<CveEm~T i m ) Dalos
i
/
-
--
Maesirn
7 GelGNpos(CveEmpl Tnrn)CveUEANornbreCuno CveGNpo
V
~
10 EntiaAula
OlAulaVirlual
AppletMaedrn
Modelo de Análisis: Use Case Maestropregunta
2: 01. Teclea Pregunta
->
/
1 Entra O1
/
->
1
/'
\
3: ON. Envia( )
3
I
0 1 :Paitaiia principal
-'
del Maestro
-
\
: Maestro
121
~
0N.Envia
~
-
Pregunta
Modelo de Análisis: Use Case MaestroRespondePregunta
3: 01: Teclea Respuesta
,
I
I
1: Entra
>
I
ON: Muestra
P requnta
~
01: Pantalla IPrincipal
del Maestro
: Maestro
~
2: ON: Colecta Pregunta
4. ON: Enbia( )
~
>
-
--_____
-
ON: E n i a
Respuesta
L -
1
Modelo de Análisis: Use Case ValidaAlumno
DIAGRAMA DE COLAEORACION DE U C V A L I D M L U M N O
1 Selecciona:Alumno+Envia
Alumno
2 Sirtema Deq>liegaPantalla
V
3 Captura Matncula+Pawmd
5 GeiData(Matncula PassWord) Datos
4 V a l l d a ( M a i n w l a , P a i r d )Cursis
IONPap&dAlumno
v2Pass4lumno
Alumno
J
8 Sistema DepliepaCuroos
9 SeleccionaCurn,
V
>
ODAlumno
alumno
6 CIasificaG~ipos(Maricula.Tirm)Datoz
-_____
ONSelea cnaCursm
CNSelCum
____-
-Alumno
7 GetGwpoqMatncula Tnm) CveUEA h b m b r e c u m CveGRipo
12.2
Modelo de Análisis: Use Case Alumno Pregunta
2: 01: Teclea Pregunta
->
1 Entra O1
>
A
3 ON: EnLia()
01 : Pantalla Principal
del Alumno
-
i
/'
,
~-
',
-3
'
_ _
-
O N : Envia
4 Prequnta
I
..
.
A
: Alumno
Modelo de Análisis: Use Case Alumno Responde Pregunta
3: 01: Teclea respuesta
--
1 1
1 Entra O1
Ii
\
-
/
>
-
I
Í
- ._
_I
_
I
: Alumno
I
~
-
I
i
Jo"p,guns:
-
01: Pantalla Principal
del Alumno
----A
I
~
< -
2: ON: Colectapregunta()
4: ON: EnLia( )
->
L
123
-
-~
-~
~
ON: Envia
_i Respuesta
5.4. Modelo de Diseño.
Modelo de Diseño: Use Case ValidaMaestro.
Modelo de Diseño: Use Case Maestro Pregunta.
2: 01: Teclea Pregunta
~
II ~
124
<
I
I
3: ON: E n i a ( ) I
Modelo de Diseño: Use Case Maestro IResponde Pregunta.
'\
/
\
- _____.____
ON: Muestra
p~~
01: Pantalla
: Maestro
Principal del
1 EntrS
1
I
ON: Envia---
~
Pregunta
Respuesta
J
p-_
p. - -L
L
____
~
->
I
2. ON: Colecta Pregunta
<-
- -
~
-~
IT
3: 01: Teclea Respuesta
p
p
<---
I
~
4: ON: Envia( )
p
I
-
~
Modelo de
A
<
,
I
Modelo de Diseño: Use Case Alumno P'regunta.
o l 3 antaiia
-
. Alumno
Principal del
1
ON : EnLia
Pregunta
2: 01: teciea Pregunta
-
~~
~<
~~
3: ON: Envia( )
->
I
I
I
I
Modelo de Diseño: Use Case Alumno Ftesponde Pregunta.
,/\
______
~
: Alumno
I.Entra O1
____
-
_~~_____
>-
2. ON. Colec.taPregunta()
<
3: O1 Teclea respuesta
-
I <
~
4: ON:'Envia( )
5. DESARROLLO PRACTICO (Tercer Pirototipo).
En la etapa práctica del proyecto, el análisis se hizo empleando las técnicas
del Análisis y Diseño Orientado a Objetos (ADOO), por lo que primeramente
mostraremos un modelo de requerimieiitos general y después centraremos la
atención en los casos individuales y sius especializaciones. En cada caso se
presentara el modelo de casos, de interfaz y de dominio del problema.
5.1 Modelo de requerimientos a nivel general.
Diagrama General de Use Cases del Chat
Mae~iro
ValdaMaestm
MaesIroDaClase
__
AlunnoTmaClase
Vali d a lunno
Alunno
~
l
\
)
Ma~stro
Prma
\
/
Alunno
Respande Pregunta
Maestro
Responde Pregunta
5.2 Modelo de requerimientos para cada Use Case.
En esta parte analizaremos cada IJC del Modelo de requerimientos a nivel
general, la forma de hacerlo será primeramente el lado de los UC del Maestro y
después continuaremos con los UC del Alumno.
127
Use Case Envío Avisos Profesor.
OBJETIVO
El profesor en ( eterminado momento desea mandar un av,so de cualquier tipo a
los alumnos y se implemento esta funcion.alidad para poder lograrlo.
DESCRIPCION
De alguna forma este Use Case nos permite mandar un aviso a todos los alumnos
que se encuentren en la clase del profesor, no necesariamente se lleva a cabo en el
momento de la clase ya que al profescr se le puede olvidar y posteriormente
mandárselo, por lo que el envío se lleva acabo fuera del aula de clase, este aviso
posteriormente puede ser utilizado por los alumnos, pero tiene una fecha de
vigencia y en caso de no observarlo se eliminara del sistema.
1. Use Case Envío Avisos Profesor.
USE CASE
ENVIO AVISO PROFESOR
profesor
1.-Oprime botón de avíso.(actor)
2.-Muestra Pantallla de avíso.(sistema)
3 .-Introduce palabra clave. (actor)
4.-Introduce clave profesor.(actor)
5.-Escribe fecha de vigencia.(actor)
6.-Escribe dia. (actor)
7 .-Escribe mes.(actor)
8.-Escribe año.(actor)
9.-lntoduce avíso.(actor)
10.-Valída vigencia.(sistema)
128
11.-Oprime botón envía avíso.(sistema)
Envío Aviso Profesor
Layouts de pantallas (Use Case Envío de Aviso Profesor)
El profesor selecciona Avisos
129
El profesor llena los campos correspondientes
130
El sistema muestra el aviso guardado en la base de datos
Datos enviados a l a Base de datos
Palabra c1ave:presentacion
Clave Materia:215 11 1
gnipo:CG51
vigencia
mes:l
añ0:Ol
avisoxomo estan m i s alminos de clase
clave aViso:16
131
El sistema muestra pantalla de error
132
Diagrama de Estado (Use Case Envío Aviso Profesor)
iriao
V
V
fin
En esta tabla se guardan los atributos utilizados para la base de datos .
133
MOIJELO 111. ANAI 1SlS I>INAR/lICO
ESCENARIO USE CASE(Envío Aviso Profesor).
Dame palabra clave: feliz
Dame tu fecha de vigencia:
Día: 24
Mes : I 2
Año: O0
AVISO:
Les deseo feliz Navidad
Envíar OK.
Diagrama de Colaboración(Use Case Envío Avisos Profesor)
lo: hq.)
134
MODELO DE DISENO (Diagramas de Secuencia Use Case Envío Aviso Profesor)
9
DIAGRAMA DE SECUENCIA USE CASE ENVIO DE AVISOS PROFESOR
I
1: Oprime bdton aviso
1
2. Open()
pF
qobtieneciave(():ini
obtienedato(():int)
5
'
I
aptura Palabra Cv
7 Captura mes
8 Captura año
9 Captura aviso
10 EnviaOk( )
I
I
Y
ll
11: Obti
eFecha(dia,mes,á,d():int)
,
12:
i
i
,
13: Ha;
4
:tualizacion(dia,m
~~
r-
14: Insertadato claveaviso,profesm
135
+
,año,aviso)
Código Fuente del Use Case (Envío Aviso Profesor).
Servlet3
import javax.servlet.*;
import javax.servlet.http. * ;
import java.io.*;
import java.util.*;
import java.sql.*;
public class Servlet3 extends HttpServlet {
//Initialize global variables
private cconectabd oconectabd;
private Connection conex;
private cNgeneraclave oNgeneraclave;
//Correcta inicializacion del servlet
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
//inicia el servlet
oconectabd= new cconectabdo;
conex=oconectabd.regresaconexion();
oNgeneraclave= new cNgeneraclave(conex);
)//fin el init
//verificar el destroy
public void destroy{
try {
conex.close();}
catch(SQLException eql) {
System.out.println("No se pudo cerrar la base");
System.out.println(eql.getMessage());
I
}//fin de destroy
//Service the request
public void service(HttpServ1etRequest req, EittpServletResponse res) throws ServletException,
IOException {
int clave;
String uea=req.getParameter("CveUEA");
String grupo=req.getParameter("CveGrupo");
String claveprof=req.getParameter("CveProf I);
clave=oNgeneraclave.obtieneclave();
clave=clave+ 1;
despliegaclave(clave,claveprof,uea,grupo,re:;);
}//fin de service
public void despliegaclave(int clave,String claveprof,String uea,String grupo,HttpServletResponse resp)
//Se obtiene un tipo de respuesta
resp.setContentType("text/html");
//se obtiene un print writer para escribir texto
Printwriter out=null;
try t
out=resp.getWriter();
}catch(IOException e¡)
136
c
System.out.println("se ha producido un error");
}
System.out.println("claveaviso");
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv=Content-Type");
out.println("content=text/html; charset=iso-8859- 1>");
out.println("<meta name=GENERATOR content=Mici-osoft FrontPage 2.0>");
out.println("<title>Por favor,</title>");
out.println("</head>");
out.println("<body bgcolor=#FFFFFF>");//** * * * * * * * * ******me falto algo
out.println("<p><font size=5 face=Verdana><em>EN'dIO DE AVISOS A ALUMNOS</em></font></p>");
//out.println("<form actiori=littp://IisO7/xtodos/servletniaestro
method=POST>");
out.println("<form action=http://lis.uam.mx:8080/serv'letlproyectoCSH.avisos.servletmaestro
method=POST>");
out.println("<p>Clave de Aviso: <input type=text sizez=4name=claveaviso value="+clave+"></p>");
out.println("<p>Clave de Profesor:<input type=text size=5 name=profesor value="+claveprof+"></p>");
out.println("<p>Palabra clave:<input type=text size= 15 name=palabraclave> </p>");
out.println("<p>Clave Materia:<input type=text s i z e 6 name=cvemateria value="+uea+"></p>");
out.println("<p> grupo:<input type=text size=4 name=grupo value="+gnipo+"></p>");
out.println("<p>vigencia</p>");
out.println("<p>dia:<input type=text size=2 name=dia></p>");
out.println("<p>mes:<input type=text size=2 name=mi:s></p>");
out.println("<p>año:<input type=text size=2 name=año></p>");
out.println("<p><font size=6><strong>AVISO~/stronl:></font~~/p~");
out.println("<p><textarea naine=aviso rows=6 cols=6;!></textarea></p>");
out.println("<pre>
<input type=submit name= boton enviar");
out.println("value=Enviar>
<input type=reset") ,
out.println("name=boton limpiar value=Limpiar></pre>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
1
//Get Servlet information
public String getServletInfo() {
return "Servlet3 Information";
1
}
Clase cconectabd
137
import java.sql.*;
import java.lang.*;
import java.io.*;
public class cconectabd {
private String url;
private String driver;
private String usuario;
private String password;
private Connection conec;
public cconectabdo
{//metodo constructor
driver="sun.jdbc.odbc.JdbcOdbcDriver";
url="jdbc:odbc:Aula-Virtual";
usuario="SYS DBA";
password="masterkey";
try{//se inicializa el driver
Class.forName(driver);
1
catch(C1assNotFoundException e){
System.out.println("error en al conectar base de datos");
1
try{//se realiza la conexion
conec=DriverManager.getConnectiori(url,usuar¡o,
password);}
catch(SQLException ex){
System.err.println("SQLexception:"+
ex.getMessage());}
}//fin de constructor
public Connection regresaconexion() /*hicia metodo que regresa
la conexion a la base de datos */
return(conec);
1
}//fin de clase
138
Clase cNgeneraclave
import javax.servlet.*;
import javax.servlet. http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class cNgeneraclave {
private cDaviso oDavisol ;
public cNgeneraclave(Connection conec) {
oDavisol = new cDaviso(conec);
I
Ufuncion que regresa la la clave de aviso
public int obtieneclave()
{
int resul;
resul=oDavisol .obtienedato();
return( resuI);
I
I
Clase cDaviso
import javax.servlet.*;
import javax.servlet. http.*;
import java.io.*;
import java. utiI.*;
import java.sql.*;
public class cDaviso {
private Connection conecc;
private Statement st;
private Resultset rs;
private int clave;
private String consulta="select max(cveavisc1) from Tavico";
public cDavisoiConnection conec) {
conecc=conec;
I
public int syncronize obtienedato()
{
try{
st=conecc.createStatement();
rs=st.executeQuery(consulta);
}catch(SQLException e¡)
{
System.out.println("Se ha producido un error");
try{
while(rs. next())
139
//*************cerrar el recut set rs
clave=rs.getlnt( 1);
}//fin de while
}catch( SQLException e)
{
System.out.println("Se ha producido un error");
{
1
return(c1ave);
}//fin de obtienedato
}//fin de clase
Servletmaestro
package proyectoCSH.avisos;
import javax.servlet .*;
import javax.servlet. http.*;
import java. io.*;
import java.util.*;
import java.lang.*;
public class servletmaestro extends HttpSendet
//Initialize global variables
private String palabraclave =null;
private String cvemateria = null;
private String grupo = null;
private String dia = null;
private String mes = null;
private String año = null;
private String aviso=nuII;
private String profesor=null,claveaviso=null;
private cDrecibe oDactualiza;
private cDrecibe oDactualiza2;
private cDrecibe oDactualiza3;
public void init(Serv1etConfig config) throws ServletException
{
super.init(config);
oDactualiza=new cDrecibe();
oDactualiza2=new cDrecibe();
oDactualiza3=new cDrecibe();
} //fin de in¡
140
public void service(HitpServ1etRequest request, HttpServletResponse resp) throws
ServletException, IOException
{
Ion;
int ban=0,claveaviso2,profesor2,dia2,mes2,año2,grupo2,cvemateria2,
boolean error=false,error2=false;
claveaviso=request.getParameter("claveaviso");
profesor=request.getParameter("profesor");
palabraclave=request.getParameter("palabraclave");
cvemateria=request.getParameter("cvemateria");
grupo = request.getParameter("grupo") ;
dia = request.getParameter("dia");
mes = request.getParameter("mes") ;
año = request. get Parameter("a ño") ;
aviso=request.getParameter("aviso");
if((lon=palabraclave.length())!=O
&& (loii=grupo.length())!=O&& (lon=dia.length())!=O
&& (Ion=mes.length()) !=O
&& (lon=año.length())!=O && (lon=avisci.length())!=O)
{ claveaviso2=lnteger.parselnt(claveaviso);
profesor2=lnteger.parselnt(profesor);
dia2= I nteger. parseInt(d¡a);
cvemateria2=Integer.parselnt(cvemateiria);
mes2=lnteger.parselnt(mes);
año2=lnteger.parselnt(año);
ban=obtienefecha(dia2,mes2,año2, resp);
if(ban==O)
{
insertadatos(claveaviso2,
profesor2,cvemater'ia2,palabraclave,grupo,dia2,mes2,año2,aviso
1;
devuelvepaginaHTML(resp);}
1
else
despliegaerror(resp,1);
} //fin de service
public int obtienefecha(int dia2,int mes2,irit año2,HttpServletResponseresp)
{
int dial ,mes1,añol;
try {
Date fechaactual= new Date();
d ia 1=fechaactual .getDate();
mes1=fechaactual.getMonth()+l ;
año1=fechaactual.getYear();
if(año2<=año1)
if(mes2<mes 1)
141
{
despliegaerror( resp,2);
return( I ) ; }
else
{ if(mes2==mesl)
if(dia2cdial)
{
despliegaerror(resp,2);
return( I ) ; }
1
actualiza(dia1,mes1,añol);
}catch (Exception e) {
} //fin de catch
return(O) ;
}//fin de obtiene fecha
public void actualiza(int d, int m,int a) {
try{
oDactualiza.hazactualizacion(d,m,a);
}catch (Exception e) {
System.err.println("ServletMastro:
"+e);
1
} //fin de actualiza
//funcion insertadatos se encargade Insertar los datos de insertar recibidos del formulario
//a la base de datos correspondiente.
public void insertadatos(int claveaviso,int profesor,int cvemateria,String
palabraclave,String grupo, int dia,int mes,int año,String aviso)
{
oDactualiza2.insertainfo(claveaviso,profesor,cvemateria,palabraclave,grupo,dia,mes,año,a
viso);
..............................................................................
public void despliegaerror(HttpServletResp0nseres,int x)
{
//establece el contenido donde escribir
res.setContentType("text/html");
//se obtiene un prinwriter donde escribir
Printwriter out=null;
try{
142
/
out=res.getWriter();
}catch(lOException io){
System.out.println("se ha producido un error");
1
//genera el contenido del error html
out.printIn("<htmI>");
out.println("<head>");
out.println("<meta http-equiv=Content-Type");
out. println("content=text/html; charset=iso-8859-1>");
out.println("<meta name=GENERATOR content=Microsoft FrontPage 2.0>");
out.println("<title>Por favor,</title>");
out.println("</head>");
>");
out.println("<body background=http://lis.uam.mx/EducDistancia/f029.jpg
if (x==l)
out.println("<p><font size=5 face=Verdana><:em>Existeerror en el envio de tus datos, los
datos no estan completos.</em></font></p>");
else
out.println("<p><font size=5 face=Verdana><:em>Existe error en la fecha vigencia de tu
aviso, tu fecha es no valida. </em></font></p>");
out. println("</body>");
out. print In(W h t mI>");
}//fin de error
*/
public void devuelvepaginaHTML(HttpServlletResponseresp){
//Se establece el tipo de contenido MIME de la respuesta
resp.setContentType("text/html");
//Se obtiene un Printwriter donde escribir(so1o texto)
Printwriter out=null;
try{
out=resp.getWriter();
}catch (IOException io){
System.out.println("Se ha protjucido una excepcion");
1
//Se genera el contenido de la pagiria HTML
out.println("<htmi>");
out.println("<head><title>Datosenviados a la Basede
Datos</title></head>");
out.println("<body background=http://lis.uam.mx/EducDistancia/f029.jpg
out.println("<font size=4>Datoc enviados a la Base de datos</html>");
>'I);
out.println("<p>Palabra clave:"+palabraclave+'14p>'1);
out.println("cp>Clave Materia:"+cvemateria+"</p>");
out.println("<p> grupo:"+grupo+"</p>");
out. println("<p>vigencía</p>");
out. printIn("<p>dia:"+dia+"</p'.");
out. printIn("~p>mes:"+mes+"<,lp>");
out. println("<p>año:"+año+"</p>");
out. println("<p>aviso:"+aviso+Wp>");
143
out.println("cp>clave avico:"+claveaviso+'Wp=-'');
out. println("~p>profesor:"+profesor+"c/p");
out. println("c/body>");
out.println("~/html>");
out.close();
;
}//fin de devolver pagina HTMLpcve = request.getParameter("palabraclave")
Clase cDrecibe
package proyectoCSH.avisos;
import java.sql.*;
import java.lang.*;
import java.io.*;
import java.util.*;
public class cDrecibe /*throw SQLException*/{
private cconectabd oconectabd;
private Connection conec;
private String consulta= "delete from Taviso where ( dia <=? and mes<=? )";
private String coninserta="insert into
Taviso(cveaviso,pclave,cveuea,cveprofesor,i~viso,dia,mes,year,grupo)
values(?,?,?,?,?,?,?,?,?)";
private Preparedstatement instrucion~sql,instrucion_cql2;
private String avis;
public cDrecibe() {
oconectabd= new cconectabdo;
conec=oconectabd.regresaconexion();
1
/*esta funcion regresa la conexion para cerrarla*/
public Connection regresa(){
return conec;
1
1
public void hazactualizacion(int d,int m,int a) {
try{
instrucion-sql=conec. prepareStatemerit(consu1ta);
instrucion-sql.setlnt(1 ,d);
instrucion-sql.setlnt(2,m);
int resultado=instrucion_sql.executeUpdate();
catch(SQLException io){
/*throw new SQLException("cDrecibe: Error "+io);*/
144
System.out.println("Se ha producido uin error pato"+io);}
} //fin de hazactualizacion
public void insertainfo(int aviso,int cveprof,int cveuea,String pacve,String grupo,int
dia,int mes,int año,String avis)
{
try{
inst ruc io n-sq I2=co nec .prepareSt at e me nt (coninserta) ;
instrucion-sql2.setlnt(l,aviso);
instrucion-sql2.setString(2,pacve);
instrucion~sql2.setlnt(3,cveuea);
instrucion-sql2.setl nt(4,cveprof);
instrucion-sql2.setString(5,avis);
instrucion-sql2.setlnt(6,dia);
inst rucio n-sq 12.set I nt (7,mes) ;
inst rucio n-sq 12.set Int (8,año);
instrucion-sql2.setString(9,grupo);
int resultado=instrucion~sql2.executeLlpdate();
System.out.println("el resultado de irisertar es: "+resultado);
conec.close();
1
catch(SQLException ex){
System.err.println("SQLException:'I + c?x.getMessage());
System.out.println("Se ha producido un1 error 100");
1
}//fin de insertadatos
};//fin de la clas
Use Case CONSULTA AVISO
OBJETIVO
El maestro podrá responder las dudas especificas de sus alumnos y ésta sesión será
guardada por el maestro con el objetivo de que éste archivo este disponible para los
alumnos que no entraron a la sesión.
MODELO DE REQUERIMIENTOS
1.- Use Case Consulta Avíso
145
USE'CE\SE
*
CONSULTA AVISO
PASOS
1 .-Oprime botón de avíso(actor)
2 .-Despliega Pantalla de avisos@sterna)
3.-üespl i
eg a paIabras cl ave(ssterna)
4.-Selecciona palabra clave(actor)
5-Despliega Pantalta con losavisosdt3 la palabra clave(Q$terna)
6.23 lo dBseea realiza consulta p2.6
7.- Terminar
El alumno selecciona avisos
146
El alumno selecciona la palabra clave
147
El sistema muestra el aviso correspondiente
148
Diagrama de Estado (Use Case Consulta Aviso)
149
MODELO DE ANALISIS DINAMICO
Escenario
Alumno oprime
Botón Aviso OK.
Alumno oprime
URGENTE OK
Sistema muestra aviso
Los alumnos del proyecto presentarse urgentemente en le cubiculo.
Diagrama de Colaboración(Use Case Consulta Aviso)
O: obtenerpalabraclave(c1aveuea):ResultSet
2
-
1 . Onrime
-r
- -botón
- - aviso
--
'1
O: obtenerdatos(cveuea):ResultSet
2: ODeníl
-
olAlumno : clAlumno
I
>"
~
oNConsultaAvíso : c N C o n s u T a z 1
J
-
3-
I
I--
-
5: Open( alabraclave)
olDespliegaPalClave : clDespliegaPalClave
-
.
~~
oNConsultaAviso2 : cNConsultaAviso
I
150
- - ~ - -
A
O: obtienealviso(pa1abra):ResultSet
'
--
oDPalabraClave : cDPalabraClave
MODELO DE DISEÑO (Diagramas de Secuencia)
1
'I
oNConsultaAviso :
cNConsultaAvico
olAlumno: c
IAlumno
me botón avíso
-
oBabraClave :
edabraClave
olDespiiegaPalClave :
ciDecpliegaPalClave
oNConsuitaAvico2 :
cNConcultaAvico2
>
2. Open()
>
3: obtenerpalabraclave(ciaveuea():ResuItSet)
3
I
I
4: obtenerdatps(cveuea():RecultSet)
,
I
~
'iL
+?
I
I
6: obtieneav'co(palabra():ResultSet)
~-
7: obtienedatos(palabraclave():ResuitSet)
6---
Codigo Fuente
Sew let1
package proyectoCSH.avisos;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.lang.*;
public class Servlet 1 extends HttpServlet {
//Initialize global variables
private String cveuea,pc;
private int claveuea,i;
private Resultset rs;
private Connection con;
private cconectabd oconectabd;
private cNconsultaaviso oNconsultaaviso;
private cDrecibe oDactualiza;
private cconectabd ocierra;
151
--
>
/*Llamada al metodo init de la superclase generitServlet
asi se asegura una correcta inicializacion del Servlet*/
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
System.out.println("lniciando el Servletl . . . . ' I ) ;
oDactualiza=new cDrecibe();
oconectabd=new cconectabdo;
con=oconectabd.regresaconexion();
oNconsultaaviso = new cNconsultaaviso(con);
ocierra= new cconectabdo;
}//fin de init
//Service the request
public void service(HttpServ1etRequest req, HttpServletResponse resp) throws ServletException,
IOException {
i++;
String CveUEA=req.getParameter("CveUEA");
String CveGrupo==req.getParameter("CveGrupo");
claveuea=Integer.parseInt(CveUEA);
rs=oNconsuItaaviso.obtienepalabraclave(claveuea);
despliegapalabrasclave(resp);
}
//este metodo me despliega las palabras claves
public void despliegapalabrasclave(HttpServletResponse respuesta)
c
//establecemos el tipo de respuesta de nuestros datos
respuesta.setContentType( "textihtml");
//se obtiene un print writer para escribir solo texto
Printwriter out=null;
try {
out=respuesta.getWriter();
}catch(lOException io){
System.out.println("Se ha producido un eiror"); }
out.println("<html>");
out.println("<head>");
out.println("<title>sin titulo Normal Page</title>");
out.println("</head>");
out.println("<body background=http://li~;.uam.mx/EducDistanci~~29.jpg
>");
out.println("<p>':font color=008080 size=6 face=Arial><marquee bgcolor=#COCOCO height=50
scrollamount=30 scrolldelay= 13O>LOS SIGUIENTES AVISOS FUERON ENVIADOS POR T U
PROFESOR</marquee></font></p>");
try {
while(rs.next())
c
pc=rs.getString(2);
out.println("<:p><a
href=http://lis.uam m x : 8080/servlet/proyectoCSH.avi~~os.
Servlet2?id="+pc+">"+pc+"</a></p>");
}
out.println("</body>");
152
out.println("</htmI>");
out.flush();
out.close();
ocierra.cierraconexion();
}catch(SQLException ei) {
System.out.println("ERROR:"+e¡+" "+i);
System.err.println("SQLexception:"+ ei.getMessage());}
//Get Servlet information
public String getServletInfo() {
1
return "Servlet 1 Information";
Clase cNconsulta aviso
package chat;
import java.sql.*;
import java.lang.*;
public class cNconsultaaviso {
private Connection conet;
private cDpalabracve oDpalabracve;
private Resultset ap2=null;
public cNconsultaaviso(Connection co) {
oDpalabracve=new cDpalabracve(co);
1
public Resultset obtienepalabraclave(int cveuea)
c
ap2=oDpalabracve.obtienedatos(cveuea);
return(ap2);
1
Clase cDpalabraclave
package proyectoCSH.avisos;
import java.sql.*;
import java.lang.*;
import java.io.*;
import java.util.*;
public class cDpalabracve {
private Connection conec;
private String consulta= "select * from Taviso where cveuea = ?";
private String consulta2="Select * from Taviso nhere pclave = ?" ;
private PreparedStatement instrucion-sq1,instruccion;
private Resultset ap,ap5;
private String avis;
public cDpalabracve(Connection conex ) {
conec=conex;
1
public Resultset obtienedatos(int cveuea) {
try {
instrucion-sq I=conec. prepareStatement(consu1ta);
instrucion-sql.setlnt( 1 ,cveuea);
ap=instrucion-sql.executeQuery();
1
catch(SQLException io){
System.out.println("Se ha producido un error");}
return( ap) ;
}
lllllllllllllllllll/llllllllllllllllllllllllllllllllllf
public Resultset obtienedatos(String avis)
try {
instruccion=conec.prepareStatement(consulta2);
instruccion.setString( 1 ,avis);
apS=instruccion.executeQuery();
}catch(SQLException ¡a){
Systein.out.println("Se ha producido un Ierror");}
return(ap5);
1
1
S e w let2
package proyectoCSH.avisos;
import javax.servlet.*;
import javax.servlet.http. * ;
import java.io.*;
import java.uti I. * ;
import java.sql.*;
154
import java.lang.*;
public class Servlet2 extends HttpServlet {
//Initialize global variables
private cconectabd oconectabd;
private Connection con;
private cNconsuItaaviso2 oNconsuItaaviso2;
private String palabra;
private String palabraclave,id;
private Resultset st;
/*Llamada al metodo init de la superclase generitservlet
asi se asegura una correcta inicializacion del Servlet*/
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
System.out.println("1niciando el Servlet 1....");
oconectabd=new cconectabdo;
con=oconectabd .regresaconexion();
oNconsultaaviso2 = new cNconsuItaaviso2(con);
}//fin de init
//Service the request
public void service(HttpServ1etRequest request, HttpServletResponse
ServletException, IOException {
System.out.println("1niciando el servlet que despliega los avisos");
response)
throws
palabra=request.getParameter("id");
st=oNconsultaaviso2.obtieneaviso(palabra);
despliegaaviso(resp0nse);
}//fin de service
//metodo que despliega el aviso correspondiente
public void despliegaaviso(HttpServletResponse respuesta){
//establecemos el tipo de respuesta
respuesta.setContentType("textihtm1");
//se obtiene un printwriter donde escribir
Printwriter out=nu I I;
try f
out=respuesta.getWriter();
}catch(IOException io){
System.out.println("Se ha producido un error"); }
out.println("<h:mI>");
out.println("<head>");
out.println("<title>sin titulo Normal Page</title>");
out.println("</head>");
out.println("<body background=http://li~~.uam.mx/EducDistancia/fO29.jpg~");
out.println("<p><font color=008080 size=ó face=Arial><marquee bgcolor=#COCOCO
height=50 scrollamount=30 scrolldelay= 130>AVISOS </marquee></font></p>");
try {
while(st.next())
{
out.println("<p>"+st.getString(5)+"</a></p>");
1
out.println("</body>");
out.println("</html>");
st.close();
}catch(SQLException e¡){
155
System.out.println("ERR0R:"+ei);
System.err.println("SQLexception:"+ ei.getMessage());}
//Get Servlet information
public String getServletInfo() {
return "Servlet2 Information";
} //fin de String
)//fin de class
Clase cNConsulta aviso2
package chat;
import java.sql.*;
import java.lang.*;
public class cNconsultaaviso2 {
//variables globaies
private cDpaiabracve oDpalabracve;
private String palabracve;
private Resultset ap3;
private Connection conex;
public cNconsultaaviso2(Connection conex) .[
oDpalabracve=new cDpalabracve(conex);
1
public Resultset obtieneaviso(String palabracve)
{
ap3=oDpalabracve.obtienedatos(palabracve);
return(ap3);
I>
REVISA SESION
OBJETIVO
El alumno podrá en algún momento tener duda respecto a ciertos puntos específicos de
la sesión ,por lo cual podrá disponer de la sesión correspondiente para poder clasificar
sus dudas.
1.-Use Case Revisasesion
156
ALUMNO
USE CASE REVISA SESION
PASOS
I.- Clik ai botón revisa sesión.
2.- El sistema verifica UEA.
3.- El sistema verifica el grupo.
4.- El sistema abre el archivo.
5.- Elsistema muestra la sesión correspondilente.
6.- Fin
Layouts de pantallas (Use Case RevisaSesion)
El alumno selecciona Revisar Sesion
157
158
I
SESION
GRUPO CGOl
UEA 2 15 107
S E INICIA LA SECION CORRESPONDIENTE
como
A LA FECHA dia 15mes 12año 100
estas Ada Vutual Cesar ha cntrado
adios Cesar provarcmos
S E C E W . LA SESION CORRESPONDIENTE A LA FECHA dia 15mcs 12año 1 O0
SE INICIA LA CESION CORRESPONDIENTE 11LA FECHA &a 15mes 12aiio 100
como estas Ada VvhJal Ccsar ha cntrado
adios Cesar provarcmos
SE C E -
LA SESION CORRESPONDIENTE A LA FECHA dia 15mes 12año 100
Diagrama de Estado (Use Case RevisaSesion)
seleccina Rev icar Sesion
PantallaAlum no
1
~P
--__
~P
>
Ventana Secion
cSeson
GRUPO
UEA
w e UEA
nombre
N o c r e d it os 1
t
i
I
159
-
‘ I l 0 t ) Z LO I ) t A h >%Iis14 I ) I h A M I ( ’ O
Diagrama de Colaboracion(Use Case RevisaSesion)
->
p
-
.-I
2: venficaUE.A(UEA)
1 Remaseson
f
oi P a n t a l l a A l u m n o T
JclPantallaAlumno)
/?
1I
5: ObtieneSesion(UEAGnipo)
-+
oD0btieneSesonoNVen8caDatos
~ N V = n r i u i o a t ~ ~ E W b l e n e C e . o n
3-;eniicaGnipo(Gnipof
->
ALUMNO
4 m n catena (UEAGRip o)
>
MODELO D E DISEÑO (Diagramas de Secuencia)
I.- (Use Case RevisaSesion)
ALUMNO
olPantallaAlumno
(clPantalla
1 oNVenficslatos
cNVerificaM
>
‘2. verificaUEA(UEA)
~
I
r
pp-
oDObtieneSeYon’
cDObtieneSesion
,
7-1
13‘ venficaGnipo(Gmpo)
r
I
- 7 1
---*-
4 concatena(UEAGnipo)
-
5. OtitieneSeson(UEAGnipo)
->
GUARDA
SESION
160
OBJETIVO
El maestro podrá responder las dudas especificas de sus alumnos y ésta sesión será
guardada por el maestro con el objetivo de que éste archivo este disponible para los
alumnos que no entraron a la sesión.
MODELO DE REOUEKJMIENTOS
1.- Use Case GuardarCesioii
PASOS
1.-Elprofesor oprime el botón "enviar sesión"
2.-Elsistema obtiene la sesión
3.-Elsistema registra el profesor
4.-El
sistema registra la clave del grupo
5.-EI sistema registra la clave de la UEA
6.-EI sistema crea un archivo
7.-Elsistema obtiene la fecha de la sesión correspondiente.
8.-El sistema guarda la fecha.
9.-EI sistema guarda la sesión
lO.-El sistema cierra el archivo
11.-Fin
161
Diagrama de Estado (Use Case GuardaSecion)
Inicio
-
O
Aula Virtual
>i
~
-
\
-
~
Pantallaprofesor
Enviar Seson
~
~~
Salir
____~
Salir
Fin
~
~~
CProfesor
I
1
1 '
~~
CSeaon
162
->
Pantal IaE nvi a
Diagrama de Colaboracion(Use Case GuardiaSecion)
1: GuardaSesonO
3: ObtieneFecha
2: EnviaiUEAGniDo.usiano)
MODELO DE DISEÑO (Diagramas de Secuencia)
1.- (Use Case GuardaSesion)
~~
o NG11
a rda
o IPantal Ia M aestro
: (clPantaila
: (maestro)
~
0DGuardaSe.s
cNguaida
~~
~
~~
L
~
~~~~
~
1. Guardasesono
~~
~
>I
I
I
I
I
2 Envia(UEAGrupo.usuario)
I
1
3: ObtieneFecha
~
~I
.--
I
>>ciI
4 Guarda!2ecion(UEAGRipo,uuano,sason)
__
163
>
/*El Servlet MIPRIMER lo que hace es abrir una carpeta en el servidor y guardar los
archivos correspondientes a la sesión correspondiente única, pues esta dada por el grupo
y la clave de la UEA, además de que se identifica por la fecha correspondiente a ese día*/
public class MIPRIMER extends HttpServlet
r
I
/* Los parametros de service encapsulan los datos que son mandados
tanto desde el cliente, como desde el servidor*/
private String modo;
private int dia,mes,año;
private String usuario;
private String UEAGrupo;
private String sesiones;
c
public void service(HttpServ1etRequest req, HttpServletResponse res)
throws ServletException, IOException
modo = req.getParameter("modo");
appletmaestro
//esta parte se encarga de recibir los datos enviados por el
usuario = req.getParameter("usuario");
UEAGrupo = req .getParameter("CveUEAGrupo");
sesiones=req.getParameter( "sesion");
System.out.println("Esto es lo que posibl llegue si E conex con modo"+modo);
System.out.println("Esto es lo que posibl llegue si E conex con usuario"+usuario);
System.out.println("Esto es lo que posibl llegue si E conex con "+UEAGrupo);
if (modo.equals("guarda-sesion"))
obtienefecha( 1;
escribearchivo(UEAGrupo,usuario,sesiones,dia, mes, año,res);
String grupo=UEAGrupo.~ubstring(6);
String uea=UEAGrupo.substring(0,6);
/I presentaExito(res,grupo,uea); //para mostrar exito del guardado del archivo.
1
ilfuncion que inserta un texto en el archivo
protected synchronized void escribearchivo(String
int año,HttpServletResponse res)
{
try
I; EAGrupo,String
c
usuario,String sesiones,int dia,int mes,
File directorio=new File("pub1ic-htmllarchivoprofe");
directorio.mkdirs():
FileOutputStream fos= new FileOutputStream("public_html/archivoprofe/"+UEAGrupo+".txt",true);
PrintStreain ps= new PrintStream(fos);
ps.println("SE INICIA LA SESION CORRESPONDIENTE A LA FECHA:"+"dia "+dia+"mes
"+mes+"año "+año);
ps.println(sesiones);
ps.println("SE CIERRA LA SESION CORRESPONDIENTE A LA FECHA:"+"dia "+dia+"mes
"+mes+"año "+año);
ps.close();
// enviaResp("se almaceno la informacion",res) ;
}
164
catch(l0Exception e){
System.out.println("ERR0RARCHIVO"+e);
1
}//fin de funcion escribearchivo
protected synchronized void obtienefechao
{
try {
Date fechaactual= new Date();
dia=fechaactual.getDate();
mes=fechaactual.getMonth()+ I ;
año=fechaactual.getYear();
}catch (Exception e) {
} //fin de catch
}//fin de obtiene fecha
lienvia la respuesta de regreso al aplet
protected void enviaResp(String resp,HttpServletResponse res) {
try {
res.setDateHeader("Expira",System.currentTi~ieMillis());
Printwriter pout = new PrintWriter(res.getOutputStream());
pout.print("+OK "+resp+"\r\n");
pout.flush();
pout.close();
}
catch (IOException e) {
// Pendiente
1
}//fin de enviaResp
private void presentaExito(HttpServ1etResponse res, String grupo, String uea)
{
String texto;
try i
//Se establece el conteido de la respuesta
res.setContentType("text/htinl");
//se obtiene un Printwriter para salida0000000000
Printwriter out=null;
out=res.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv=Content-Type");
out.println("content=text/htmI;charset=iso-8859- 1>");
out.println("<meta name=GENERATOR content=Microsoft FrontPage 2.0>");
out.println("<title>LA SESION HA SIDO GUARDA CON EXITO</title>");
out.println("</head>");
out.println("<body bgcolor=#FFFFFF>");
out.println("<hr>");
out.println("<pre>
</pre>");
out.println("<pre>
<font color=#000080 size=7");
out.println("face=Zurich XCn B P L A SESION HA SIDO GUARDA CON EXITO</font></pre>");
out.println("<pre><font face=TrumpetLite> </font></pre>");
165
out.println("<pre><font face=TrumpetLite> LA UE A: "+uea+" DEL GRUPO :"+grupo+ " HA SIDO
GUARDADA</font></pre>");
out.println("<pre><font
color=#000080
size=4
face=Verdana>
<a
href=http://lis.uam.inx/EducDistancia/PrincipalPag/UniversidadVirtual.htm>PAGINA
PRINCIPAL</a>");
out.println("<hr>");
out.println("</body>");
out.println("</htinI> ");
1
catch (IOException e) { }
}//fin de presentacion
/*este servlet es para ver la sesión , por parte del alumno*/
public class Servletsesion extends HttpServlet {
//lnicializacion devariables globales
private String UEA;
private String Grupo;
private cNVerificaDatos oNVerificaDatos;
public void init(Serv1etConfig config) throws ServletException {
super. init(config);
}//fin de init
//Service the request
public void service(HttpServ1etRequest req, HttpServletResponse res) throws ServletException,
IOException {
//Obtiene los datos para ser manipulados tanto UEA, como Grupo
oNVerificaDatos- new cNVerificaDatos(res);
boolean ban 1=false,ban2=false;
UEA=req.getParameter("CveUEA");
ban I =oNVerificaDatos.verificaUEA(UEA);/Nerifca
que la UEA no sea nula
Grupo=req.getParameter( "CveGrupo");
ban2=oNVerificaDatos.verificaGrupo(Grupo); //Verifica que el grupo sea no nulo
oNVerificaDatos.concatena(ban 1,ban2,UEA,Grupo);
}//fin de service
//Get Servlet information
public String getServletInfo() {
return "Servletsesion Information";
1
} //fin de Servletsesion
166
ENVIAR ARCHIVOS.
Objetivo
El maestro podrá enviar cualquier tipo de archivos a través de la pagina de la
Universidad Virtual.
Use Case EnviarArchivo
EnviarArchim
Maestro
1.-Oprimir liga "Subir Archim".
2.-Se despliega pantalla donde habrá de capturarse la claw de maestro, claw de
la materia y la claw de grupo.
3.-Se despliega la pantalla para seleccionar el archim a subir.
4.-Se selecciona el archim a enviar.
5 . S e opnmeel botón "Enviar".
6 . E I archilo seleccionado es enviado a Servidor.
7. S e despliega una pantalla que indica los datos que acaban de ser eniados.
8. -Term h a
Favor de llenas los siguientes campos:
- 1
Insertar la clave de ia materia- 1
Insertar su clave de profesor
Insertar la clave del grupo
1
A continuación, favor de seleccionar el archivo
167
Diagrama de estado ( UseCase EnviarArchivo. )
m a h Q
\
Modelo del dominio del problema.
~~~~~
A rc h ivo
(from L o g i c a l View )
.
CveP rofesor
CveUEA
CveG rupo
N o m b r e A rc h ivo
DirArchivo
I
+<<Set>>
~~
1
Curso-Prof
I
I
I(from L o g i c a l View )
~
Cve-UEA
: String
~
I
1 .*
Archivo()
A continuación se presenta el escenario para el envió de un archivo; no se tomara en
cuenta una situación de error.
Paso
Escenario
Descripcion
SUBIR ARCHIVO
1
Oprimir liga “Subir Archivo”.
2
Se despliega pantalla donde habra de Clave Maestro:
capturarse la clave del maestro, clave de la Clave Materia:
Clave Grupo:
materia y la clave de grupo.
3
Se despliega la pantalla para
archivo a subir.
4
Se selecciona el archivo a enviar.
El archivo
Servidor.
seleccionado
es
C:\Texto.txt
enviado
a
Se ha oprimido el botón
grupo
168
as¡
como
nombre
y
Diagrama de colaboración.(Use Case EnviiarArchivo)
I
4 Mrad-iu,
/
I
09\isOti7jo:
169
MODELO DE DISEÑO (Diagramas de Secuencia)
1.-(Use Case EnviarArchivo.)
\
Maestro
Maestro
oEnwoArchiu,
clEnwoArchiw
EnwarArchb
,
I
oArcK7
1~
oNUploadSedet ' 1
cNU loadsenkt
---
IEnwoArchiu:
-
I
P
~
-
*
Examinar
' I
Abnrarchiu,
<
<
Open( )
UploadServlet(Cw-profesor.Cve-matela,C-grupo,
~~
direccion)
-+
-L_-...
<
170
Diagrama de clases dinámicas.
I
Atchiw
I
D E S C A R G A R ARCHIVOS.
OBJETIVO
El alumno podrá bajar los archivos que fiueron prevdmente puestos en la página G Z
la Universidad Virtual, por el maestro.
171
Use Case DescargarArchivo
/
'
I,,
-2
\
DescargarArchiw
Usuario
1.-Oprimir liga "Bajar Archiw".
2.-Se despliega la pantalla con la lista de los alrchiws a descargar.
3.-Seleccionar el archiw a descargar.
4.-Una e z seleccionado el archiw, se hace click sobre la liga del archiw.
5 . S e abre pantalla donde se indicará en qué parte queremos carpeta deseamos
guardarlo.
6. S e oprime el boton "OK'.
7 . E l archiw es descargado de la página de la Unilersidad Virtual..
8. -Temina
Diagrama de estado ( UseCase Descargar Archivo. )
1
~
~
_
_
~
Pantalla seleccion de archiws
Pantalla descargar notas
~
Pantalladescargandoanhiw
J'_
I
Modelo del dominio del problema.
Archim(from
Curso-P rof
Logical View)
(from Logical View)
C-UEA
I
I..*
I
+setlnformacion(CLe_profesor, Ce-materia, Cw-grupo, direction)()
~_~
~
-
172
1
-
__
--
String
MOIIELO L)F ANA1 .lClCI>INAMlCO
A continuación se presenta el escenario para la descarga de un archivo; no se tomara en
cuenta una situación de error.
Escenario
Descripcion
Paso
1
Oprimir liga “Bajar Archivo”
2
Se despliega la pantalla con la lista de los Clave Maestro:
Clave Materia:
archivos a descargar.
Clave Grupo:
BAJAR ARCHIVO
Se seleccionará un archivo de
una
lista
de
archivos
previamente subidos por el
mofesor.
Para poder pasar a la siguiente
Una vez seleccionado el archivo, se hace clic pantalla, es necesario escoger
solo un archivo de los que se
sobre la liga del archivo.
muestran.
Seleccionar el archivo a descargar.
3
4
5
6
Se abre pantalla donde se indicará en que Se le indicara la ruta donde
deseamos guardar el archivo.
carpeta deseamos guardarlo.
Se oprime el boton “ O K .
“OK”
7
Aparece la pantalla por default
El archivo es descargado de la página de la
donde se indica el proceso de
Universidad Virtual.
descargar del archivo.
8
Termina .
173
Diagrama de colaboración.(UseCase BajairArchivo)
i
x,
'\
i
1: Bajar k c h i m
>
~~
~~~
3: Get&& im(Cve-profesor.C\e-materia,Cve-grupo.direccion)
2 sennce()
-
olDescargarkchiw
clDescargarArchim
1
7
oNDcwnloadSe\let
cNDownlmdSer\let
-
/
/&
5 Termina
>
~
clDescarF]arPrchi
~
174
-+
-
-'
odatosDownload
cdatosDownload
,
~
MODELO DE DISEÑO (Diagramas de Secuencia)
1.-(Use Case Bajar Archivo.)
z
-
~~
GDownloadSe
viet
Alumno Usuario
I
odabsDownloa
d:
_ _ _ -
,
clDescar arArc
Lp-L
1
- -
I
i
I
I
I
senice(
)
~
>-
175
I
I
REGISTRO
OBJETIVO.
El siguiente Use Case se encargará de capturar los datos personales de los
alumnos de la Universidad Virtual dentro de la pagina de la Universidad Virtual.
Use Case Registro.
\
/
h
/'
'\
Administrador
Registro
1.-Oprimir liga "Registro".
2.-Desplegar la pantalla que contendra el menij principal.
3.-Seleccionar la liga "Inscripción".
4.-Se desplegará la pantalla con la hoja de inscripción
5.-Capturar los campos requeridos (nombre, dirección, etc.) para registrar al
Alumno.
6. -Validación de la existencia de campos IX) \/;=íos.
7.-Oprimir botón "Enbiar".
8.-Desplegar los datos capturados.
9.-Oprimir botón "Salir".
1O. -Te m i na.
176
Se selecciona la liga Inscripción.
Favor de hacer click en l a operacion deseada
C onsui ta
Inscrincion
Reinscriacioii
Se despliega la pantalla la hoja de registro.
1177
Diagrama de estado (UseCase Registro).
Inicio
,
\
Oprimir Iiga "Reg1stro"
k
Pantalla con liga "Registro"
I
>Pantalla Menú "lnscnpción"
Oprimir liga "Inscripción"
I
i
Pantalla Hoja'L
<-
7
/
/
inscnpción
~~
1
J
Oprimir botón "Enwar"
Enivar a la BD los campos capturados
L--
-
Opiimir botón "Salir"
!Pantalla con los datos capturados;
-<O)Fin
-~
I
Modelo de Dominio del problema.
178
X 1 0 1 l I ~ i , c > Ill !\N,ll 1’715 I ) i Y , \ \ l l C O
A continuación se presenta el escenario para el registro de un alumno; no se tomara en
cuenta una situación de error.
Paso
Descripción
Escenario
1
Oprimir liga “Registro”
2
Desplegar la pantalla que contendrá el menú
principal.
3
4
5
REGISTRO
INSCRIPCION
CONSULTA
RElNSCRlPClON
INSCRIPCI~N
Seleccionar la liga “Inscripción”.
Se desplegará la pantalla con la hoja de
inscripción.
CONSULTA
RElNSCRlPClON
Hoja de inscripción con los
campos a llenar para dar de alta
al alumno en la Univ. Virtual.
Capturar los campos requeridos (nombre,
dirección, etc) para registrar al Alumno.
Se hará la captura de los datos
personales del alumno.
6
Validación de la existencia de campos no
vacíos.
7
Oprimir botÓ n “Enviar” .
En caso de que exista algúr
campo importante que este
vació, se le informará a la
persona que este capturando la
información.
El capturista hará clic en e
botón “Enviar”.
8
Desplegar los datos capturados.
Se desplegarán los datos que
fueron escritos en la BD.
9
Oprimir botón “Salir”.
Se ha oprimido el botón “Salir”
10
Termina
179
Diagrama de colaboración (Use Case Registro).
1 Registro
>
oRegistro c Ilnscripcion
/
Administrador :
Administrador
I
8 Termina
->
oconírnxion
clconfirmacion
"
2 Ope()
3 Enwar
4 EnwarDatosíMatncula.Nombre Password)
+
-
olnscnpcion
cllnscnpcion
5 SetDatos(Matncda, Nombre, Passvmrd)
-
oNlnscn cion
cNinsc&cbn
L
-~
-~
->
-
oAlumno
cDAlumno
~~
/
7 Open ( )
MODELO DE DISEÑO (Diagramas de Secuencia)
Administrador
oReqistro c
Ilnscnpcion
olnscnpcion 2
Ilnscnpcior!
oConlmacion
clconfimacion
oNlnscnpcion
cNlnscnpción
oAlunno c
DAlumno
EnwarDatos(Matncula,Nombre, Password)
11
r
h-
~~
- -
SetDatos(hatncula, Nombre, Password)
/
\
Salir
1L,-----+-
>-i
I
' O p e n ( )
~
I
Temina
~-
<-
I
so
Diagrama de clases dinámicas.
cDAlumno
I
38 8 word)
I
< < E v e n > > Salir
181
CONSULTA.
OBJETIVO.
Qué el Administrador pueda consultar los datos personales de los alumnos
pertenecientes a la Universidad Virtual a través de la pagina misma.
Use Case Consulta.
/'
I
'
\
\\
\
UC Consulta
Admi ni st rador
1.-Oprime liga "Registro".
2.-Despliega pantalla "Menú".
3.-Selecciona "Cons u1ta" .
4.-Despliegue de matricula y nombre de todos losAlumnos de la
Univxsidad Virtual.
5.-Oprime liga "Matricula" perteneciente al Aluinno a consultar.
6.-Despliegue de los datos personales del Alumno.
7 ,-0primi r botón "Sal it".
8. -Termina.
Se oprime la liga Consulta.
I82
Se desplegara
. - la pantalla con la matricula y el nombre de todos los alumnos de la Universidad Virtual.
A
conginuacion,se lnuertran los alumnos inscritos
94216867 Salvador Oscar Lopez Carrera
94319656 Sandra Aide Valadea Lopez
96217006 Alejandro Cruz Noriega
93220718 E d o Flores Díaz
200318099 Alarcon Martinez Jose Antodm
95214852 Rey César Romero Barragán
92321214 Martha Ivonne Juarez Gonzalex
200317695 Aimaraz Marcon Carlos Alberto
20031785’ M v a r c z Fabila Nelson
200317653 Baliesteros Flores Saul
1, 83
en el aula virtual
Cuando se hace click sobre una matricula, esta desplegara los datos personales de cada alumno.
l.lNlvmsU>mAuTbrv
Matricula: 200315928
Nombre: G o m a G o m a Jesus
Nickname: jerusg
Password j esus g
Sexo: Mascuiino Emaikninguno
Direcaon: ninguno Co1onia:ninguno
codigo Postal: o
Lada: O Telefoiio:O
Ciudad Cd.de Mexico Estado: D.F. Pair:Mexico
Diagrama de estado (Use Case Consulta),
'A------
-
Pantalla con liga Registro
\
-
-
Pantalla icon Menú Pnncipal
'
I
f
Query a la BD
t;
Nombre
Matricula
1
1
,
Crick en una soia Matricula
I84
Modelo de Dominio del Problema.
Alumno
,
I
h101)l I
c, 111
/\\.I1 151,s I , I N , \ n i l c ‘ o
A continuación se presenta el escenario para la consulta de un alumno; no se tomará en
cuenta una situación de error.
Descripción
Paso
Escenario
1
Oprimir liga “Registro”.
2
Desplegar la pantalla que contendrá el menú
principal.
3
4
REGISTRO
INSCRIPClON
INSCRIPCI~N
CONSULTA
Seleccionar la liga “Consulta”.
Despliegue de matricula y nombre de todos
losAlumnos de la Universidad Viritual.
5
Oprime liga “Matricula” perteneciente al
Alumno a consultar.
6
Despliegue de los datos personales del
Alumno.
7
Oprimir botón “Salir”
10
Termina
185
RElNSCRlPClON
Se desplegaran la matricula y el
nombre de los alumnos, no
importa
a
que
grupo
Pertenezcan.
Cada una de las matriculas será
una liga a los datos personales
de los alumnos a quienes
Pertenezca dicha matricula.
Desplegara
la
información
personal del
alumno,
de
acuerdo
a
la
matricula
seleccionada.
Se realiza un clic en el botón
“SaI ir”.
Diagrama de colaboración (Uxe Case Conisulta).
1 Oprimir Registro
>
oRegistro
clRegistro
/
Administrador
Administrador
2 Consulta
3 Open ( )
6 Open ( )
A
$
4 Consu~al(Matncula, Nombre) 5 GetDato(Matncula, Nombre)
v-
oMatncula
clMatricula
-
10 Tennina
1-'
7 Consulta2(Matricula, Nombre, Password)
3
oConsuTG
->
cNConsulta
-
p~~
8 GetDato(Matricula,Nombre,Password)
>
'9.
,
oDatosP
clDatosP
-
-
oAlumno
CDAlumno
Openo
1
MODELO DE DISEÑO. (Diagramas de secuencia)
Administrador
Administrador
oRegistro c
IRegistro
OprmrReglstm
-
oMenu c
IMenu
--
1 oMatnwia
1
' -'
c
IMatncula
oDatosP
c
oconsulta
c 7
oAlümno
GetDat o(M& n cula. Nombre)
>
ConsultaZ(Matricula. Nombre Password)
31-1
GetDato~Matncula.Nombre.Password)
r
Open ( )
I '
J
I86
-
- -
~
I
-->Termina
I
<
- A
I
1
-->-
Diagrama de clases dinamicas.
ciRegistro
I
C D A l u m no
I
cIMenu
I
I
I
+O e t D a t o ( M atric u la. N o m bre)
I
5.4.1 Modelo de Implantanción.
La codificación de todo el análisis) anterior se realizo en Java, con la ayuda
de Servlets, y Applets, además es importante mencionar que también se
requirieron paginas HTML para la presentación en la red del proyecto Educación a
Distancia.
6. Conclusiones.
El proyecto de Educación es una necesidad de muchas Universidades, pero no
solo a nivel nacional, si no a nivel mundial, esta necesidad a provocado el
desarrollo de este proyecto que habia llegado a un primer prototipo, sin embargo
en este trimestre se ha llegado a un segundo prototipo en el cual se logro una
comunicación completa via internet, es decir se logró el intercambio de
información mediante el uso de la clase virtual entre el alumno y el maestro.
Es importante mencionar que algunos factores obstruyeron la elaboración de dicho
proyecto, como lo fueron : la falta de información, la inestabilidad del servidor e
incluso la inestabilidad de los requisitos.
De la realización del presente proyecto, se pudo observar y tener viva conciencia
de la importancia y el impacto en la sociedad de la denominada "Educación a
I87
Distancia". Asumiéntose a la Universidad Virtual como una aplicación, en esta era
de las comunicaciones, ya que es una florma flexible de enseñanza especializada
a distancia que utiliza avanzadas tecnologias, esto permite ofrecer una formación
de excelencia, cumpliendo con los estandares academicos internacionales.
Entre otras cosas hay que destacar que este proyecto brinda comodidad a los
alumnos, ya que pueden tomarse las clases en cualquier parte donde exista
Internet, por lo que puede ser muy comercial.
i 88
7. Bibliografía.
O
1001 tips para programar en Java, Steven W. Griffith et al.
Mc Graw Hill , México ,D.F ,1998, I r a . Edición Español.
O
Java Servlets, Kalr Moss, Mc Graw Hill, United States o f America, 1999,
first edition (Primera Edición).
O
Aprendiendo Borland Jbuilder2 en 21 días, Donald Doherty y Michelle M.
Manning, Prentice may Hispanoamericana S.A., M{exico, 2000, 1ra.
Edición Español.
REFERENCIAS
O
http://developer.java.s un.com/deve!loper/onIineTraining/Servletsl
Fundamentals/con tents. htm I
http://java.sun.com/docs/books/tutorial/index.html
http://www.netverk.com.ar/usuario~s/suweb/html/manualde/man000.htm
http://members.es.tripod.de/froufe/parte2/cap2-1.
html
http://java.sun.com/products/jd k/l.2/docs/api/
http://geminis.adi.uam.es/-dcclhtrrillhtmll
.htm
O
http://www.eis.uva.es:80/GuiaHTMl,/introHTML.htmI
O
O
O
0
o
189
Descargar