Educación! a Distancia

Anuncio
Casa abierta al t m p o
Universidad Autónoma MetropolitanaUnidad lztapalapa
‘‘Educación!a Distancia ’’
TERESA GA-RCIA BAHENA
L323130
Para o6tenerelgrdo de :
Licenciatura en Computación
Con Ih ,%esonh de :
Universidad Autónoma Metropolitana lztapalapa
División de ciencias Básicas e Ingenierziz
Departamento de Ingeniería EEctrica
''Educación a Distancia"
Tesis presentadapor
Teresa 5;arcía Batíena
Para o6tener elgrado di:
Licenciada en computación
LABORATORIO DE INGENIERIA DE SOFTWARE
1. INTRODUCCION .............................................................................................................
5
.........................................................................................
2. EDUCACION A DISTANCIA
8
SOBRE EL DOCIJMENTO:.......................................................................................................
8
3 . OBJETIVOS DEL SISTEMA......................................................................................... 9
4 . MARCO TEORICO.......................................................................................................
TCCNICAS
IJTILIZADAS EN EL DESARROLLO DEL PROYECTO...............................................
ANÁ[. ISIS Y DISEÑO ORIENTADO A OR.[ETOS. ......................................................................
ANÁl. ISIS DE REQUERIMIENTOS
.........................................................................................
E J E M P I .O DE USE C A S E ......................................................................................................
D I S E Ñ O..............................................................................................................................
CONS.I'RIJCCl6N .................................................................................................................
UML .................................................................................................................................
RATIONAL
Ros E................................................................................................................
T~NICA
DESPROGRAMACl6N EN JAVA ............................................................................
T~NICA
D ESP R O G R A M A C I ~ NEN HTML. .........................................................................
TEC'NICAS lJTILlZADAS EN BASESDE DAWS .....................................................................
10
10
10
11
12
14
14
15
16
16
18
18
.
5 ESQUEMA BÁSICO DEL SISTEMA DE NAVEGACI~NPARA LA
UNIVERSIDAD VIRTUAL..............................................................................................
20
D E S C R I P C I ~ N......................................................................................................................
BARRA
DE NAVEGACIóN DE SERVICIOS C8:)N CARÁCIER PRIVADO......................................
20
21
-
.
6 ANALISIS Y DISENO ...................................................................................................
P O N E R N O T A S ....................................................................................................
MODELO DE REQUERIMIENTOS............................................................................
DIAGRAMA
D L CLASES ESTÁTICAS ........................................................................................
MODELO DEANALISL7 DINAMICO .........................................................................
1 J S E C A W P O N E R N O T A S ESCENARIO
CORRECTO SIMPLE .................................................
- ................................................................................................
MODELO DE DISENO
P O N E R A V I S O S ...................................................................................................
MODELO DE REQUERIMIENTOS............................................................................
DIAGRAMA DE CLASES ESTÁ-rlcAS ........................................................................................
MODELO DE ANALISISDINAMIC ' O .........................................................................
Us[<CASEPONERA V I S o-s ESCENARIO
CI:)RREC'I'O SIMPLE ................................................
MODELO DE DISENO ................................................................................................
P O N E R B I B L I O G R A F I A ...............................................................................
MODELO DE REQUERIMIENTOS............................................................................
DIAGRAMA DIi CLASES ESTÁ.llCAS ........................................................................................
MODELO DE ANALISIS DINAMKO
.........................................................................
USl; C A S E PONER BIBLIOGRAFIA
ESCEN~ZRIO
CORRECTO SIMPLE .....................................
MODELO DE DISENO ................................................................................................
_Ir
.
o d 1 g o ..........................................................................................................................
ADM1NISTRACI~)N DEI. SISTEMA.........................................................................................
(jB.JETIV0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
23
23
25
25
25
26
29
29
30
31
31
31
34
34
35
36
36
36
39
72
?.
1-7
2
MODELO DE REQUERIMIENTOS............................................................................
USl: CASE ENTRADAAI~MINISTRAD~R
..............................................................................
MODELO DE ANALISIS DINAMICO
.........................................................................
MODELO DE DISEÑO (Diagramusde Secuencia) ....................................................
C O N S U L T A M A E S T R O...................................................................................
OB.JE TI VO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MODELO DE REQUERIMIENTOS............................................................................
Usl: CAsr: CONSUI;
I-AMAI.STRO
.......................................................................................
Modelo de Inter*fbz........................................................................................................
MODELO DEL DOMINIO DEL PROBLEM ............................................................
MODELO DE ANALISIS DINAMICO
.........................................................................
MODELO DE DISEÑO (Diugrumas de Seczlencia) ....................................................
L T A M A E S T R O S ............................................................................................
OB.JE TI Y O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MODELO DE REQUERIMIENTOS............................................................................
MODELO DE ANALIk5'LY DINAMICO .........................................................................
MODELO DE DISEÑO (Diugrunusde Secuencia) ....................................................
A J A M A E S T R O S .............................................................................................
OB./ E TI VO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MODELO DE REQUERIMIENTOS............................................................................
72
72
73
74
74
74
75
75
75
75
76
77
78
78
75
78
(YO
80
N0
80
. .
Instalaclon de los parches: .........................................................................................
Instalacidn de SDHJRE: ............................................................................................
Instalucicin de paquete Solaris S, DK:.........................................................................
Instulacidn de binarios auto-extraiblt'sde SDKLJRE: ...............................................
[/sando Java 2 SDK 1.3: ............................................................................................
8. MIGRACIóN DEL SISTEMA A SERVIDOR 1NFOCBI.UAM.MX
.....................
JIJSTIFICACI~N
.................................................................................................................
PROCESODE PREPARACI~N
....................
I31
7 133
1 133
136
136
137
137
........................................................................
DIAGRAMA
DE.PROCESO DE REDIRECCIONAMIENTO DE ARCHIVOS HTML .............................
Migracidn de base de datos de Interbase 5 a Interbase 6 ..........................................
137
138
138
9. CONCLUSIONES.........................................................................................................
139
10. APÉNDICE ..................................................................................................................
140
ASPECTOS
SOBRE LA MÁQIJINA CON SISTEMA SOLARIS UAM VIRTLJAL .........................
140
EL FTP? .................................................................................................... 140
¿QLJEES FTPD? ................................................................................................................ 144
¿,Y COMO I T J E :
1I .BIBLIOGRAFÍ A.
........................................................................................................
REFERENCIAS .............................................................................................................
145
145
4
1. Introducción.
Dirección del sitio en internet donde se encuentra el sistema actualmente.
http://infocbi.uarn.mx:W
Todo sitio, portal o página web requiere de un sistema de navegación.
Por sistema de navegación enlínea entendemos al programa de cómputo que se ubica en
unservidor
especializado y que permite la organización del contenido,serviciosy
materiales ubicados en una página, sitio o portal en internet y que orienta y apoya a los
usuarios en la selección de las diferentes opciones de servicios que se les ofrece; así
como, les facilita la comunicación entre ellos y con el oferente del servicio.
Asimismo, la estructura lógica de los sistemas de navegación es una herramienta muy útil
para el diseño e implantación de los materiales y servicios en línea, ya sean productos en
venta, materiales educativos, avisos para la prevención de desastres, noticias, etc.
Además, un sistema de navegación forma parte de la imagen que proyecta el oferente de
los servicios: educación, gobierno, empresas comerciales,
organismos
normativos,
agenciasde noticias, compañías de entretenimiento, etc.En este sentido, el correcto
diseño del sistema demanda de la intervención deun
grupo interdisciplinariode
especialistasen la materia: representantes de la institución, diseñador, computólogo,
comunicador, gestor, etc.
AI multiplicarse hoy en día las opciones para que una institución educativa ofrezca sus
servicios en linea, es conveniente establecer un sistema institucional de navegación que
le otorgue una estructura, organización e identidad al material educativo que ofrece el
personal de la institución y facilite tanto la consulta de los usuarios, como el diseño de los
ambientes y materiales en linea.
Estoes,noimporta
si las plataformas de educación enlinea se ubican en servidores
externos a la institución (por ejemplo WebCT o Blackboard), se utilicen plataformas ya
diseñadas en servidores de la institución (learning space o las plataformas del IPN, de la
UOC o de la Universidad de Alicante) o sean las propias de la institución (la plataforma lis
diseñada en la Unidad lztapalapa de la UAM), Io conveniente es incorporar endichas
plataformas el programa de cómputo asociado al sistema de navegación.
Sin embargo, la mayor parte de las plataformas de educación en línea ya disponen de un
sistema de navegación propio, por lo que las posibilidades para incorporar el sistema de
navegación institucional es un
factor que pudiera orientar la toma de decisiones en la
selección de las plataformas institucionales. En este sentido, es necesario responder a la
siguiente pregunta:
¿La plataforma de educación en línea que se propone usar cuenta con la capacidad de
incorporar el sistema de navegación decidido por la institución?
Labúsquedade
la respuestaala
pregunta anterior necesariamente enriquecerá los
procesos para la introducción sistemática de la educación en línea a la institución y evitará
muchos de los problemas asociados a la compatibilidad de programas de cómputoy
materiales en línea diseñados o adquiridos con proveedores externos.
Porotro lado, como todo programa de cómputo, el sistema de navegaciónpuede ser
diseñado por la propia institución o por ernpresas especialistas en dichos programas.
En ambas opciones es necesario que la institución acuerde la estructura de navegación
acorde a sus propias necesidades actuales y futuras, con la imagen que desea proyectar
a todo el mundo, que sea compatible con los recursos de cómputo y de comunicaciones
institucionales, que se garantice la posibilidad de que personal de la institución le haga
modificaciones y le de el mantenimiento necesario, etc.
Con base a lo anterior, se sustenta la necesidad del trabajo de un equipo institucional que
diseñedicha
estructura, considere, entre otros, los aspectos arribamencionadosy
determine cuál es la mejor opción para c,ontar con el sistema de navegación en plazos de
tiempo breves.
Conelfin
de iniciar el diseño de un sistema de navegación institucional, en este
documento se presentala estructura básica de un sistema de navegaciónpreliminar
orientado a la docencia en el nivel licenciatura de la UAM-lztapalapa.
En el diseño de esta propuesta se consultó a decenas de sitios disponibles en internet y,
en especial, se analizaron, entre otros, los sistemas disponibles al público del IPN,
ITESM, CIIDET-SEP, ILCE, ANUIES, Ciimara de Diputados, Gobierno Federal, Gobierno
de D.F., CENAPRED,SEPIENSA, Infotec, WebCT,Blackboard,Aulafácil,CyberCentral
Web de la U. de Berkeley, Ciudad Futura, UNED, UOC y Macromedia.
No obstante la variedad de los sistemas de navegación analizados, se pueden observar
coincidenciasquepermitieron
normar un criterio personal paraincluirelementospara
construir un primeresquema
de un sistema propio de laUAM-lztapalapa el cual, al
acordarse al interior de la institución, se instalaría en lasplataformasde educación en
líneapropias o ajenas que alberguen rnateriales didácticos en línea diseñados por el
personal de la Unidad.
Sirva esta propuesta como un primer catalizador para iniciar este trabajo, una propuesta
que no es acabada sino un primer estírnulo orientado a organizar un trabajo de equipo
6
que derive en un sistema de navegación de la UAM-lztapalapa útil para todos y, porqué
no, atractivo y agradable a la visión de los usuarios.
2. EDUCACION A DISTANCIA.
Este proyecto surgió con elfin cle poder dar cursos o clases dePosgrado vía
InterneteneláreadeCiencias
Sociales y Humanidades de la Universidad Autónoma
Metropolitana plantel Iztapalapa. Esta ideafue
propuesta por la división de Ciencias
Sociales y Humanidades en conjunto con el Laboratorio de Ingeniería de Software (LIS)
área 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 mencionamospara
impartir clases del área de Posgrado Ciencias Sociales y Humanidades pero se puede
ampliar a otras áreas.
Actualmente el sistema se ha ampliado a las áreas de licenciatura y a otras divisiones dentro
de la universidad y se tiene planeado que sea utilizado por otras instituciones distintas a la
(JAM.
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.
8
3. OBJETIVOS DEL SISTEMA.
Objetivos Generales:
El sistema debe reconocer cuatro grupos de usuarios(alumnos, profesores,
y
administradores, usuario general ), y desplegar las opciones pantallas
correspondientes a cada usuario.
El sistemadebe despliegar unapantalla en donde el usuario ingresasuloginyel
sistema lo validará y ubicará dentro de un grupo de usuarios.
El profesor o el alumno pueden elegir un curso de entre los que les corresponden.
El sistema desplegará una pantalla en donde el profesor podrá ver las fotografías de
todos sus alumnos y sus correspondientes correos electrónicos, teniendo la opción de
enviar un correo al alumno seleccionado.
El sistema desplegará una pantalla en donde el alumno podrá ver las fotografías de
todos sus compañeros de grupo y sus correos, teniendo la opción de enviar un correo
al alumno seleccionado o al profesor.
El sistemadebe permitir el envíodeimágenes,
éste envío lo realizará el profesor
desdealgunacomputadora
que este conectada a Internet y solo se asignaránlas
imágenes a un aula virtual en especifico.
El alumno podrá ver las imágenes que previamente su profesor envío al aula virtual en
la que esté inscrito.
El profesorpodrá enviar vía Internet notas, bibliografía,tareasyexámenesasus
alumnos, poniendo éstas en su aula virtual. Los alumnos debenpoderverestos
archivos.
El profesor podrá poner avisos con cierta vigencia, cuando se cumpla la vigencia del
archivo éste se eliminará automáticamente del sistema.
Cada grupo de usuarios debe tener acceso a una zona de ayuda en el sistema.
La interfaz debe ser agradable y eficiente.
9
- ...
"
4. 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 121cual 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.
Técnicas utilizadas en el desarrollo del proyecto.
Las principales técnicas utilizadas parael
desarrollo del proyecto, son enla
Ingeniería de Software el análisis de riesgos, 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.
Análisis y diseño orientado a objetos.
El proyecto se desarrolló sobre l a 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 incrementá1 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 enemigo a 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
1. - Levantamiento de Requerimientos.
Entregable
Modelo de requerimientos.
Modelo de Casos(USE CASE).
Modelo de Interfaz:
Pantallas principales.
Diagramas
de
transición
estados.
Modelo de dominio del
problema.
2. - Análisis.
Modelo de Análisis.
3. - Diseño.
Modelo de Diseño.
4. - Construcción.
Modelo de Construcción.
de
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 f i g l .
Prototipo 1
-”..+ Prototipo 2
1
Requerimientos
4
1
1
Análisis
__+
Requerimientos
Análisis
Diseño
1
Diseño
Construcción
Prototipo
n
4
Requerimientos
1
Análisis
1
&construcción
Diseño
Construcción
.....
Aná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 lo 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 entornosobre el que va a
trabajar, pues son especialistas en desarrollar sistemas, no en la materia sobre la cual va
adesarrollar. El aprendizaje del entorno permite la elaboración deunproductomás
eficiente y libre de errores, pues así desarrolla una solución de un problema que conoce
(o que va conociendo). Todo este conocimiento lo absorbede
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
ModelodeCasos
Modelodelnterfaz
ModelodelDominio 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.Estemodelo
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.
I1
Ejemplo de Use Case.
Un USE CASE es precisamente una descripción de una transacción, donde no
sólo exhibe lo quehace, sino también incluye una serie estructuradadepasospara
realizarlaylos
entes que interactuan con éI o Actores. CadaUSECASE
separado como un objeto.
se tratapor
El sistema completo puede corlstar 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 7 objetos en cada nivel para asegurar la percepción(una
cantidad mayor será difícil de
entender, una cantidad menor podría ser incluida en otro
nivel).
>
>.
Almacenista
Entrada de Arliculos
~
Entrada por Dewluclón Entada por Compra Entrada por Transferencla
Ejemplo de USE CASE.
Sobre el Modelo de lnterfaz 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
retroalimentació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 de/ Dominio del f'roblema se establecerán los principales objetos
que constituirán al sistema y las relaciones que tienen entre sí. Los objetos persistentes
almacenaráninformació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
@FechaOC @
+FOIIOOC @
~&ArticulosOC
@CantldadesOC
Se utdlza en
Articulo
O '
+C\RAIIIC @
&DescArtlc
QPrecloArttc
&ExlstenclasArtc
1
I '
Conesponde
,
Se ubllza en
O '
.Almacenista
.... -.
....
"
@
tgNomElnp
1
o
0..1
Entrada
* QFechaEnt @
&FolioEnt @
&ArticulosEnt
Ejemplo de Modelo de dominio del problema
El proceso completo de levantamiento de requerimientos se desarrolla de la
siguiente 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
se
llevarlasacabo.
Se desarrolla un modelo inicialcon éI o los USE CASEque
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 los cambios que se hagan al modelo sean mínimos.
Es importante recalcar que el procedimiento 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.
Al final se tendrá una descripcióndetallada del comportamiento y comunicación que existe
entre los diversos objetos que realizan una transacción. Para entender mejorestas
relacionesse construyen escenarios, que son instanciaciones de una transacción,es
decir,descripción de los pasos necesarios y los valores reales queseobtienen
o se
transmiten.Este escenario es referente auncomportamientoperfecto,y
los erroresy
excepciones se toman en cuenta hasta que un escenario es perfectamente interpretado.
Aquí es importante recalcar la utilidad del modelo 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 objetosde negocio que manejan la lógica paramanipulary
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 productoprincipalde
este proceso es el diagramadecolaboración,que
describe todos los objetos en juego para cada transacción, las llamadas que reciben y
hacen hacia otros objetos con sus parámetros respectivos(con sus tiposdedatos
recibidos y a retornar).
El diagrama de colaboración debe ser lo suficientemente detallado para entender
estas relaciones.
Ejemplo de Dia(7rama de Colaboración.
Diseño.
Prácticamente es una extensión al 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 adecuadas 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 hacen 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 Io mas clara y precisa posible para que el
programador la siga al pie de la letra.
Construcción.
Es ya la elaboración del producto. Culmina todos los esfuerzos con un prototipo
funcionalquesiguelas
especificaciones de todas las etapas anteriores, listopara
probarse y modificarse alimentando un prototipo subsecuente. Para un buen entregable
habrá que colocar comentarios amplios en 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
14
requerimientos en un principio los cambios son extensos porlasobservacionesy
modificacionespropuestas
por el usuario, tendiendo a estabilizarse, con lo cual el
procedimiento de prueba se encuentra inmerso 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. Ensuma,
durante todo el
desarrollose hacen pruebas, tomando como un hecho que unaetapaalimentaala
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 en 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 más importantes.
Para seguir unametodología orientada a objetos es indispensable unlenguaje
estándar 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 lenguajeunificadode
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 ejemplosmostradosenlasección
anterior de diagramasde estados, colaboración y secuencia han sido elaboradoscon
base en este lenguaje. AI ser un lenguaje estándar nos da un punto de partida ideal para
quecualquier gente que tenga nociones deelentiendanuestrasideasy
su contexto,
transformándoseenun
medio de comunicación efectivo, sin tener que extenderse
demasiadoen explicaciones, ejemplos, etc. Algunos elementosmásimportantes
del
lenguaje son los siguientes. :
Autotransicion
Actor
USE CASE
hcio
Transicion
,
7
Estado
V
Generalizaclon
Asociaclon
Agregacion
Fin
Liga hacia si mismo
1: Liga o mensaje
'..
,/'
Clase
Asociacion
Objeto
Mensaje
.
Automensale
S::
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 necesidades y disposición que se tenia para el
presente trabajo fue Rational Rose, una herramienta CASE que proporciona una interfaz
gráfica para el modelado. Con ella se tiene una buena administración de los proyectos
porque permite el desarrollo de prototipo!; incrementales 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.
Técnicas de programación en Java.
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 deun
browser compatible con Java. Las ventajas son evidentesyse
citan a
continuación:
I6
1. - Javaesmultiplataforma.
Puede un mismoprogramacorrerendiferentes
maquinas sin compilar y modificar nuevamente.
2. - AI utilizarse paginas HTML dinámicas o Applets el código reside realmente en
la maquina servidor(gateway) y es transportado 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 todas 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, permite 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
gestionar
y
Bases de Datos relacionales. Para que una 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 yase 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 compiladorJavaúnicamentegenera
el denominado Bytecode. Este código esun
código intermedio entre el lenguaje máquina del procesador y Java. Evidentemente este
código noes ejecutable por sí mismo en ningunaplataforma hardware, pues no se
corresponde con el lenguaje de ninguno de los procesadores que actualmente se conocen
(habráqueesperara
ver qué ocurre con los procesadores Java). Por lo tanto,para
ejecutaruna
aplicación Java es necesario disponer deun 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 unamáquinavirtual
específica.Asíque
cuando el ByteCode llegaalamá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 cada 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 lamáquina
virtual
desempeña otras funciones, como la de aislar los programasJava al entorno dela
máquina virtual, consiguiendo una gran seguridad.
Comoherramientase
utiliza JBuilder 4.0 de Borland, quees una herramienta
visual, eficientehasta
cierto punto. La~smáquinas utilizadas para eldesarrolloson
adecuadas y no tienen problema serios, 1pero 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
mediantemétodosremotos
(RMI) inmersos enun applet cliente y un servidor.Este
métodono funcionó, pues generó muchas restricciones en cuanto aseguridad. Los
navegadores o browsers no permiten tan fácilmente una conexión de este estiloysi
existen firewall y proxys entre las conexiones la comunicación es muy difícil. Por todo lo
anterior se decidió cambiar a servlets, que son muy adecuados para éstetipode
aplicaciones, con lo cual lacomunicacicm se realiza de forma conveniente y muy fácil,
además los servlets permiten la modificación de .
Técnicas de programación enHTML.
Paraque cualquier persona tenga un acceso fácila la clase virtual así como
información relativa con los cursos de la Universidad 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
muyricosu
contenido y posibilidades. Las versiones actuales de HTML(Lenguajede
Marcas para HiperTexto) proporcionan la posibilidad de cargar imágenes animadas, crear
ligas, botones con acciones predefinidas enun script (por ejemplo JavaScript) y otras
posibilidades sin la necesidad de contar con una máquina virtual como en el caso de los
applets, con lo que su uso es mucho más eficiente al 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
quenonecesariamente
se debe de hacer la construcción paso a paso, sinoquees
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.
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 Io 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 alumncls ingresan a la clase virtual. En todo el demás
tiempoelmaestroes
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
servlets que la utilizan, en caso de tener problemas de desempeño.
en todos los
I9
5. Esquema básico del sistema de nlavegación para la Universidad Virtual.
Preeliminar
Descripción
A continuación se presenta el esquema básico del sistema de navegación, tal como lo
observaría el usuario en una computadora. Cada cuartilla representa a lo que se observa
en la pantalla del monitor
Una vez que se ingresa al sistema de navegación se observan tres áreas:
1 , La barra de navegación vertical izquierda superior, que se denomina barra de
servicios para usuarios en general
2. La barra de navegación vertical izquierda inferior, llamada barra de servicios con
carácter de privado.
3. El área para textos, gráficas, imágenes, etc. (que incluye un sistema muy simple de
navegación) que se identifica como el área de trabajo.
Cabe mencionar que no se han desarrollado todas las posibles trayectorias del sistema,
ya que como bien se mencionó antes, éste es solo un esquema básico, cuya única
finalidad es presentar a groso modo la vi:;ión que tendría el usuario al utilizar el sistema.
En un principio se presenta sólo a la barra de servicios para usuarios en general, y más
tarde la de los servicios con carácter de privado. La primera barra se compone de 8 links,
cada uno de los cuales se describe brevemente a continuación:
Página Principal: Un link para regresar a la página de la universidad virtual desde
cualquier parte del sistema.
Biblioteca Virtual: Un link a la página de la biblioteca en línea de la UAMI:
http://amoxcalli.uam.mx
Conferencia Magistral: Aquí, los usuarios de la universidad virtual tendrán la
posibilidad de participar enconferencias !en tiempo real
con envío de voz e imagen (Actualmente en construcción).
Hemeroteca: Links a las páginas de losprincipales diarios de circulación nacional.
Cursos en línea: Información acerca de los cursos que se imparten actualmente en
la universidad virtual.
Divulgación: Links a diversas páginas con material didáctico para usuarios en
general.
Sitios de interés: Links adiversas páginas de interés general (gobierno, educación!
etc).
Ayuda general: Información acerca de los distintos links arriba descritos
Barra de navegación de servicios con carácter privado.
A esta parte, sólo tendrán acceso aquéllos usuarios que cuenten con una clave de usuario
dentro de la universidad virtual (alumnos, profesores y administradores) y ésta barra
variará dependiendo del perfil de usuario del que se trate.
En el caso del perfil de usuario profesor, esta barra constará de las siguientes partes:
-Aula Virtual: Una especie de chat en tiempo real, en donde el profesor y los
alumnos tendrán la oportunidad de tener una sesión en línea.
-Subir notas y apuntes: Aquí el profesor podrá poner en el aula virtual sus notas y
apuntes para el grupo.
-Subir bibliografía: Aquí el profesor podrá poner en el aula virtual la bibliografía
para el grupo.
-Subir tareas y exámenes: Aquí el profesor podrá poner en el aula virtual las
tareas y exámenes que desee dejar para el grupo.
-Poner avisos: Aquí el profesor podrá dejar en el aula virtual avisos para el grupo.
-Proyector de imágenes: Aquí el profesor podrá subir al aula virtual archivos de
imágenes que le puedan servir de apoyo durante la
sesión en línea con el grupo.
-Correos de alumnos: Aquí el profesor podrá consultar las direcciones de correo
electrónico de los alumnos en caso de que así lo requiera.
-Ayuda para el profesor: Una breve explicación sobre los puntos arriba
descritos.
En el caso del perfil de usuario alumno, esta barra constará de las siguientes partes:
-Aula Virtual: Una especie de chat en tiempo real, en donde el profesor y los
alumnos tendrán la oportunidad de tener una sesión en línea.
-Notas y apuntes: Aquí el alumno podrá bajar las notas y apuntes que el
profesor haya dejado para el grupo.
-Bibliografía: Aquí el alumno podrá consultar la bibliografía que el profesor haya
dejado para el grupo.
-Tareas y exámenes: Aquí el alumno podrá bajar las tareas y exámenes que el
profesor haya dejado para el grupo.
-Avisos: Aquí el alumno podrá consultar los avisos que el profesor haya dejado
para el grupo.
-Proyector de imágenes: Aquí el alumno podrá bajar las imágenes que el
profesor haya subido para apoyarse con las sesiones
en línea.
-Directorio: Aquí el alumno podrá consultar las direcciones de correo electrónico
de sus compañeros y del profesor si así Io desea.
-Ayuda para el alumno: Una breve explicación sobre los puntos arriba
descritos.
Finalmente, para el perfil de usuario administrador, la barra de servicios de carácter
privado, constará de los siguientes puntos:
- Alumnos: Aquí el administrador podrá realizar todo lo concerniente a altas, bajas,
consultas y cambios de alumnos.
- Profesores: Aquí el administrador podrá realizar todo lo concerniente a altas,
bajas y consultas de profesores.
-
UEA's: Aquí el administrador podrá realizar todo lo concerniente a altas,
bajas y consultasde UEA's.
- Cursos: Aquí el administrador podrá readizar todo lo concerniente a altas,
bajas y consultas de cursos.
22
6. Analisis y diseño.
PONER NOTA
S
MODELO DE REQUERIMIENTOS
Modelo de casos(Use Case)
1.-Use Case PonerNotas
maestro
PonerNotas
Descripción de la transacción Poner Notas en forma de Caso:
1.-El profesor oprime el botón poner notas en la pantalla del curso (ReciDato)
2.-El sistema muestra la pantalla de seleccionar notas(Envía Archivo)
3.-El profesor oprime el botón seleccionar notas
4.-El sistema despliega ventana de archivos
5.-EIprofesor selecciona el archivo correspondiente
6.-El profesor oprime el botón Enviar
7.-EIsistema envia la información al servidor lis.uam.mx.
8.-Se ejecuta el use case recibe archivo.
9.-EI profesor oprime regresar al botón principal.
10.-Fin
Modelo de casos(Use Case)
I .-Use Case Recibe Archivo
m a e s t ID
P onerNotas
RecibeArchivo
Descripción de la transacción Recibe Archivo en forma de Caso:
1.-El sistema obtiene los datos del archivo:
-Clave de grupo
-Clave de UEA
-Nombre de archivo
2.-El sistema obtiene el archivo
3.-EIsistema guarda el archivo en el subdirectorio:
notas/cveuea/cvegpo/Nombre del archivo
4.- El sistema guarda los datos en la base de datos del aula virtual.
Modelo de lnterfaz
Diagrama de transición de Estados(Use Case Poner Notas)
Pantalla Mensaje
A
Enviar
SeleccionarSubirNotas
>
Pantalla Curso
>
Pantalla Subir Notas
A
Seleccinar Archivo
Fin
Aceptar
V
a
v
Pantalla Examinar
24
Modelo del Dominio del problema
Diagrama de clases estáticas
Profesor
'.$$veprofesor
@NombreProfesor
@paswordProfesor
Notas
1
'&C\RG rupo
O..*
o
Curso
7.CveUEA
&:EPchivo
@Directorio
@Fecha
.*
1
QCveGrupo
MODELO DE ANALISIS DlNAMlCO
Use Case Poner Notas Escenario Correcto simple
1 .-Paginadel curso CH-O1 Graficas por computadora
se oprime el botón poner notas
se envia la CveUEA y CveGrupo
2.-el sistema muestra pagina poner notas con el nombre del curso la clave
del curso y la cve de la UEA.
3.-Se oprime botón seleccionar notas
4.-El usuario elige la unidad A
5.-EI usuario elige prueba.txt
6.-Se envia el archivo prueba.txt con CveGrupo,CveUEA
7.-EI sistema pone el archivo prueba.txt en notas/cveuea/cvegpo/ del servidor
8.-Se muestra la pantalla de envio satisfactorio con nombre de archivo,fecha,CveGrupo y
CveUEA
9.-EI profesor oprime el botón regresar
10.-El sistema muestra la pantalla de curso en el del menu inicial.
MODELO DE DISEÑO
Diagrama de Colaboración (Use Case PonerNotas)
OlRec~Dato
CReclDato
1 PonerNoIasO
2 subirNolas(CveUEA.Cve(;rupo,NombreUEA,CveProfesor)
OIEnuaArchlw
CEnuaArchlvo
.._
oNCaptumrArchlw
C(:apturarArchlw
"
ODCaptuladorBaSeDato5
CCapluradorBaseDalos
7 hayDalosNulos(datos,rleData)
'V
9 guardaArchlM(RleDala.RleD~reclorlo.fileNa~~)
5 ObtenValores(mult~parse.nparametros)
..1
,!"
8 creaDrectono(Palhdlrectorl0)
6 OblenArch~M(mull~parser)
\i
,,
Diagrama de Secuencia (Use Case Poner Notas)
OlReclDato
OIEnwaArchivo
ONCapturarArchlvo
ONCapturador
ODCaDturador
CReciDato
CEnviaArchim
CCapturarArchivc
Archivo
Profesor
profesor
BaseDatos
1 PonerNotasO
>
2 : subirNotas(CveUEA,CveGrupo,NombreUEA,CveProfesor)
>
3
Exarnlnar()
.>
4 ’ EnvlaDatos(CveUEA,CveGrupo,NombreUEA.CveProfesor)
.._
,
,
’
5: ObtenValores(multlparse,npararnetros)
.,.*
6 . ObtenArchivo(rnu1tiparser)
’,.
./
7 - hayDatosNulos(datos.flleData)
..
_”
8 creaDlrectorio(Pathdirector1o)
_..’
9 guardaArchlvo(flleData.hleDirectorio,flleNatne)
x,.:
10 insertadatos(ConlnteIBase,datos)
.,.;-
Diagrama de Clases Dinámicas (Use Case Poner Notas)
CapturarArchivo
ReciDato
OSubirNotasO
I
$ObtenV;alores()
+ObtenAvchivo()
%HayDatosNulos()
%CreaDirectorio()
$GuardaArchivo()
$lnsertaDatosAvisos()
$insertaDatosBibliografia()
OlnsertaDatos()
+MuestraAvisos()
+MuestraNotas()
+MuestraBibliografia()
V
EnviaArchivo
+EnviaDatos()
CapturadorBaseDatos
1
v
CapturadorArchivo
QNewM etlod()
28
PONER AVISOS
MODELO DE REQUERIMIENTOS
Modelo de casos(Use Case)
1.- Use Case Poner Avisos
profesor
ponerAvisos
Descripción de la transacción Poner Avisos en formade Caso:
1.-El profesor oprime el botón poner avisos en la pantalla del curso (ReciDato)
2.-El sistema muestra la pantalla de seleccionar avisos(Envia Archivo)
3.-El profesor oprime el botón seleccionar avisos
4.-El sistema despliega ventana de archivos
5.-EIprofesor selecciona el archivo correspondiente
6.-EI profesor oprime el botón enviar
7.-El sistema envia la información al servidor lis.uam.mx.
8.-Se ejecuta el use case recibe archivo.
9.-EI profesor oprime regresar al botón principal.
10.-Fin
Modelo de casos(Use Case)
1.- Use Case Recibe Archivo
<<usa>>
R e c i b e A r c h iAvvoi s o s
profesor
Poner
Descripción de la transacción Recibe Archivo en forma de Caso:
1.-El sistema obtiene los datos del archivo:
-Clave de grupo
-Clave de UEA
-Nombre de archivo
2.-EIsistema obtiene el archivo
3.-EI sistema guarda el archivo en el subdirectorio:
notas/cveuea/cvegpo/Nombre del archivo
4.- El sistema guarda los datos en la base de datos del aula virtual.
Modelo de lnterfaz
Diagrama de transición de Estados(Use Case Poner Avisos)
Pantalla Mensaje
A
Enviar
Seleccionar PonerAvisos
>
Pantalla Curso
>
Pantalla PonerAvisos
A
Seleccinar
Archivo
Fin
Aceptar
v
V
Pantalla Examrnar
Modelo del Dominio del problema
Diagrama de clases estáticas
Avisos
$.‘$ve
UEA
‘GbCVe G ru op
,,wNom
*.
breArchivo
I-!
@D ia
@Mes
@/AñO
30
MODELO DE ANALISIS DlNAMlCO
Use Case Poner Avisos Escenario Correcto simple
1 .-Paginadel curso CH-O1 Graficas por computadora
se oprime el botón poner avisos
se envia la CveUEA y CveGrupo
2.-el sistema muestra pagina poner avisos con el nombre del curso la clave
del curso y la cve de la UEA.
3.-Se oprime botón seleccionar avisos
4.-El usuario elige la unidad A
5.-EI usuario elige prueba.txt
6.-Se envia el archivo prueba.txt con CveGrupo,CveUEA
7.-El sistema pone el archivo prueba.txt en notas/cveuea/cvegpo/ del servidor
8.-Se muestra la pantalla de envio satisfactorio con nombre de
archivo,fecha,CveGrupo yCveUEA
9.-EI profesor oprime el botón regresar
10.-El sistema muestra la pantalla de curso en el del menu inicial.
MODELO DE DISEÑO
Diagrama de Colaboración (Use Case Poner Avisos)
OlRec,Dalo
CReclDato
1 PonerAusosO
Profesar
. I
4 E n u a D a l o s ( C v U E A , C v G ~ ~ p ~ , N ~ m b ~ ~ U E A . C v e P r o ~ e s10
or~
) nseltadalos(Conhle~ase.datos)
3 Examlnarl)
O i E n ~ a A u s o s,
CEnMaAwsos
.,
ONCaplurarArch~w
CCapturarArchlvo
e
'..
,
'
ODCaoluradorBaseDatos
CCavturadorBaseDatos
5 O b l e n V a l a i e s ( m u l i p a n e nparamelros)
!,
ONCavturadorArchlvo
C-CavturadorArchiw
31
.- .
...
"""."
l"
~
Diagrama de Secuencia (Use Case Poner Avisos)
OlReciDato
0IEnviaAvis;os
CEnviaAvisB
CReclDato
Profesor.
profesor
ONCaDturarArchivo
ONCapturador
ODCapturador
CCapturarArchlvo
Archivo
BaseDatos
1' PonerAvisos()
___I.
s.
2 ' sublrAwsos(CveUEA,CveGrupo.NombreUEA.CveProfesor)
.,'
3: Examinar()
;>
4 EnvlaDatos(CveUEA.c3veGrupo,NombreUEA,CveProfesor)
.._.
,.A
5 - ObtenValores(rnultlparse.nparametros)
,'.....
6 ObtenArchivo(mu1tlparser)
;:.
7 hayDatosNulos(datos.flleData)
...
/*
8 creaDlrectono(Pathdlrector1o)
,?>
9 : guardaArchlvo(fileData,fileDirectorlo,fileName)
.,:'
10 Insertadatos(ConlnterBase.datos)
-..
,.'
32
Diagrama de Cases Dinámicas (Use Case Poner Avisos)
CapturarArchlvo
ReciDato
OS ubirAvisos()
7
QObtenValores()
QObtenArchivo()
OHayDatosNulos()
OCreaDirectorio()
QGuardaArchivo()
'1 1
~
~
V
EnviaAvisos
CEnviaDatos()
CapturadorArchivo
QNewMethodO
~
CapturadorBaseDatos
OlnsertaDatosAvisos()
%nsertaDatosBibliografia()
QlnsertaDatos()
GMuestraAvisos()
OMuestraNotas()
3MuestraBibllografa()
PONER BIBLIOGRAFIA
MODELO DE REQUERIMIENTOS
Modelo de casos(Use Case)
1.- Use Case Poner Bibliografia
ponerBibliografia
profesor
Descripción de la transacción Poner Bibliografia en forma de Caso:
1.-El profesor oprime el botón poner notas en la pantalla del curso (ReciDato)
2.-El sistema muestra la opcion de seleccionar Bibliografía (Envia Archivo)
3.-EI profesor oprime el botón seleccionar Bibliografia
4.-EI sistema despliega ventana de archivos
5.-EI profesor selecciona el archivo correspondiente
6.-EI profesor oprime el botón enviar
7.-El sistema envia la información al servidor lis.uam.mx.
8.-Se ejecuta el use case recibe archivo.
9.-EI profesor oprime regresar al botón principal.
1O.-Fin
Modelo de casos(Use Case)
1.- Use Case Recibe Archivo
<<usa>>
profesor
RecibeArchivo
ponerBibliografia
34
Descripción de la transacción Recibe Archivo en formade Caso:
1.-El sistema obtiene los datos del archivo:
-Clave de grupo
-Clave de UEA
-Nombre de archivo
2.-El sistema obtiene el archivo
3.-EI sistema guarda el archivo en el subdirectorio:
notas/cveuea/cvegpo/Nombre del archivo
4.- El sistema guarda los datos en la base de datos del aula virtual.
Modelo de lnterfaz
Diagrama de transición de Estados(Use Case Poner Bibliografia)
Pantalla Mensaje
A
Envial
SeleccionarSubiBibliografia
~~
>
Pantalla Curso
3
Pantalla Subir Bibliografia
A
Seleccinar Archivo
Fin
Aceptar
V
Modelo del Dominio del problema
Diagrama de clases estáticas
Bibliografia
'VbCveUEA
'@CVeGrupo
'GiNombreArchivo
V
Pantalla Examinar
MODELO DE ANALISIS DlNAMlCO
Use Case Poner Bibliografia Escenario Correcto simple
1.-Pagina del curso CH-O1 Graficas por computadora
se oprime el botón poner bibliografía
se envia laCveUEA y CveGrupo
2.-el sistema muestra pagina poner bibliclgrafia con el nombre del curso la clave
del curso y la cve de la UEA.
3.-Se oprime botón seleccionar notas
4.-EI usuario elige la unidad A
5.-EI usuario elige prueba.txt
6.-Se envia el archivo prueba.txt con CveGrupo,CveUEA
7.-EI sistema pone el archivo prueba.txt en notas/cveuea/cvegpo/ del servidor
8.-Se muestra la pantalla de envio satisfactorio con nombre de archivo,fecha,CveGrupo y
CveUEA
9.-EI profesor oprime el botón regresar
10.-El sistema muestra la pantalla de curso en el del menu inicial.
MODELO DE DISEÑO
Diagrama de Colaboración (Use Case Poner Bibliografia)
OReclDato
CReclDato
1 PonerBlbllograflaO
3 ExarnlnarO
OIEnMaBlblloqraRa
CEnaaBlblloqraRa
..
ONCapturCCapturz rArchlw
:’
ODCapluradorBaSeDaloS
CCapturadorBaseDatos
7 hayDalosNulos(datos.RleDala)
36
Diagrama de Secuencia (Use Case Poner Bibliografía)
Profesor
profesor
OlReclDato
CReclDato
OlEnviaBlblioqrafla
CEnbiaBiblioarafia
ONCapturarArchlvo
CCapturarArchivu
ONCapturador
Archivo
ODCapturador
BaseDatos
1 ’ PonerBlbllografia(j
>
:
2: subilBibliografia(C~UEA,CveGrupo.NombreUEA,C~Profesorj
3 Examinar()
-..
~,’
4 EnuaDatos(CveUEA.CveGrupo,NombreUEA.CveProfesor)
>
:,
5 ObtenValores(multiparse,nparametros)
I
. I
2
6’ ObtenArchm(multlparser)
’..._
7 hayDatosNulos(datos,fileData)
-.
_
d
.
8: creaDlrectorio(Pathdirectorio)
~
>
;
9 guardaArchlvo(hleData,fileD!rectono,flleNamej
....2
10 Insertadatos(ConlnterBase.datos)
.;’
Diagrama de Clases Dinámicas (Use Case Poner
Bibliografía)
CapturarArchivo
Reci Dato
1
bSubirBibliografia()
7
i;Obten'\/alores()
+ObtenArchivo()
i;HayDatosNulos()
wreaDirectorio()
$GuardaArchivo()
CapturadorBaseDatos
~
Olnserta
DatosAvisos()
ainsertaDatosBibliografia()
Olnserta Datos()
OMuestraAvisos()
i;MuestraNotas()
OMuestraBibliografia()
V
Enviabibliografia
'd
OEnGaDatosO
~
CapturacorArchivo
ONewMothod()
Código
// ........................................ .... _ . _ _ . ....
. . ..................................
package proyectoCSH.upload;
. .
... ... EnviaArch~vo.]ava
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class EnviaArchivo extendsHttpServlet {
//Initialize global variables
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
1
//Process the HTTP Post request
public void service(HttpServ1etRequest request, HttpServletResponse response) throws
ServletException, IOException {
//nombre de la uea
String NombreUEA =
try { NombreUEA = request.getParameter("NombreUEA").toUpperCase();
} catch
(Exception e) { e.printStackTrace(); }
//clave de la uea
String CveUEA = "";
try { CveUEA = request.getParameter("CveUEA'); } catch (Exception e) {
e.printStackTrace(); }
//clave del grupo
String CveGpo = "";
try { CveGpo = request.getParameter("CveGpo").toUpperCase();
} catch (Exception e) {
e.printStackTrace(); }
//clave del profesor
String Cveprofesor =
try { Cveprofesor = request.getParameter("CveProf"); } catch
(Exception
e) {
e.printStackTrace(); }
response.setContentType("text/html");
Printwriter out = new Printwriter (response.getOutputStream());
out.println("<htmI>");
I"';
'I1';
out.println("<head><title>EnviaArchivo</title></head>");
out.println("<body
background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/f029.jpg~");
out.println("<p align=left><font size=3>UEA : "+CveUEA+"</font></p>");
out.println("<p align=left><font size=3>GRUPO : "+CveGpo+"</font></p>'');
out.println("<p
align=center><font
size=5~<strong~"+NombreUEA+"~/strong~~/font>~/p~");
out.println("<p
align=center><font
size=3><strong>Bienvenido
Profesor</strong></font></p>");
out.println("<p>Envie su Archivo Desde aquí,elija el archivo");
out.println("deseado con el botón </p>");
out.println("<p>Examinar(Browse)
y oprima Enviar.</p>");
out.println("<p>si no puede ver el botón examinar su navegador no puede");
out.println("enviar archivos.</p>");
out.println("<form
ENCTYPE=\"multipart/form-data\"
action=\"http://localhost:8080/examples/servlet/proyectoCSH.upload.CapturarArchivo\"");
out.println("method=\"post\">");
out.println("<input type=\"hidden\" name=\"CveGpo\" vaIue=\""+CveGpo+"\">");
out.println("<input type=\"hidden\" name=\"CveUEA\" value=\""+CveUEA+"\">");
//out.println("<BR><BR> Nombre del archivo<input type=\"text\" name=\"ref\">");
//out.println("<input type=Y'hidden\" name=\"NombreUEA\" value=\""+NombreUEA+Y">");
//out.println("<input type=\"hidden\" name=\"CveProf\" value=\""+Cveprofesor+"Y'>'');
out.println("<BR><BR>Descripcion
del achivo <textarea Name =Description Rows =2
Cols = 50 Wrap = virtual></textarea>");
out.println("<BR><BR><lNPUT
NAME=\"archivo\" TYPE=\"file\">");
out.println("<input type=\"submit\" value=';'Enviar datos\">");
out.println("</form>");
out.println("</body></htmb");
out.close();
1
//Get Servlet information
public String getServletlnfo() {
return "proyectoCSH.upload.EnviaArchivo
Information";
I
// ...........................................................................................
fin de listado EnviaArchivo.java
4o
// ........................ ... ....... .............
....CapturarArchivo.java
/* este servlet es el queguarda el archivo en el servidor*/
package proyectoCSH.upload;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.oreilly.servlet.multipart.*;
import java.sql.*;
public class CapturarArchivo extends HttpServlet {
String DBurllnterBase = "jdbc:odbc:Aula-Virtual";
// Nombre de la base de datos en ODBC "
//"jdbc:odbc:Aula-Virtual"
String UserName="SYSDBA"; //Usuario
String Password="masterkey";// Password
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers
de ODBC
Connection conlnterBase;
// Este metodo es el que se encarga de establecer
// la conexion con la base de datos
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
try {
Class.forName(Driver);
System.out.println("paso el driver");
conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password);
System.out.println("iniciando
conexion a la base de datos interbase");
1
catch( Exception e ) {
System.err.println(e.getMessage());
System.err.println("error en el init()");
}// fin del metodo init()
......................................................................
/
// Se cierra la conexion con la base de datos
public void destroy() {
super.destroy();
System.out.println("cerrando
conecciones ...") ;
try {
conlnterBase.close();
} catch( SQLException ex ) {
System.err.println("no se puede cerrar la conexion, error en destroy");
System.err.println("ex.getMessagge()");
1
}// fin del metodo destroy
public void doPost(HttpServ1etRequest request,
HttpServletResponse response)
throws IOException, ServletException {
MultipartParser mp = new MultipartParser(request, 7 * 1024 * 1024);
byte[] fileData = null;
response.setContentType("text/htmI");
Printwriter out = response.getWriter();
out.println("<html>");
out.println("<HEAD><TITLE>Capturandoarchivo</TITLE></HEAD>");
out.println("<body
background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~");
out.println("<p>lNlClANDO UPLOAD ");
try{
CapturadorArchivo ca = new CapturadorArchivo(out);
String datos[] = ca.obtenValores(3,mp);
out.println("<p>Datos recibidos:");
out.println("<p>
Grupo
= "+datos[O]);
= "+datos[l]);
out.println("<p>
UEA
out.println("<p> description= "+datos[2]):
fileData=ca.obtenArchivo(mp);
out.println("<p> Archivo = "+ca.FileNanle);
if (ca.hayDatosNulos(datos,fileData)==true){
out.println("<br><br><h3>por favor regrese a la pagina anterior");
out.println("<br><br> y llene todos los campos del formulario");
out.println("<br><br> para que se puedan guardar las notas</h3>");
}else{
String
pathDirectorio="E:\\EducacionDistancia\\~~ublic~html\\notas\~'+datos[l]+"\\"+datos[O];
ca.creaDirectorio(pathDirectorio);
try{
CapturadorBaseDatos cbd = new CapturadorBaseDatos(out);
cbd.insertaDatos(conlnterBase,datos,ca.FileName.replace('
','-'));
ca.guardaArchivo(fileData,pathDirectorio,ca.FileName.replace('
out.println("<p><font color=\"#OOOOFF\" size=\"2\"><em><strong>su archivo fue enviado
exitosamente</strong></em></font></p>");
out.println("<p><font color=\"#OOOOFF\" size=\"2\"~<em><strong>Desdeeste momento
esta disponible en la WEB<strong></emx/font></p>");
}catch(SQLException ex) {
System.out.println("<br>\n--- SQLException caught ---\n");
while (ex != null) {
out.println("<br>" + ex.getErrorCode 0 ) ;
out.println("<br>Posiblemente ya existe un archivo con el mismo nombre,");
out.println("<br>Cambie el nombre del archivo e intente nuevamente");
out.println("<br>Si el problema persiste, consulte con el Administrador de servicios");
System.out.println("<br>Message:
" + ex.getMessage 0 ) ;
System.out.println("<br>SQLState: " + ex.getSQLState 0 ) ;
System.out.println("<br>ErrorCode:
" + ex.getErrorCode 0 ) ;
ex = ex.getNextException();
out.println("<br>");
','-I));
1
//ca.guardaArchivo(fileData,pathDirectoi.io,ca.FileName);
1
42
}catch (Exception ex) {
out.println("<p>" + ex.toString());
1
out.println("</BODY>");
out.println("</HTML>");
}// del doPost
}// de la clase Capturar archivo
// ..........................................
Fin de CapturarArchivo.java
11_....._...._..._..
.... ................ ...... ....CapturadorArchivo.java
package proyectoCSH.upload;
import java.io.*;
import com.oreilly.servlet.multipart.*;
I**
esta clase implementa metodos para el manejo del stream
que recibimos del formulario
*I
public class CapturadorArchivo{
Printwriter out;
public String FileName;
long tamaño;
I**
el constructor del objeto recive el Printwriter para poder
mandar mensajes en la pagina html
*I
public CapturadorArchivo(PrintWriterPO) {
out = new PrintWriter(po);
FileName ="";
tamaño=O;
public CapturadorArchivo(Stringname, IPrintWriter PO, int tam ) {
out = new PrintWriter(p0);
FileName =name;
tamaño=tam;
1
I**
el metodo hayDatosNulos te regresa ver'dadero si algunos de los
datos que se enviaron es nulo porque el usuario no lleno
algun campo
*I
public boolean hayDatosNulos(String clatos[],byte[] fileData)
{
boolean key=false;
int j;
for(int i =O; i<datos.length; i++)
{
if( datos[i].length() == O )
{
out.println("<p>hay dato(S) nulo(S)");
key=true;
1
1
if(fileData==null)
44
key=true;
if(tamaño==O)
key=true;
return key;
1
I**
este metodo regresa los valores que no sean el archivo
en un arreglo de tamaño nParametros de cadenas
utilizando un objeto MultipartParser
*I
public String[] obtenvalores (int nParametros,
MultipartParser mp)throws IOException{
String datos[]= new String[nParametros];
int j=O;
Part p;
while(j < nparametros) {
p = mp.readNextPart();
if (p instanceof Parampart){
datoslj] = ((Parampart) p).getStringValue();
j++;
1
1
return datos;
1
I**
Este metodo regresa un arreglo de bytes
que contiente al archivo, utilizando un objeto
MultipartParser
*I
public byte[] obtenArchivo (MultipartParser mp)
throws IOException{
byte fileData[]= null;
Part p = mp.readNextPart();
while(p != null) {
if (p instanceof FilePart) {
FileName=((FilePart) p).getFileName();
if( FileName!=null){
ByteArrayOutputStream ba = new ByteArrayOutputStream();
tamaño=((FilePart) p).writeTo(ba);
fileData = ba.toByteArray();
1
I
p = mp.readNextPart();
1
return fileData;
1
I**
Este metodo crea un directorio en pathDir
y si ya existe no hace nada, regresa falso
si por alguna razon no se puede crear el
directorio
*I
public boolean creaDirectorio (String pathDir)
throws IOException{
/I buscamos el directorio
boolean key= true;
File directorio = new File(pathDir);
if(directorio.isDirectory())
out.println("<p>ya existe el directorio");
else{
out.println("<br>creando el directorio");
if (key=directorio.mkdirs())
out.println("<br>directorioscreado");
else
out.println("<br>directorios
no creado");
1
return key;
}
I**
Este metodo guarda en una archivo de nombre
fileName y de path pathDir lo contenido en
fileData
*/
public void guardaArchivo(byte[] fileData, String pathDir, String fileName )
throws IOException{
out.println("cbr>"+pathDir);
out.println("<br>"+fileName);
if (fileData != null){
String path = new String(pathDir+"\\"+fileName);
out.println("<br>esta es la ruta completa :");
out.println("<br>"+path);
FileOutputStream fos = new FileOutputStream(path,true);
46
out.println("<br> se crea fos");
fos.write(fileData);
out.println("<br> se escribe en fosfileData");
fos.flush();
out.println("<br> se vacia el bufer");
fos.close();
out.println("<br> se cierra el archivo");
1
else out.println("<br> fileData = NULL");
1
1
// ............................................
fin de CapturadorArchivo.java
11......... ......... .._...........................CapturadorBaseDatos.java
package proyectoCSH.upload;
import java.sql.*;
import java.io.*;
import java.util.*;
public class CapturadorBaseDatos {
Printwriter out;
I**
Constructor que necesita Printwriter para
escribir en la pagina html
*I
public CapturadorBaseDatos(PrintWriterPO){
out = new PrintWriter(p0);
1
I**
Este metodo se encarga de insertar los datos del archivo
almacenado en el servidor en la tabla Avisos2 de la base de
datos del aula virtual acepta los parametros
a insertar en un arreglo, realiza la senterlcia con el
objeto con
*I
public void insertaDatosAvisos( Connection con, String datos[], String FileName)
{
throws IOException,SQLException,NumberFormatException
Preparedstatement pstm = con.prepareStatement("lNSERTINTO AVISOS2"+
"(CVEUEA,CVEGRUPO,NOMBREARCHIVO,DIA,MES,A)"+
"VALUES(?,?,?,?,?,?)");
pstm.setlnt(1,Integer.valueOf(datos[l]).intValue());
pstm.~etString(2,datos[O]);
pstm.setString(3,FileName);
pstm.setlnt(4,Integer.valueOf(datos[2]).intValue());
pstm.setlnt(5,Integer.valueOf(datos[3]).intValue());
pstm.setlnt(6,Integer.valueOf(datos[4]).intValue());
pstm.executeUpdate();
1
I**
Este metodo se encarga de insertar los datos del archivo
almacenado en el servidor en la tabla BlBLlOGRAFlA de la base de
datos del aula virtual acepta los parametros
a insertar en un arreglo, realiza la sentencia con el
objeto con
*I
public void insertaDatosBibliografia( Connection con, String datos[], String FileName)
throws IOException,SQLException,NumberFormatException{
Preparedstatement pstm = con.prepareStatement("lNSERT
INTO BIBLIOGRAFIA"+
48
"(CVEUEA,CVEGRUPO,NOMBREARCHIVO)"+
"VALUES(?,?,?)");
pstm.setlnt(1 ,Integer.valueOf(datos[l]).intValue());
pstm.~etString(2,datos[O]);
pstm.setString(3,FileName);
pstm.executeUpdate();
1
/**
Este metodo se encarga de insertar los datos del archivo
almacenado en el servidor en la tabla notas de la base de
datos del aula virtual acepta los parametros
a insertar en un arreglo, realiza la sentencia con el
objeto con
*/
public void insertaDatos( Connection con, String datos[], String FileName)
throws IOException,SQLException,NumberFormatException{
Preparedstatement pstm = con.prepareStatement("lNSERT
INTO NOTAS"+
"(CVEUEA,CVEGRUPO,NOMBREARCHIVO,DESCRIPCION)"+
"VALUES(?,?,?,?)");
pstm.setlnt(1 ,Integer.valueOf(datos[l]).intValue());
pstm.~etString(2,datos[O]);
pstm.setString(3,FileName);
pstm.~etString(4,datos[2]);
pstm.executeUpdate();
1
public void MuestraAvisos( String path , Connection con, String CveGpo, String CveUEA)
{
throws IOException,SQLException,NumberFormatException
String NombreArchivo="";
con.prepareStatement("SELECT
Preparedstatement
pstm
NOMBREARCHIVO,DIA,MES,A
FROM
AVISOS2
WHERE
CVEGRUPO=
? AND
CVEUEA= ? ");
Preparedstatement pstmdel= con.prepareStatement(" DELETE FROM AVISOS2 WHERE
NOMBREARCHIVO = ? ");
pstm.setString(1 ,CveGpo);
int claveuea=lnteger.valueOf(CveUEA).intValue();
pstm.setlnt(2,claveuea);
Resultset rs = pstm.executeQuery();
Calendar cad = Calendar.getlnstance();
Calendar hoy = cad.getlnstance();
/* copia de la variable */
while (rs.next()) {
NombreArchivo=rs.getString("NOMBREA.RCHIVO");
int dia=rs.getlnt("DIA");
int mes=rs.getlnt("MES")-I;
int año=rs.getlnt("A");
cad.set(año,mes,dia);
if( cad.after(hoy) 11 cad.equals(hoy) )
{
// out.println("<br>vigencia:
"+dia+" "+mes+" "+año+" ");
out.println("
<a
href=\"htt~://infocbi.uam.mx:~5/A~isos/'+~~veUEA+''/'+CveGpo+''/'+NombreArch~vo+"~'~"+
NombreArchivo+"</a>");
1
else
c
// si la caducidad es anterior a hoy, entonces borra el archivo
File temp = new File(path+NombreArchivo);
//out.println("<TR> nombre del archivo a borrar");
//out.println("<TR>"+path+"<TR>"+
NombreArchivo);
boolean qp=temp.delete();
//out.println("<TR>borrado = 'l+qp );
// y se borra de labase de datos//
pstmdel.setString(1 ,NombreArchivo);
pstmdel.executeUpdate();
1
1
out.println("</table>");
1
/**
este metodo muestra las notas existentes
en la base de datos para la clave de grupo
y la clave de uea proporcionada
*/
public void MuestraNotas( Connection can, String CveGpo, String CveUEA)
{
throws IOException,SQLException,NumberFormatException
System.out.println("enre al MuestraNotas");
String NombreArchivo,Descripcion="";
System.out.println("enre al MuestraNotas variables");
= con.prepareStatement("SELECT NOMBREARCHIVO,
Preparedstatement
pstm
DESCRIPCION FROM NOTAS WHERE CVEGRUPO= ? A N D CVEUEA= ? ");
System.out.println("PreparedStatement
pstm =");
O
pstm.setString(1 ,CveGpo);
System.out.println("pstm.setString(1
,CveGpo);");
int claveuea=lnteger.valueOf(CveUEA).intValue();
System.out.println("int claveuea=lnteger.valueOf(CveUEA).intValue();");
System.out.println("int claveuea= "+claveuea);
pstm.setlnt(2,claveuea);
System.out.println("pstm.setlnt(2,claveuea);");
Resultset rs = pstm.executeQuery();
System.out.println("ResuItSet
rs = pstm.executeQuery();");
out.println("<table
border=Y'2Y'
bgcolor=Y'#FFFFFF\"
bordercolordark=\"#OOOOOOY' bordercolorlight=\"#OOOOOOY'~");
while (rs.next()) {
bordercolor=Y'#OOOOOOY'
NombreArchivo=rs.getString("NOMBREARCHlVO");
Descripcion=rs.getString("DESCRIPCION");
/*
<table border="2">
<tr>
<td> </td>
<td> </td>
</tr>
</table>
*/
out.println("<TR>");
out.println("<TD>  <a
href=~'http://infocbi.uam.mx:85/notas/"+CveUEA+"/"+CveGpo+"/"+NombreArchivo+"Y'~"+
NombreArchivo+"</a>  </TD>");
out.println("~TD> "+Descripcion+" ~~D~");
}
out.println("</table>");
}
I**
este metodo muestra las notas existentes
en la base de datos para la clave de grupo
y la clave de uea proporcionada
*/
public void MuestraBibliografia( Connection con, String CveGpo, String CveUEA)
throws IOException,SQLException,NumberFormatException{
System.out.println("enre al MuestraBibliografia");
String NombreArchivo =
I"';
System.out.println("enre al MuestraNotas variables");
Preparedstatement pstm = con.prepareStatement("SELECTNOMBREARCHIVO FROM
BIBLIOGRAFIA WHERE CVEGRUPO= ? A N D CVEUEA= ? ");
System.out.println("PreparedStatement
pstm =");
pstm.setString(1 ,CveGpo);
System.out.println("pstm.setString(1
,CveGpo);");
int claveuea=lnteger.valueOf(CveUEA).intValue();
System.out.println("int claveuea=lnteger.valueOf(CveUEA).intValue();");
System.out.println("int claveuea= "+claveuea);
pstm.setlnt(2,claveuea);
System.out.println("pstm.setlnt(2,claveue~~);");
Resultset rs = pstm.executeQuery();
System.out.println("ResultSet
rs = pstm.executeQuery();");
out.println("<table
border=Yt2Y'
bgcolor=Y'#FFFFFFY'
bordercolordark=Y'#OOOOOOY'bordercolorlight=\"#OOOOOOY'~");
while (rs.next()) {
bordercolor=Y'#OOOOOOY'
NombreArchivo=rs.getString("NOMBREP,RCHlVO");
/*
<table border="2">
<tr>
<td> </td>
<td> </td>
</t r>
</table>
*I
1
// ........................................
fin del CapturadorBaseDatos.java
52
I/........ . . . . . . . .. . ... . ... . . . . .. .... ... . . . . .. . . . .RevisaNotas.java
package proyectoCSH.upload;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class RevisaNotas extends HttpServlet {
//Initialize global variables
String DBurllnterBase = "jdbc:odbc:Aula-Virtual-Prueba";
String UserName="SYSDBA'; //Usuario
String Password="masterkey";// Password
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers
de ODBC
Connection conlnterBase;
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
try {
Class.forName(Driver);
System.out.println("paso el driver");
conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password);
conexion a la base de datos interbase");
System.out.println("iniciando
1
catch( Exception e ) {
System.err.println(e.getMessage());
System.err.println("error en el init()");
}// fin del metodo init()
......................................................................
/
// Se cierra la conexion con la base de datos
public void destroy() {
super.destroy();
System.out.println("cerrando
conecciones
try {
conlnterBase.close();
} catch( SQLException ex ) {
System.err.println("no se puede cerrar la conexion, error en destroy");
System.err.println("ex.getMessagge()");
...'I);
1
}// fin del metodo destroy
//Service the request
public void service(HttpServ1etRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
Printwriter out = new Printwriter (response.getOutputStream());
out.println("<htmI>");
out.println("<head><title>zona
de descarga</title></head>");
out.println("<body
background=http://infocbi.uam.mx:85/Edu~cDistancia/PrincipalPag/fO29.jpg~");
//nombre de la uea
String NombreUEA =
try { NombreUEA = request.getParameter("NombreUEA');
} catch (Exception e) {
e.printStackTrace(); }
//clave de la uea
String CveUEA = "";
try { CveUEA = request.getParameter("CveUEA"); } catch (Exception e) {
e.printStackTrace(); }
//clave del grupo
String CveGpo = '"';
try { CveGpo = request.getParameter("CveGpo"); } catch (Exception e) {
e.printStackTrace(); }
//clave del profesor
String Cveprofesor = "";
try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) {
e.printStackTrace(); }
out.println("<p align=left><font size=3>UEA : "+CveUEA+"</font></p>");
out.println("<p align=left><font size=3>GRUPO : "+CveGpo+"</font></p>");
out.println("<p
align=center><font
size=3~~strong~"+NombreUEA+"~/strong>~/p~");
out.println("<p
align=center><font
size=2><strong>
Notas
disponibles
del
curso</strong></font></p>");
out.println("<p><font size=2>desde aqui puedes descargar tus
archivos
para el
curso</font></p>");
'I";
try{
CapturadorBaseDatos cbd = new CapturadorBaseDatos(out);
cbd.MuestraNotas(conlnterBase,CveGpo,CveUEA);
}catch(SQLException ex) {
out.println("<br>\n--- SQLException caught ---\n");
while (ex != null) {
out.println("<br>POR
MOMENTO
EL
NO SE
PUEDEN
MOSTRAR
LOS
ARCHIVOS");
System.out.println("<br>Message:
" + ex.getMessage 0 ) ;
System.out.println("<br>SQLState:
" + ex.getSQLState 0 ) ;
System.out.println("<br>ErrorCode:
" + ex.getErrorCode 0 ) ;
out.println("<br>ErrorCode: + ex.getErrorCode 0 ) ;
ex = ex.getNextException();
System.out.println("<br>error");
I'
1
1
out.println("</body></htmb");
out.close();
54
//Get Servlet information
public String getServletlnfo() {
return "proyectoCSH.upload.RevisaNotas
Information";
1
1
// ...........................................
fin del ReviasNotas.java
// ........................................................................
// .........................
Fin del package upload
package avisos2
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EnviaAvisos.java
package proyectoCSH.Avisos2;
import proyectoCSH.upload.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class EnviaAvisos extendsHttpServlet {
//Initialize global variables
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
1
//Process the HTTP Post request
public void service(HttpServ1etRequest request, HttpServletResponse response) throws
ServletException, IOException {
//nombre de la uea
String NombreUEA = "";
try { NombreUEA = request.getParameter("NombreUEA").toUpperCase();
} catch
(Exception e) { e.printStackTrace(); }
//clave de la uea
String CveUEA =
'I";
try { CveUEA = request.getPararneter("CveUEA'); } catch (Exception e) {
e.printStackTrace(); }
//clave del grupo
String CveGpo = "";
try { CveGpo = request.getParameter("CveGpo").toUpperCase();
} catch (Exception e) {
e.printStackTrace(); }
//clave del profesor
String Cveprofesor = "";
try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) {
e.printStackTrace(); }
response.setContentType("text/html");
Printwriter out = new Printwriter (response.getOutputStream());
Calendar fecha = Calendar.getlnstance();
int dia = fecha.get(fecha.DAY-OF-MONTH);
int mes = fecha.get(fecha.MONTH)+l;
int año = fecha.get(fecha.YEAR);
out.println("<html>");
out.println("<head><title>EnviaAvisos</title></head>");
out.println("<body
background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~
out.println("<p align=left><font size=3>"+CveUEA+"</font>dp>");
out.println("<p align=left><font size=3>"+CveGpo+"</font>~/p>");
out.println("<p
align=center><font
size=5~~strong~"+NombreUEA+"~/stron~~~~/font~~/p~");
size=3><strong>vienvenido
out.println("<p
align=center><font
profesor</strong></font></p>");
out.println("<p>en este espacio puede");
out.println("enviar avisos de su curso con una fecha de vigencia </p>");
>'I);
out.println("<form
action=\"http://infocbi.uam.mx:85/servlet/proyectoCSH.Avisos2.CapturarAvisos~"');
out.println("method=\"postY'>");
out.println("<input type=\"hidden\" name=\"CveGpo\" value=\""+CveGpo+"\">");
out.println("<input type=\"hidden\" name=\"CveUEA\" value=\""+CveUEA+"\">");
/*datos del aviso*/
out.println("<BR>vigencia :      ");
out.println("dia <input type=\"text\" name--\"d\" value=\""+dia+"\" size=\"2\">");
out.println("mes <input type=\"text\" namc?=\l'm\l' value=Y"'+mes+''Y'size=\"2\">");
out.println("año <input type=\"text\" name=\l'a\" value=\""+ario+"\" size=\"4\">");
out.println("<BR><BR>Nombre
del aviso:   ");
out.println("        ");
out.println(" <input
type=\"text\" name=\"nombre\" >");
out.println("<BR><BR><p>Texto
del aviso:</p>");
out.println("<textarea Name =contenido Rows =IO C o k = 50");
56
out.println("Wrap = virtual></textarea>");
out.println("<BR><BR><input
type=\"submit\" value=\"Enviar\">");
out.println("<BR><BR>");
out.println("</form>");
out.println("</body></htmI>");
out.close();
1
//Get Servlet information
public String getServletlnfo() {
return "proyectoCSH.upload.EnviaArchivo
Information";
1
1
//fin del ...........................................................................
... ......... EnviaAvisos.java
57
// ...................... ......... CapturarAvisos.java
/* este servlet es el que guarda el archivo en el servidor*/
package proyectoCSH.Avisos2;
import proyectoCSH.upload.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//import com.oreilly.servlet.multipart.*;
import java.sql.*;
public class CapturarAvisos extends HttpServlet {
String DBurllnterBase = "jdbc:odbc:Aula--Virtual";
// Nombre de la base dedatos en ODBC "
/l"jdbc:odbc:Aula-Virtual"
String UserName="SYSDBA'; //Usuario
String Password="cbi208399";// Password
de ODBC
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers
Connection conlnterBase;
// Este metodo es el que se encarga de establecer
// la conexion con la base de datos
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
try {
Class.forName(Driver);
System.out.println("paso el driver");
conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password);
System.out.println("iniciando
conexion a la base de datos interbase");
1
catch( Exception e ) {
System.err.println(e.getMessage());
System.err.println("error en el init()");
}// fin del metodo init()
....................................................................... /
// Se cierra la conexion con la base de datos
public void destroy() {
super.destroy();
System.out.println("cerrando
conecciones ...");
try {
.
conlnterBase.close();
} catch( SQLException ex ) {
System.err.println("no se puede cerrar la conexion, error en destroy");
System.err.println("ex.getMessagge()");
}// fin del metodo destroy
public void doPost(HttpServ1etRequestrequest,
HttpServletResponse response)
5s
throws IOException, ServletException {
//clave del grupo String datos[]= new String[nParametros];
String datos[] = new String[7];
//String CveGpo = "";
try { datos[O]= request.getParameter("CveGpo").toUpperCase();
} catch (Exception e) {
e.printStackTrace(); }
//clave de la uea
//String CveUEA = "";
try { datos[l] = request.getParameter("CVeUEA"); } catch (Exception e) {
e.printStackTrace(); }
//d ia
//String dia="";
try { datos[2] = request.getParameter("d"); } catch (Exception e) { e.printStackTrace(); }
//mes
//String mes = "";
try { datos[3] = request.getParameter("m"); } catch (Exception e) { e.printStackTrace(); }
//año
//String año = "";
try { datos[4] = request.getParameter("a"); } catch (Exception e) { e.printStackTrace(); }
//nombre
//String nombre = "";
try { datos[5] = request.getParameter("nombre"); } catch (Exception e) {
e.printStackTrace(); }
//contenido
//String contenido = "";
try { datos[6] = request.getParameter("contenido");
} catch (Exception
e)
{
e.printStackTrace(); }
response.setContentType("text/htmI");
Printwriter out = response.getWriter();
out.println("<html>");
out.println("<HEAD><TITLE>capturando
aviso</TITLE></HEAD>");
out.println("<body
background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~");
try {
out.println("<p>Datos recibidos:");
= "+datos[O]);
out.println("<p>
Grupo
= "+datos[l]);
out.println("<p>
UEA
= "+datos[2]);
out.println("<p>
dia
= "+datos[3]);
out.println("<p>
mes
= "+datos[4]);
out.println("<p> año
out.println("<p> nombre = "+datos[5]);
out.println("<p> contenido = "+datos[6]);
/* se guarda el contenido en un archivo llamado nombre*/
/* se guarda en la base de datos el nombre del achivo
el grupo, la uea y la vigencia*/
CapturadorArchivo ca = new CapturadorArchivo(datos[5],out,datos[6].length());
byte[] fileData = datos[6].getBytes();
//ileData=ca.obtenArchivo(mp);
//ut.println("<p> Archivo = "+ca.FileName);
if (ca.hayDatosNulos(datos,fileData)==true){
out,println("<br><br><h3>por favor regrese a la pagina anterior");
out.println("<br><br> y llenetodos los campos del formulario");
out.println("<br><br> para que se puedan guardar las notas</h3>");
}else{
String
pathDirectorio="E:\\EducacionDistancia\\public~html\\Avisos\~'+datos[l]+"\\"+datos[O];
//String
pathDirectorio="C:\\jswdk1.0.1\\examples\\EducacionDistancia\\public~html\\Avisos\~'+datos[l]+"\\"+datos[O];
ca.creaDirectorio(pathDirectorio);
try{
CapturadorBaseDatos cbd = new CapturadorBaseDatos(out);
cbd.insertaDatosAvisos(conlnterBase,datos,ca.FileName.replace('
ca.guardaArchivo(fileData,pathDirectol-io,ca.FileName.replace('
out.println("<p><font color=\"#OOOOFF'I" size=\"2\">~em>~strong>su
aviso fue enviado
exitosamente</strong></em></font>4p>");
out.println("<p><font color=\"#OOOOFF\." size=\"2\"><em><strong>Desde este momento
esta disponible <strong></em></font></~~>");
}catch(SQLException ex) {
System.out.println("<br>\n--- SQLException caught ---\n");
while (ex != null) {
out.println("<br>" + ex.getErrorCode 0 ) ;
out.println("<br>Posiblemente ya existe un archivo con el mismo nombre,");
out.println("<br>Cambie el nombre del archivo e intente nuevamente");
out.println("<br>Si el problema persiste, consulte con el Administrador de servicios");
System.out.println("<br>Message:
" + ex.getMessage 0 ) ;
System.out.println("<br>SQLState: " + ex.getSQLState 0 ) ;
System.out.println("<br>ErrorCode:
" + ex.getErrorCode 0 ) ;
ex = ex.getNextException();
out.println("<br>");
','-I));
','-I));
1
//ca.guardaArchivo(fileData,pathDirectorio,ca.FileName);
1
1
}catch (Exception ex) {
out.println("<p>" + ex.toString());
out.println("</BODY>");
out.println("</HTML>");
}// del doPost
}// de la clase Capturararchivo
60
// .............................
fin del..CapturarAvisos.java
11... . . . . . . . . . . . . . . . .RevisaAvisos.java
package proyectoCSH.Avisos2;
import proyectoCSH.upload.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class RevisaAvisos extends HttpServlet {
//Initialize global variables
String DBurllnterBase = "jdbc:odbc:Aula-Virtual";
String UserName="SYSDBA"; //Usuario
String Password="cbi208399";// Password
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers
de ODBC
Connection conlnterBase;
pathDirectorio="C:\\jswdk//String
1.O. 1\\examples\\EducacionDistancia\\public_hvisos\\";
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
try {
Class.forName(Driver);
System.out.println("paso el driver");
conlnterBase=DriverManager.getConnection(DBurllnterBase,UserName,Password);
System.out.println("iniciando
conexion a la base de datos interbase");
1
catch( Exception e ) {
System.err.println(e.getMessage());
System.err.println("error en el init()");
1
}// fin del metodo init()
......................................................................
/
I/ Se cierra la conexion con la base de datos
public void destroy() {
super.destroy();
System.out.println("cerrando conecciones ...");
try {
conlnterBase.close();
} catch( SQLException ex ) {
System.err.println("no se puede cerrar la conexion, error en destroy");
System.err.println("ex.getMessagge()");
1
}// fin del metodo destroy
//Service the request
public void service(HttpServ1etRequestrequest, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/htmI");
Printwriter out = new Printwriter (response.getOutputStream());
out.println("<html>");
out.println("<head><title>AVISOS</title></head>");
out.println("<body
background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~");
//nombre de la uea
String NombreUEA = "";
try { NombreUEA = request.getParameter("NombreUEA'); } catch(Exceptione)
{
e.printStackTrace(); }
//clave de la uea
String CveUEA =
try { CveUEA = request.getParameter("CveUEA"); } catch
(Exception
e) {
e.printStackTrace(); }
//clave del grupo
String CveGpo = "";
try { CveGpo = request.getParameter("CveGpo"); } catch (Exception e) {
e.printStackTrace(); }
//clave del profesor
String Cveprofesor =
try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) {
e.printStackTrace(); }
out.println("<p align=left><font size=3:.UEA
: "+CveUEA+"</font></p>");
out.println("<p align=left><font size=3:.GRUPO : "+CveGpo+"</font></p>");
out.println("<p
align=center><font
size=3~~strong~"+NombreUEA+"~/strong~~/font~~/p~");
out.println("<p
align=center><font
size=2><strong> del Avisos
curso</strong></font></p>");
//out.println("<p><font size=2>desde aqui puedes ver o descargarlabibliogfiadel
curso</font></p>");
'"I;
'I1';
try {
CapturadorBaseDatos cbd = new CapturadorBaseDatos(out);
String
pathDirectorio="E:\\EducacionDistancia\\pubIic-htmI\~v;sos\~'+CveUEA+"\~'+CveGpo+"\\";
//String
pathDirectorio
"C:\\jswdk1.O.l\\examples\\EducacionDistancia\\public_html\\Avisos\\"+CveUEA+"\\"+CveGpo+"\\";
cbd.MuestraAvisos(pathDirectorio,conlnterBase,CveGpo,CveUEA);
}catch(SQLException ex) {
out.println("<br>\n--- SQLException caught ---\n");
while (ex != null) {
out.println("<br>POR EL MOMENTO NO SE PUEDEN MOSTRAR LOS ARCHIVOS");
out.println("<br>Message: " + ex.getMessage 0 ) ;
62
out.println("<br>SQLState: " + ex.getSQLState 0 ) ;
System.out.println("<br>ErrorCode:
" + ex.getErrorCode 0 ) ;
out.println("<br>ErrorCode: " + ex.getErrorCode 0 ) ;
ex = ex.getNextException();
System.out.println("<br>error");
1
1
out.println("</body></html>");
out.close();
1
//Get Servlet information
public String getServletlnfo() {
return "proyectoCSH.upload.RevisaNotas
Information";
1
1
// ...........................
fin del RevisaAvisos.java
// .........................
fin del package avisos2.java
// _._..........._......p
ackage proyectoCSH.bibliografia
// ..........__.........
archivo EnviaBibliografia.java
package proyectoCSH.bibliografia;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class EnviaBibliografia extends HttpServlet {
//Initialize global variables
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
1
//Process the HTTP Post request
public void service(HttpServ1etRequest request, HttpServletResponse response) throws
ServletException, IOException {
//nombre de la uea
String NombreUEA =
try { NombreUEA = request.getPal-ameter("NombreUEA").toUpperCase(); } catch
(Exception e) { e.printStackTrace(); }
//clave de la uea
String CveUEA =
try { CveUEA = request.getParameter("CveUEA"); } catch
(Exception
e) {
e.printStackTrace(); }
//clave del grupo
String CveGpo =
try { CveGpo = request.getParameter("CveGpo").toUpperCase();
} catch (Exception e) {
e.printStackTrace(); }
//clave del profesor
String Cveprofesor = "";
try { Cveprofesor = request.getPa.rameter("CveProf"); } catch (Exception
e)
{
e.printStackTrace(); }
response.setContentType("text/htmI");
Printwriter out = new Printwriter (response.getOutputStream());
out.println("<html>");
out.println("<head><title>EnviaBibliografia~/title~~/head~");
out.println("<body>");
out.println("<p align=left><font size=3>"+CveUEA+"~/font></p>");
out.println("<p align=left><font size=3>"+CveGpo+"~/font>~/p>");
out.println("<p
align=center><font
size=5><strong>"+NombreUEA+"</strong>~/font~~/p~");
align=center>cfont
out.println("<p
size=3><strong>vienvenido
profesor</strong></font></p>");
out.println("<p>Envie El Archivo que contenga su bibliografia, temario y evaluacion del
curso(se recomienda enviar pdf, doc, o t:d), elija el archivo");
out.println("deseado con el botón ");
out.println("examinar(browse)
y oprima enviar.</p>");
out.println("<p>si no puede ver el botón examinar(brouse) su navegador no puede");
out.println("enviar archivos.dp>");
out.println("<form
ENCTYPE=Y'multipatVform-data\"
action=\"http://infocbi.uam.mx:85/servlet~proyectoCSH.bibliografia.CapturarBibliografia\"");
out.println("method=\"post\">");
'I1';
"'I;
"I';
64
out.println("<input type=\"hidden\" name=\"CveGpo\" value=\""+CveGpo+"\">");
out.println("<input type=\"hidden\" name=\"CveUEA\" value=\""+CveUEA+''~'>'');
out.println("<BR><BR><lNPUT
NAME=Y'archivo\" TYPE=\"file\">");
out.println("<input type=\"submit\" value=\"Enviar datos\">");
out.println("</form>");
out.println("</body></htmI>");
out.close();
1
//Get Servlet information
public String getServletlnfo() {
return "proyectoCSH.upload.EnviaArchivoInformation";
1
1
// .....................
fin de archivo EnviaBibliografia.java
// ....................... Archivo CapturarBibliografia.java
/* este servlet es el que guarda el archivo en el servidor*/
package proyectoCSH.bib1iografia;
import proyectoCSH.upload.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.oreilly.servlet.multipart.*;
import java.sql.*;
public class CapturarBibliografia extends HttpServlet {
String DBurllnterBase = "jdbc:odbc:Aula--Virtual";
// Nombre de la base de datos en ODBC
"
//"jdbc:odbc:Aula-Virtual"
String UserName="SYSDBA'; //Usuario
String Password="masterkey";// Password
de ODBC
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers
Connection conlnterBase;
// Este metodo es el que se encarga de establecer
// la conexion con la base de datos
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
try {
Class.forName(Driver);
System.out.println("paso el driver");
conlnterBase=DriverManager.getConnection(DBurllnterBase,UserName,Password);
System.out.println("iniciando
conexion a la base de datos interbase");
1
catch( Exception e ) {
System.err.println(e.getMessage());
System.err.println("error en el init()");
}// fin del metodo init()
/*X**********X***************x*****************k************************
/
// Se cierra la conexion con la base de datos
public void destroy() {
super.destroy();
System.out.println("cerrando
conecciones
try {
conlnterBase.close();
} catch( SQLException ex ) {
System.err.println("no se puede cerrar la conexion, error en destroy");
System.err.println("ex.getMessagge()");
...'I);
1
}// fin del metodo destroy
public void doPost(HttpServ1etRequestrequest,
HttpServletResponse response)
throws IOException, ServletException {
Multipartparser mp = new MultipartParser(request, 7 * 1024 * 1024);
byte[] fileData = null;
response.setContentType("textlhtm1");
Printwriter out = response.getWriter();
out.println("<html>");
out.println("<HEAD><TlTLE>Capturando
archivo</TITLE></HEAD>");
out.println("<body
background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~");
out.println("<p>lNIClANDO UPLOAD
'I);
try{
CapturadorArchivo ca = new CapturadorArchivo(out);
String datos[] = ca.obtenValores(2,mp);
out.println("<p>Datos recibidos:");
out.println("<p>
Grupo
= "+datos[O]);
= "+datos[l]);
out.println("<p>
UEA
fileData=ca.obtenArchivo(mp);
out.println("<p> Archivo = "+ca.FileName);
if (ca.hayDatosNulos(datos,fileData)==true){
out.println("<br><br><h3>porfavor regrese a la pagina anterior");
out.println("<br><br> y llene todoslos campos'del formulario");
out.println("<br><br> para que se puedan guardar las notas</h3>");
}else{
//String
pathDirectorio="E:\\EducacionDistancia\\public~html\\bibliografia\~'+datos[l]+"\\"+datos[O];
String
pathDirectorio="C:\\j.swdk1.0.1\\examples\\EducacionDistancia\\public~html\\bibliografia\~'+datos[l]+"\\"+datos[O];
ca.creaDirectorio(pathDirectorio);
try{
CapturadorBaseDatos cbd = new CapturadorBaseDatos(out);
cbd.insertaDatosBibliografia(conlnterBase,datos,ca.FileName,replace('
ca.guardaArchivo(fileData,pathDirectorio,ca.FileName.replace('
','-'));
out.println("<p><font color=\"#OOOOFFY' size=\"2\">~ern>~strong~su
archivo fue enviado
exitosarnente</strong></em></font>4p>");
out.println("<p><font color=\"#OOOOFF\" size=\"2\"><em><strong>Desde este momento
esta disponible en la WEB<strong></em></font></p>");
}catch(SQLException ex) {
System.out.println("<br>\n--- SQLException caught ---\n");
while (ex != null) {
out.println("<br>" + ex.getErrorCode 0 ) ;
out.println("<br>Posiblemente
ya existe un archivo con el mismo nombre,");
out.println("<br>Cambie el nombre del archivo e intente nuevamente");
','-I));
67
out.println("<br>Si el problema perskte, consulte con el Administrador de servicios");
System.out.println("<br>Message:
" + ex.getMessage 0 ) ;
System.out.println("<br>SQLState:
" + ex.getSQLState 0 ) ;
System.out.println("<br>ErrorCode:
" + ex.getErrorCode 0 ) ;
ex = ex.getNextException();
out.println("<br>");
1
//ca.guardaArchivo(fileData,pathDirectorio,ca.FileName);
1
1
}catch (Exception ex) {
out.println("<p>" + ex.toString());
1
out.println("</BODY>");
out.println("</HTML>");
}// del doPost
}// de la clase Capturar archivo
// .......................
fin de Archivo CapturarBibliografia.java
68
// ..................archivo RevisaBibliografia.java
package proyectoCSH.bibliografia;
import proyectoCSH.upload.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class RevisaBibliografia extends HttpServlet {
//Initialize global variables
String DBurllnterBase = "jdbc:odbc:Aula-Virtual";
String UserName="SYSDBA"; //Usuario
String Password="cbi208399";// Password
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";Drivers de ODBC
Connection conlnterBase;
public void init(Serv1etConfig config) throws ServletException {
super.init(config);
try {
Class.forName(Driver);
System.out.println("paso el driver");
conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password);
System.out.println("iniciando
conexion a la base de datos interbase");
1
catch( Exception e ) {
System.err.println(e.getMessage());
System.err.println("error en el init()");
}// fin del metodo init()
......................................................................
/
// Se cierra la conexion con la base de datos
public void destroy() {
super.destroy();
System.out.println("cerrando conecciones
try {
conlnterBase.close();
} catch( SQLException ex ) {
System.err.println("no se puede cerrar la conexion, error en destroy");
System.err.printIn("ex.getMessagge()");
...'I);
1
}// fin del metodo destroy
//Service the request
public void service(HttpServ1etRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
Printwriter out = new Printwriter (response.getOutputStream());
out.println("<htmI>");
out.println("<head><title>zona
de descarga</title></head>");
out.println("<body
background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~");
//nombre de la uea
String NombreUEA = "";
try { NombreUEA = request.getParameter("NombreUEA'));
} catch(Exception
e) {
e.printStackTrace(); }
//clave de la uea
String CveUEA = "";
try { CveUEA = request.getParameter("CveUEA"); } catch
(Exception
e) {
e.printStackTrace(); }
//clave del grupo
String CveGpo = "";
try { CveGpo = request.getParameter("CveGpo"); } catch (Exception e) {
e.printStackTrace(); }
//clave del profesor
String Cveprofesor =
try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) {
e.printStackTrace(); }
out.println("<p align=left><font size=S>UEA : "+CveUEA+"</font></p>");
out.println("<p align=left><font size=S>GRUPO : "+CveGpo+"</font></p>");
out.println("<p
align=center><font
size=3~~strong~"+NombreUEA+"<lstron~~~~/font~~/p~");
out.println("<p align=center><font size=2><strong> Bibliografia, temario y evaluacion
del curso</strong></font></p>");
out.println("<p><font size=2>desde aqui puedes ver o descargar la bibliogfiadel
curso</font></p>");
I"';
try{
CapturadorBaseDatos cbd = new CapturadorBaseDatos(out);
cbd.MuestraBibliografia(conlnterBase,(=veGpo,CveUEA);
}catch(SQLException ex) {
out.println("<br>\n--- SQLException caught ---\n");
while (ex != null) {
out.println("<br>POR
MOMENTO
EL
NO PUEDEN
SE MOSTRAR
ARCHIVOS");
System.out.println("<br>Message:
" + ex.getMessage 0 ) ;
System.out.println("<br>SQLState:
" + ex.getSQLState 0 ) ;
System.out.println("<br>ErrorCode:
+ ex.getErrorCode 0 ) ;
out.println("cbr>ErrorCode: " + ex.getErrorCode 0 ) ;
ex = ex.getNextException();
System.out.println("<br>error");
LOS
I'
1
1
out.println("</body></htmb");
out.close();
1
//Get Servlet information
70
public String getServletlnfo() {
return "proyectoCSH.upload.RevisaNotas
Information";
1
//..................fin
del archivo RevisaBibliografia.java
// ................ .Fin del package bibliografia
Administración del sistema.
OBJETIVO
Que existan personas encargadas de darle mantenimiento a los maestros, alumnos,
cursos y UEAS en el AULA VIRTUAL.
MODELO DE REQUERIMIENTOS
Modelo de casos(Use Case)
Use Case EntradaAdministrador
Adrninlstrador
,.
.'
EscenarioCorrectoSimpleparaentrara
ElitradaAdministrador
pantalla de administrador
1.-El Administrador da click en administrador
2.-El administrador introduce su clave y su password
3.-El administrador oprime enviar
4.-El sistema valida la clave y el password
5.-EIsistema despliega la pantalla del administrador
6.-fin
72
Modelo de lnterfaz
Diagrama de Estado(Use Case EntradaAdministrador)
€3 orar
Entar
O.K.
Universidad
Virtual
O
Password
Admon
Regresar
Salir
Envlar
a
Pantalla
Adrnon
Modelo del Dominio del problema
Diagrama de clases estaticas
Administrador
Ybcveadrn on
@passwordadmon
@nombre
MODELO DE ANALISIS DlNAMlCO
Diagrama de Colaboracion(Use Case GuardaSesion)
1 cveAdmln+
passwod+OK
2 ValidaAdmon(cveAdmonPassword)
boolean
OlPantallaAdm~n
.,'.
ao
Uns u a r l o
C l P aCnD
t aVl learAi fdl cr n
-~
3 VerlflcaAdmon(cveAdmon
Password)Int
ONVenflca A d m o n
CNVerlflcaADmon
....
ODVenflcaUsuarlo
4 ExesqI(Query1)
Admlnlstrador
73
.".
.""
_I
...
"
I
"
MODELO DE DISEÑO (Diagramas de S'ecuencia)
1.- (Use Case GuardaSesion)
ODVerlficaUsu
ONVerlfica
OlPantallaAdm
on
-
Administrador
cveAdrnln+
password+OK
arlo
34
ValldaAdmon(cweAdmon,Password).
boolean
~>
VerlficaAdmon(cveAdmon.Password).int
>
Exesql(Query1)
~~
>
CONSULTA MAESTRO
OBJETIVO
Que el administrador pueda saber encualquier momento que maestros hay en la base de
datos y además que cursos están imparhendo.
74
MODELO DE REQUERIMIENTOS
Use Case ConsultaMaestro
ConsultaMaestros
Administrador
PASOS
1.-El Administrador da click en Maestros
2.-El sistema muestra la pantalla de maestros
3.-EI Administrador da click en Profesores Actuales
4.-EI sistema consulta los maestros actuales
5.-EI sistema despliega los maestros actuales
6.-El Administrador oprime regresar
7.-Fin
Modelo de lnterfaz
Diagrama de Estado (Use Case ConsuItaMaesto)
0.K
Inicio
Pantalla
MuestraProfesores
Pantalla
ConsultaProfesores
Regresar
Salir
a'
MODELO DEL DOMINIO DEL PROBLEMA
Diagrama de clases estáticas
Profesor
'TQcveprofesor
@passwordprofesor
@nombreprofesor
MODELO DEANALISIS DlNAMlCO
Diagrama de Colaboracion(Use Case ConsultaMaestros)
1: Maestn,
:>
Pdministrador :
Pdrninistradw
2: Westros Pctuales
OlPantallaMaestro
ClPantallaMaestro
:>
ONCOnsultaMaestrosO
4: Consultab'()
,
;
COConsuttaM
CDConsultaM
CNConsultaMO
~
:>
3: ConsultaFhestros()
76
MODELO DE DISEÑO (Diagramas de Secuencia)
Administrador:
Administrador
OIPantallaMae
~
ONCOnsultaMa
ODConsultaM
CDConsultaM
estros(l
m
~
Maestro
>-
Maestros Actuales
>I
ConsultaMaestros()
../* ,
ConsuitaMO
>
Execsql(Query2)
>
;.
A L T AM A E S T R O S
OBJETIVO
Que El administrador pueda dar de ahla a profesores.
MODELO DE REQUERIMIENTOS
Modelo de casos(Use Case)
1.- Use Case AltaMaestros
AltaMaestros
Administrador
Escenario Correcto simple para dar de
alta a un maestro
1.-El
actor hace clic enalta de maestros
2.-El actor introduce datos
3.-El actor oprime enviar
4.-El sistema valida los datos
5.-EI sistema inserta datos
6.-EI sistema muestra una pantalla de éxito
7.-El actor oprime salir
Modelo de lnterfaz
Diagrama de Estado (Use CaseAltaMaesto)
Entrar
>
~~
~~
PantallaConsultaProfesor
A
Desplegar
i
Regresar
I
\/
1 PantallaAltaProfes
MODELO DE ANALISIS DlNAMlCO
Diagrama de Colaboracion(Use Case AltaMaestros)
78
>: ,
7 ShowHTMLExitolnsert()
2 AltaProfesores
1 AltaMaestros
ONAltaMaestros2
' CNAltaMaestrosZ
OlPantallaMaeswtro
ClPantallaMaestro
' ;.
Admlnlsbador
Adrnlnlstrador
v
3 Vallda(cveProfesor,passwordP)
4 Verlhca(cwProfesor.passwordP)
1
'J
v
5 Insertalnfo(cveProfesor,passwordPnombre)
ONValldaProfesor
CNValidaProfesor
6 Inserta(cveProfesor.password.nornbre)
\\J
ODlnserta '
COlnseerta
7: ShowHTMLExltolnsert()
1 AltaMaestros
:>
Adrnmistrador
2- Altaprofesor
OlPantallaMaestro
CIPantallaMaestro
*,;'
ONAltaMaestros2
CNAltaMaestros2
3: Vallda(cveProfe,passwordP)
' Y
4 Venfica(cveProfe,paswordP)
0
V
5 . lnsertalnforrnaclon(cveProfesor.password,nornbre)
ODlnserta
ONValidaProfesor
CDlnsertaCNValidaProfesor
6 Inserta(cLeProfe.password,nornbre)
MODELO DE DISEÑO (Diagramas de Secuencia)
Administrador :
Administrador
OlPantalla
Maestro
ONValida
~0NP.lta
ODlnserta
aestros2
~MProfesor
CDlnserta
1 A l taM aestTOS
'
2: Altaprofesor
:>
3: Valida(cveProfe,passwordP)
4: Verifica(cveProfe,paswordP)
;
;
,
5: Insertalnformacion(cveProfesor,password,nombre)
2
6. Inserta(cwProfe,password,nombre)
>:.
7: ShowHTMLExitolnsert()
.....................
BAJA
.......................................................
MAESTROS
OBJETIVO
Que El administrador pueda dar de ba.ja a profesores.
MODELO DE REQUERIMIENTOS
Modelo de casos(Use Case)
1.- Use Case BajaMaestros
Administrador
BajaMaestros
80
Escenario Correcto simple para dar de baja a un maestro
1.-El actor hace clic en bajade maestros
2.- El actor proporciona los datos del profesor
3.-El actor oprime enviar
4.-El
sistema valida los datos
5.-EIsistema elimina el registro correspondiente
6.-El sistema muestra pantallade éxito
7.-EI actor oprime salir
Modelo de lnterfaz
Diagrama de Estado (Use Case BajaMaesto)
Entrar
PantallaConsultaProfe
v
PantallaBajaProfes
7: ShowHTMLExito()
-.,/.
B a j a P r o f1:
e s2B: a j a P r o f e s
-."
>-
OlPantalla Profesor
ClPantallaProfesor
ONBaiaMaestros2
CNBaiaMaestrosZ
~
: Administrador
3: Valida(cveProfe)
'J
4 : Verifica(cveProfe)
v
5: Borra(cveProfe,nombre)
v
ODBaia
CDBara
ONValidaProfe
CNValidaProfe
I-,
6: B a j a s ( c v e P r o f , n o m b r e P )
~~
~~
ODBaia
ONValidaProfe
ONBaia
OIPantalla
CNValidaProk
CDBaia
Maestros2
Profesor
: Administra+nr
1: BajaProfes
>
2:BajaF’rofes
>
3: Valida(cveProfe)
?~
4: Verifica(cw,Profe)
>
5: Borra(cveProfe,nombre)
>
6: Bajas(cveProf,nombreP)
>
7: ShowHTMLExito()
82
PROYECTOR DE IMAGENES
OBJETIVO: El alumno podrá observarlas imágenes que el profesor le envié dentro de su
aula virtual.
PROFESOR
MODELO DE REQUERIMIENTOS
Modelo de casos (Use Case)
U C Envlar Imagen
maestro
I L E I maestro da click en subir graficos
2 -El sistema mestra la pantalla de bienvenida
3
-
El maestro selecciona la ruta de su archivo.
4 . - E l maestro da click en upload
5 - El s l s t e m a envia la imagen
&-El slstema genera
un archlvo con la clave ddel maestro
7 -El s i s t e m a e n u a una págma de avlso
,
grupo y trlmestre.
Modelo de interfaz
Diagrama de Estado
0
inicio
Subir Graficos
Enviolmagen
Subirlmagen
O fin
back
b
a
U
C
P
I
k
O
a
d
PantConfirmacion
MODELO DE ANALISIS DINAMICO
Diagrama de colaboración
CPSubirlmagen
OPSublrlmagen
2 ShowEnvlalmagenO
j
<\
6 envla(8rchlK nombre)
7 setArchlvo(archlvo,nambre)
:>,
CPEnmlmaqen
OPEnuolmaqen
CDGuardalmaqen
ODG uardalmaqe n
5 GenberaNombrearchlvoO'jtrlng
>:
8 ShawAvtsoO
CNGeneraNombre
,
ONGeneraNombre
j!
CPConfirmacmn
OPConfirmaclon
84
Diagrama de secuencia
maestra
CPSublrlmasen
CPEnuolmaqen
CPConf~rmaclo
CNGeneraNom
'CDGuardalmaq
OPEnvlolmase
OPSublrlmaqen
sublr Imagen
n_
en
ONEnva
::.
I
,
ShowEnualmagenO
':.
Selcclona ruta
OK
I
GenberaNombrearchlw()Strlng
.F
enlna(archlvo.nombre)
'..
__,a
SetArchlvo(archlw.nombre)
__r
ALUMNO
MODELO DE REQUERIMIENTOS
Modelo de casos ( Use Case )
UC Proyectorde imagenes
alumno
1 , - E l alumno da click en proyector de imagenes.
2.- E l sistema se conecta alservidor.
3.- El sistema obtiene las imagenes del arciivo correspondiente.
4.- E l sistema guarda las imagenes en
un wxtor.
5.- E l sistema despliega l a primera imagen en el Frame.
6.- El alumno da click en el boton siguiente
7
- E l sistema muestra la siguiente imagen en el frame.
8.- Se repiten los pasos 6 y 7
9.- E l alumno da click en salir.
10.-El sistema regresa el control al applet del alumno.
Modelo de interfaz
Diagrama de Estado
a
Inicio
proyector de¡m agenes
panAulaVirtual
panProyector
S ;I lir
86
MODELO DE ANALISIS DlNAMlCO
Diagrama de colaboración
Diagrama de secuencia
: alumno
CPAuIaVirtuaI
CPpanlmaqen
CNRecibe
-3ntlmaqen
OPAulaVirtual :
CDobtenerlmaq
I
ONRecibe :
en
proyector de imagenes
~
>;
recibe(arch ivo ,nom bre)
>-
getArchivo(archivo.nom bre)
>
showhagen( )
:>
salir
>
88
Código
//programas para subir las imágenes al servidor
package multipart;
importjava.io.*;
import java.util.ResourceBundle;
import javax.servlet.*;
import javax.servlet.http.*;
// Referenced classes of package multipart:
//
Textos2
public class PaginaProyector2 extends HttpServlet
I
t
String servlet;
String RutaServlets;
String imagenFondo;
private String CVE-UEA;
private String CVE-GRUPO;
private String CVE-PROFE;
public PaginaProyector2()
I
I
servlet = "multipart.UploadContent2";
RutaServlets = Textos2.ruta.getString("RutaServlets");
irnagenFondo = "fondo I .jpg";
CVE UEA = null;
C V E ~ G R U P O= null;
CVE-PROFE = n u l l ;
I
I
public void init(Serv1etConfig servletconfig)
throws ServletException
I
super.init(servletconfig);
I
I
public void doGet(HttpServ1etRequest httpservletrequest, HttpServletResponse
httpservletresponse)
throws ServletException, IOException
I
\
System.out.println("Estoy entrando en doget ");
doPost(httpservletrequest, httpservletresponse);
I
public void doPost(HttpServ1etRequest llttpservletrequest, HttpServletResponse
httpservletresponse)
throws ServletException, IOException
f
t
System.out.println("Estoy entrando en doPost ");
CVE UEA = httpservletrequest.getPa.rameter("CveUEA");
CVE-GRUPO = httpservletrequest.gt:tParameter("CveCrl~po");
C V E ~ P R O F E= 11ttpservletrequest,get:Parameter("CveProf');
System.out.println("Estoy entrando y tengo los sigueintes datos
-+ CVE-GRUPO + + CVE-PROFE);
Printwriter printwriter = null;
try
'I
+ CVE-UEA +
'I 'I
'I
i
printwriter = httpservletresponse.getWriter();
1
f
catch(1OException ioexception)
I
t
System.out.println("Se ha producido una excepcion");
I
I
httpservletresponse.setContentType("text/html");
printwriter.println("<html>");
printwriter.println("<html><head><title>Subir Archivo</title>");
printwriter.println("<META content=text/html; charset=windows-l252httpequiv=Content-Type>");
printwriter.println("<META content= MSHTML 5.00.2920.0
name=GENERATOR></HEAD>");
printwriter.println("<BODY bgColor=#ffffff>");
print\?iriter.println("<CENTER>");
printwriter.println("<form method=post action=\"" + RutaServlets + servlet +
"?CveUEA=" + CVE-UEA + "&CveGrupo=" + CVE GRUPO + "&CveProf=" +
CVE-PROFE + "\" encType=multipart/form-data method=post>");
System.out.println("ruta del servlet:" + RutaServlets + servlet);
printwriter.println("<font face=\"Aria.l, Helvetica, sans-serifl"
color=\"#000099\"><b>UNIVERSJDAD '\IIRTUAL</b></font><br><font face=\"Arial,
Helvetica, sans-serif\" color=\"#000099\"~~");
printwriter.println("<font face=\"Aria.l, Helvetica, sans-serif\" color=\"#000099\">"):
printwriter.println("<b>BIENVENIDOPROFESOR ");
~.'rintwriter.printIn("</b></font><br><br>");
print\?iriter.println("<fo~ltface=\"Arial, Helvetica, sans-serif\" color=\"#000099\"
size=\" 1
printwriter.println("<b>EN ESTA PAGINA PODRA SELECCIONAR LA IMAGEN
LOCAL QUE DESEE ENVIAR <br>");
printwriter.println("PARA EL AULA VIRTUAL DE LA UEA + CVE-UEA);
printwriter.println("EN EL GRUPO + CVE-GRUPO);
printwriter.println("</b></font><br><br>");
printwriter.println("<font face=\"Arial, Helvetica, sans-serif\'t color=\"#000099\">");
\">I1);
I'
I'
printwriter.println("<b>Seleccione el archivo que desee
ellviar</b></font><br><br>");
printwriter.println("<font face=\"Arial, Helvetica, sans-serif\" color=\"#000000\"
size=\"2\">");
printwriter.println("<b>Presione el botón 'send file' para enviar sus
imágenes.</b></font><br><br>");
printwriter.println("<font face=\"Arial, Helvetica, sans-serifl" color=\"#0099FF\"
size=\"2\">");
printwriter.println("<BR><BR><INPUTname=userfile 1 type=file> ");
printwriter.println("<lNPUT type=\"submit\" value=\"send file\">");
printwriter.println("</form></center~~/body~</ht~ml~");
printwriter.flush();
printwriter.close();
t
I
I
package multipart;
importjava.io.*;
importjava.uti1.ResourceBundIe;
importjavax.servlet.*;
import javax.servlet.http.*;
// Referenced classes of package multipart:
//
MultipartParser,
Filepart,
Textos
public class UploadContent2 extends IHttpServlet
I
I
private String CVE-UEA;
private String CVE-GRUPO;
private String CVE-PROFE;
String nombreArchivo;
File dirlmagenes;
String rutaImagenes;
String Folder;
public UploadContent2()
f
CVE-UEA = null;
CVE GRUPO = n u l l ;
CVE-PROFE
= IIUII;
nombreArchivo = null;
rutalnlagenes = Textos.ruta.getString("Ruta1magenes");
Folder = Troy-" + CVE-lJEA + "-"+ CVE-GRUPO + "-"+ CVE-PROFE +
"/".trim();
I
I
public void doPost(HttpServ1etRequest httpservletrequest, HttpServletResponse
httpservletresponse)
throws IOException, ServletException
I
\
CVE UEA = httpservletrequest.getParameter("CveUEA");
CVE-GRUPO = httpservletrequest.getParameter("CveGrupo");
CVE-PROFE
= httpserv~etrequest.gel.Parameter(~~cve~ro~~);
System.out.println("los datos son: +- CVE-UEA + "-"+ CVE-GRUPO + "-"+
CVE-PROFE);
MultipartParser multipartparser = new MultipartParser(httpservletrequest, 0x1 00000);
Part part = multipartparser.readNextPart();
nombreArchivo = multipartparser.getYombreArchivo();
System.out.println("nombre archvio + nombreArchivo);
+
String S = new String(CVE-UEA + " ~ _ " + CVE-GRUPO +
CVE-PROFE.trim());
File file = new File(ruta1magenes + S);
System.out.println("el folder es"+ CVE-UEA + - + CVE-GRUPO + - +
CVE-PROFE.trim());
Systetn.out.println("rutade guardado seria =" + rutalmagenes + S + "/" +
notnbreArchivo);
boolean flag = false;
Object obj = null;
Object obj 1 = null;
if(part instanceof FilePart)
I'
''-I1
'I
'I
'I
f
I
ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStreamO:
((FilePart)part).writeTo(bytearrayoutputstream);
byte abyteO[] = bytearrayoutputstream.toByteArray();
System.out.println("Y en fileDataz="+ abyte0);
System.out.println("Estoy antes de preguntar:");
if(!file.exists())
I
I
System.out.println("Y el archivo no existe");
file.mkdir();
System.out.println("Entonces lo hemos creamos en:" + rutaImagenes + S);
FileOutputStream fileoutputstream = new FileOutputStream(ruta1magenes
"/" + nombreArchivo);
System.out.println("ruta de guardado + rutalmagenes + s + "/" +
nombreArchivo);
fileoutputstream.write(abyte0);
+S+
='I
fileoLltputstreatn.close();
else
I
FileOutputStream fileoutputstream 1
"/"
+ nombreArchivo);
= new
FileOutputStream(rutal1nagenes + s +
Systern.out.printl~l("r~~ta
de guardado
nombreArchivo);
fileoutputstream 1.write(abyteO);
fileoutputstream 1 .close();
=I1
+ rutalmagenes + S + "I" +
1
I
1
I
part = muItipartparser.readNextPart();
llttpservletresponse.setCo~ltentType("text/html");
ServIetOutputStream servletoutputstream= httpservletresponse.getOutputStream();
servletoutputstream.println("El archivo fue enviado"):
servletoutputstream.close();
I
I
I
//para bajar las imágenes
package multipart;
importjava.io.*;
import java.util.ResourceBundle;
importjavax.servlet.*;
import ~javax.servlet.http.*;
11 Referenced classes of package rnultipart:
I/
Textos2
public class MuestraArchivo2 extends HttpServlet
I
I
private String CVE UEA;
private String CVE-GRUPO;
private String CVE:,IPROFE;
private String NOMBRE-ARCH;
private String folder;
String nombreArchivo;
File dirfmagenes:
String rutaImagenes;
String rutaservlets;
String rutaFondo;
String imagenFondo;
public MuestraArchivo2()
I
\
CVE-UEA = null;
CVE GRUPO = n u l l ;
C V E ~ P R O F E= null;
NOMBRE-ARCH = null;
nombreArchivo = null;
rutahagenes = Textos2.ruta.getString("RutaImagenes");
rutaservlets = Textos2.ruta.getString("RutaServlets");
rutaFondo = Textos2.ruta.getString("RutaFondo");
imagenFondo = "fondo 1..jpg";
>
f
public void init(Serv1etConfig servletconfig)
throws ServletException
f
k
super.init(servletconfig);
System.out.println("1niciando Servlet
1
...I1);
public void service(HttpServ1etRequest httpservletrequest, HttpServletResponse
httpservletresponse)
throws IOException, ServletException
r
t
CVE UEA = httpservletrequest.getParameter("CveUEAf');
CVE1GRl.JPO = httpservletrequest.getParameter("CveGrupo");
CVE PROFE = httpservletrequest.getParameter("CveProf');
NOMBRE ARCH = httpservletrequest.getParameter("archivo");
folder = new String(CVE-UEA + - + CVE GRUPO + "_" + CVE-PROFE.trirn());
System.out.println("Estarnos recibiendo los datos en MuestraArchivo: + CVE-UEA
+ CVE-GRUPO + + CVE-PROFE + + NOMBRE-ARCH);
paginaArchivos(httpserv1etresponse);
I'
I'
+
If
1
'I
'I
"
void paginaArchivos(HttpServ1etResponse httpservletresponse)
f
\
System.o~~t.println("entra~nos
en la pagina que debe mostrar la imagen");
Printwriter printwriter= null;
try
I
I
printwriter = httpservletresponse.gztWriter();
I
I
catch(1OException ioexception)
f
\
System.out.println("Se ha producido una excepcion");
1
I
l~ttpservletresponse.setContentType("text/ht~nl");
printwriter.println("<llttnl>");
printwriter.println("<head>");
printwriter.println("<title>Archivos <:/title>");
printwriter.println("</head>");
printwriter.prilltl17("<body background=\"" + rutaFondo + imagenFondo + "\"");
94
printwriter.println("<CENTER>");
printwriter.println("<HR NOSHADE>"):
~~rintwriter.println("<font
size=\"4\"><strong>:>Imagen: + NOMBRE__ ARCH
"</strong></font></a>");
printwriter.println("<HR NOSHADE>");
printwriter.println("<p></p>");
printwriter.println("<br>");
printwriter.println("<img src=\"" + rutalmagenes +
+ folder + "/" +
NOMBRE-ARCH + "\">"):
System.out.println("E1 arcvhivo dado es:"+ rutalmagenes + folder +
+
NOMBREARCH);
printwriter.pri~ltl~l("</body>");
printwriter.println("</17tmI>");
printwriter.flush();
printwriter.close();
'I
"/I'
I
I
I
I
package multipart;
import java.io.*;
importjava.util.ResourceBundle:
importjavax.servlet.*;
import.javax.servlet.http.*:
// Referenced classes of package multipart:
I/
Textos2
public class DownLoad3 extends HttpServlet
I
private String CVE-UEA;
private String CVE-GRUPO;
private String CVE-PROFE;
String nombreArchivo;
private String irnagenFondo:
private String imagenLogo:
File dirlmagenes;
String rutaFondo;
String rutalogos;
String rutalmagenes;
String rutaservlets:
public DownLoad30
I
I
CVE UEA = null;
WE-GRUPO = n L l l l :
C V E ~ P R O F E= null:
+
nornbreArchivo = null;
imagenFondo = "fondo1 .jpg";
imagenLogo = "casanim.gif';
rutaFondo = Textos2.ruta.getString("RutaFondo");
rutaLogos = Textos2.ruta.getString("F:utaLogos");
rutalmagenes = Textos2.ruta.getStrin~;("Rutalmagenes");
rutaServlets = Textos2.ruta.getString("RutaServlets");
3
public void init(Serv1etConfig servletconfig)
throws ServletException
I
t
super.init(servletconfig);
System.out.println("lniciando Servlet ..");
1
I
public void service(HttpServ1etRequest httpservletrequest. HttpServletResponse
httpservletresponse)
throws IOException, ServletException
I
t
CVE UEA = httpservletrequest.getParameter("CveUEA");
CVEIGRUPO = httpservletrequest.getParameter("CveGrupo");
CVE-PROFE = httpservletrequest.getParameter("CveProf');
System.out.println("Los datos son : + CVE-UEA + " + CVE-GRUPO + "
CVE-PROFE);
String S = new String(CVE-UEA + ._ + CVE-GRUPO + "-"+
CVE-PROFE.trim());
dirlmagenes = new File(ruta1magenes +
+ S);
Systetn.out.println("e1 folder es'' + C'JE -UEA + - + CVE-GRUPO + "-"+
CVE-PROFE.trirn());
Systetn.out.prilltlIl("ruta donde sera extraidos los archivos + rutalmagenes +
'I
'I
+
I'
I'
I'
=I'
'I
+
S);
if(!dirlmagenes.exists())
I
\
System.out.println(" el directorio no existe : ");
System.out.println("dirlmagenes=" + dirlmagenes);
1 else
I
I
System.out.println(" El archivo existe y estoy antes de pagina archivos ");
paginaArchivos(httpserv1etresponse);
System.out.println(" el directorio si existe : ");
1
I
I
I
void paginaArchivos(HttpServ1etResponse httpservletresponse)
I
t
Printwriter printwriter
=
null;
96
try
f
t
printwriter = httpservletresponse.getWriter();
I
I
catch(1OException ioexception)
r
I
System.out.println("Se ha producido una excepcion");
I
System.out.println("Estoy entrando en la pagina");
I~ttpservletrespo~~se.setConte~lt'fype(''text/htrnI");
printwriter.println("<I~t~nb");
printwriter.println("<head>");
printwriter.println("<title>Archivos </title>");
printwriter.println("</head>");
printwriter.printIn("<body background=\"" + rutaFondo + itnagenFondo + "\"");
printwriter.println("<CENTER>");
printwriter.println("<HR NOSHADE>");
printwriter.println("<h>PROYECTORDE IMAGENES </h> <br> ");
printwriter.println("<lMG SRC=\"" + rutaLogos + ilnagenLogo + "\" width=\" 127\"
height=\"7O\" ></CENTER>");
printwriter.println("<HR NOSHADE>");
printwriter.println("<p>Estas son las imágenes disponibles:</p>");
printwriter.println("<br>");
System.out.println("la cantidad de archivos es:" + dirImagenes.list().length);
ibr(int i = O; i < dirlmagenes.list().length;i++)
I
printwriter.pri~ltlI7("<br>");
printwriter.prilltln("<ll><a href=\""
+ rutaServlets +
"m~1ltipart.MuestraArchivo2?CveUEA="
+ CVE UEA + "&CveGrupo=" + CVE-GR1JPO
+ "&CveProf=" + CVE PROFE + "&archivo=" T dirlmagenes.list()[i] + "\">" +
dirlmagenes.list()[i] + 'l¿/a><l~>l');
System.out.println("archivo + i +
+ dirlmagenes.list()[i]);
'I
'I 'I
I
I
printwriter.println("</body>");
printwriter.println("</l~tml>");
printwriter.flush();
printwriter.close():
I
I
I
//las clases que se encargaron del envio de las imágenes fueron
package multipart;
import java.io.*;
import java.utiI.Enumeration;
importjava.utiI.Vector;
import javax.servlet.ServletlnputStrea1n;
import javax.serv1et.ServletRequest;
import javax.servlet.http.HttpServ1etRequest;
I/ Referenced classes of package multipart:
/I
BufferedServletInputStream, LimitedServletInputStream, Parampart, Filepart.
/I
Part
public class Multipartparser
I
private
private
private
private
private
ServletlnputStrealn in;
String boundary;
FilePart 1astFilePart;
byte bun];
String filename;
public MultipartParser(HttpServ1etRequest httpservletrequest, int i)
throws IOException
i
this(httpserv1etrequest. i, true, true);
1
I
public MultipartParser(HttpServ1etRequest httpservletrequest, int i, boolean flag,
boolean flagl)
throws IOException
I
\
buf= new byte[8 1921;
filename = null;
String S = null;
String S 1 = httpservletrequest.getHeader("Content-Type");
String s2 = httpservletrequest.getContentType();
System.out.println("valor de type + S ) ;
if(sl == null && s2 != null)
'I
I
I
s = s2;
System.out.println("type 1
else
if(s2 == null && S I != null)
'I
+ S);
'I
+ S);
f
1
S = SI;
System.out.println("type2
else
if(sl != null && s2 != null)
98
S = S I .length() <= s2.length() ? s2 : S I ;
System.out.println(" type + S);
if(s == null 11 !s.toLowerCase().staI-tsWith("~llultipart/for~ll-data"))
throw new IOException("Posted content type isn't multipart/form-data");
int j = httpservletrequest.getContentLength();
Syste~n.out.println("Longutuddel archivo +j);
if(¡ > i)
throw new IOException("Posted content length of f j + excede el limite de
'I
"
I'
i 1;
I'
String s3 = extractBoundary(s);
System.out.println("Longutud limite del archivo + s 3 ) ;
if(s3 == null)
throw new IOException("El limite no fue especificado");
Ob.ject obj = httpservletrequest.getlnputStream();
System.out.println("ServletlnputStream
+ s3);
if(flag)
ob.; = new BufferedServletlnputStream((((Servlet1nputStreatn) (obi)));
if(f1agl)
obj = new Li~nitedServletl~~putStreatn(((Servletl~~putStrea~n)
(ob;)), j);
i n = ((ServletInputStream) (ob.;)):
boundary = s 3 ;
String s4 = readline();
System.out.println("leer la primera linea + s3);
if(s4 == null)
throw new IOException("Corruptform data: premature ending");
if(!s4.startsWith(s3))
throw new IOException("Corrupt form data: no leading boundary: + s4 + !=
+
I'
"
I'
I'
s3);
else
return;
\
I
public PartreadNextPartO
throws IOException
I
System.out.println(" lastFilePart=
if(lastFi1ePart != null)
"
+ IastFilePart);
I
I
lastFilePart.getlnputStrea~n().close();
IastFilePart = null;
I
I
Vector vector = new Vector();
String S = readLine();
if(s == null)
return null;
if(s.lengtll() == O)
return null:
+
vector.addElernent(s);
for(; ( S = readline()) != null && s.len@h()> O; vector.addElement(s));
iqs == null)
return null;
String S 1 = null;
String s2 = null;
String s3 = "text/plain";
for(Enumeration enumeration= vector.elements(); enumeration.hasMoreElements();)
I
I
String s4 = (String)enumeration.nextElement();
if(s4.toLowerCase().startsWith("content-dispo~ition:~~))
I
String as[] = extractDispositionInfo(s4);
sl = as[l];
filename = as[2];
s2 = as[3];
j else
if(s4.toLowerCase().startsWith("content-type:"))
I
I
String s5 = extractContentType(s4);
if(s5 != null)
S 3 = s5;
1
I
I
I
System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
>;
System.out.println("valor de type -t filename);
System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::" >;
if(fi1ename == null)
return new ParamPart(s l . in, boundary);
if(filename.equals(""))
filename = null;
IastFilePart = new FilePart(s1, in, boundary, s3, filename, s2);
return IastFilePart;
I
I
public String getNombreArchivo0
I
I
return filename;
i
private String extractBoundary(StringS)
I
I
int i = s.lastlndexOf("boundary=");
if(¡ == -1)
return null;
String S 1 = s.substring(i + 9);
I O0
if(s I .charAt(O) == "")
I
I
intj = S I .lastlndexOf(34);
I = S I .substring( l . j);
S
t
f
S
1=
1f"11
+SI;
return S 1;
private String[] extractDispositionlnfo(String S )
throws IOException
I
t
String as[] = new String[4];
String S I = S;
S = S I .toLowerCase();
int i = s.indexOf("content-disposition: "):
int .j = s.indexOf(";");
if(¡ == -1 (1 j == -1)
throw new IOException("Cot1tent disposition corrupt:
String s2 = s.substring(i + 21, j);
if(!s2.equals("fortn-data"))
throw new IOException("1nvalid content disposition:
i = s.indexOf("name=\'"', j);
.j = s.indexOf("\"", i + 7);
'I
+ s2);
'I
¡(fi
== -1
I/ ; == -1)
throw new lOException("Cot1tent disposition corrupt:
String s3 = S I .substring(¡ + 6, j);
String s4= null;
String s5 = null;
i = s.indexOf("filenare=\"", j + 2);
j = s.indexOf("\"", i + IO);
if(¡ != -1 & & j ! = - I )
+ SI);
'I
+ S 1);
I
s4 = S 1.substring(¡
+ 1O, j);
S5 =
s4;
int k = Math.max(s4.lastlndexOf(47), s4.lastlndexOf(92));
if(k > -1)
s4 = s4.substring(k + I ) ;
as[O] = s2;
as[ I ] = s3;
as[2] = s4;
as[3] = s5;
return as;
I
private String extractContentType(String S )
throws IOException
I
\
String sl = null;
String s2 = S;
S = s2.toLowerCase();
if(s.startsWith("content-type"))
I
t
1
int i = s.indexOf(" 'I):
if(¡ == - 1)
throw new IOException("Content type corrupt: 'I + s2);
s 1 = s.substring(i + I ) ;
] else
if(s.length() != O)
throw new IOException("Ma1formed line after disposition:
return S I ;
I'
+ s2);
private String readLine()
throws 10Exception
6
\
StringBuffer stringbuffer = new StringBufferO;
int i;
do
I
I
i = in.readLine(buf, O, buf.length);
if(¡ != - I )
stringbuffer.append(new String(buf, O. i, "ISO-8859-1"));
while(¡ == buf.length);
if(stringbuffer.length() == O)
I
I
return null;
1 else
f
I
stringbuffer.setLength(stringbuffer.Iength() - 2);
return stringbuffer.toString();
1
J
1
I
package multipart;
import java.io.1OException;
import java.io.lnputStream;
import javax.servlet.Servlet1nputStream;
public class LimitedServletInputStreaml extends ServletInputStream
1o2
I
I
private ServletInputStream in;
private int totalExpected;
private int totalRead;
public Li~nitedServletInputStream(ServletlnputStrea~nservletinputstrealn, int i)
r
t
totalRead = O;
i n = servletinputstream;
totalExpected = i;
I
I
public int readLine(byte abyteO[], int i, intj)
throws IOException
I
I
I
int 1 = totalExpected - totalRead;
if(I <= O)
return - 1;
int k = in.readLine(abyte0. i, Math.min(1, j));
if(k > O)
totalRead += k;
return k;
I
public int read()
throws IOException
I
t
if(tota1Read >= totalExpected)
return - 1;
else
return in.read();
\
I
public int read(byte abyteO[], int i, intj)
throws IOException
int I
= totalExpected -
totalRead;
if(l <= O)
return - 1 :
int k = in.read(abyte0, i, Math.min(1, j));
if(k > O)
totalRead += k;
return k;
I
I o3
.-.
package multipart;
importjava.io.*:
importjavax.servlet.Servlet1nputStream;
// Referenced classes of package multipart:
//
Part,
PartlnputStream,
MacBinaryDecoderOutputStrearn
public class FilePart extends Part
I
private String fileNarne;
private String filePath;
private String contentType;
private PartlnputStream parthput;
FilePart(String S , ServletlnputStream servletinputstream, String S I , String s2, String s3,
String s4)
throws IOException
I
t
super(s);
fileName = s3;
filepath = s4;
contentType = s2;
partlnput = new PartlnputStream(servletinputstream, S 1);
l
J
public String getFileNarne0
r
I
return fileName;
1
f
public String getFilePath0
r
t
return tilepath;
1
I
public String getContentType()
I
t
return contentType;
I
I
public InputStream getlnputStream()
I
t
return partlnput;
I
I
I04
public long writeTo(File file)
throws IOException
I
I
long I = OL;
BufferedOutputStream bufferedoutputstream
try
= null;
I
I
if(fi1eName != null)
I
I
File file 1;
if(file.isDirectory())
filel = new File(fi1e. fileName);
else
filel = file;
bufferedoutputstream = new BufferedOutputStream(new
FileOutputStream(fi1e 1));
1 = write(buffered0utputstream);
1
I
I
finally
I
if(bufferedoutputstrea1n != null)
bufferedoutputstream.close();
I
I
I
return 1;
public long writeTo(0utputStream outputstream)
throws IOException
I
I
long 1 = OL;
if(fileNa1ne != null)
I = write(outputstream);
return I;
1
I
long write(OutputStrea1n outputstream)
throws IOException
f
I
if(contentType.equals("application/x-macbinary"))
outputstream = new MacBinaryDecoderOutputStream(outputstream);
long 1 = OL;
byte abyteO[] = new byte[8 1921;
int i;
while((i = partlnput.read(abyte0)) != - I )
I
outputstream.write(abyte0, O, i);
I
+= i;
I
I
return I ;
1
I
public boolean isFile()
I
t
return true;
I
package multipart;
import java.io.*;
public class MacBinaryDecoderOutputStream extends FilterOutputStream
I
I
private int bytesFiltered;
private int dataForkLength;
public MacBinaryDecoderOutputStream(0utputStream outputstream)
r
t
super(outputstrea1n);
bytesFiltered = O;
dataForkLength = O;
2
I
public void write(inti)
throws IOException
if(bytesFi1tered <= 86 && bytesFiltered >= 83)
I
I
int j = (86 - bytesFiltered) * 8;
dataForkLength = dataForkLength I (i & Oxff) << j ;
1 else
if(bytesFi1tered < I28 + dataForkLength && bytesFiltered >= 128)
out.write(i);
bytesFiltered++;
I
public void write(byte abyteO[])
throws lOException
f
t
write(abyte0, O. abyteO.length);
106
public void write(byte abyteO[], int i, intj)
throws IOException
f
t
if(bytesFi1tered >= 128 + dataForkLengt11)
bytesFiltered += j;
else
if(bytesFi1tered >= 128 && bytesFiltered + .i <= 128 + dataForkLength)
I
t
out.write(abyte0, i, j);
bytesFiltered += j;
j else
t
for(int k = O; k <.j; k++)
write(abyteO[i + kl);
package multipart;
import java.io.*;
import javax.servlet.Servlet1nputStream;
// Referenced classes of package multipart:
//
Part, PartlnputStream
public class ParamPart extends Part
I
t
private byte value[];
ParamPart(String S, ServletlnputStrea~nservletinputstrearn, String S I )
throws IOException
I
super(s);
PartlnputStream paltinputstream= new PartlnputStream(servletinputstream,S 1);
ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(512);
byte abyteO[] = new byte[ 1281;
int i ;
while((¡ = partinputstream.read(abyte0)) != - 1)
bytearrayoutputstream.write(abyte0, O, i);
partinputstream.close();
bytearrayoutputstream.close():
value = bytearrayoutputstrearn.toByteArray();
1
I
public byte[] getvalue()
I
t
1-
return value;
public String getstringvalue()
throws UnsupportedEncodingException
I
t
return getStringValue("IS0-8859-1");
I
I
public String getStringValue(String S)
throws UnsupportedEncodingException
I
t
return new String(value, S);
I
public boolean isparam()
I
t
return true;
I
I
I
I
package multipart;
importjava.io.1OException;
import java.io.InputStream;
import javax.servlet.ServletInputStrea1n;
public class BufferedServletlnputStreanl extends ServletInputStream
I
t
private ServletInputStream in;
private byte bufl];
private int count;
private int pos;
public BufferedServletinputStrea~n(ServletInputStrea~n
servletinputstream)
I
I
buf = new byte[0x 100001;
i n = servletinputstream;
I
I
108
private void fill()
throws IOException
I
int i = in.read(buf, O, buf.length);
if(¡ > O)
f
I
pos = o;
count = i;
I
J
public int readLine(byte abyteO[], int i, intj)
throws IOException
I
I
int k = O;
if(¡ == O)
return O;
int 1 = count - pos;
if(] <= O)
I
fill();
1 = count - pos;
if(1 <= O)
return - 1;
I
int j 1 = Math.min(j, 1);
int kl = findeol(buf, pos,j 1);
if'(kl != -1)
j l =kl;
System.arraycopy(buf, pos, abyte0, i, .j 1);
pos += j 1;
for(k +=.j I ; I< <I && k 1 == -1; k += j I )
f
I
fill();
int i 1 = count - pos;
if(il <= O)
return k;
.j I = Math.min(j - k, i 1);
k 1 = findeol(buf, pos, j I );
if(kl != -1)
jl =kl;
I
Systeln.arraycopy(buf. pos, abyte0, i
pos +=.j 1:
I
return k;
I
I
+ k. .j I );
private static int findeol(byteabyteO[]. int i, int j )
f
I
int k = i + j ;
for(int 1 = i; 1 < k;)
if(abyteO[l++] == 10)
return I - i;
return - 1;
1
I
public int read()
throws IOException
I
I
if(count <= pos)
f
t
fill();
if(count <= pos)
return - 1 ;
1
I
return buf[pos++] & Oxff;
I
public int read(byte abyteO[] int i, intj)
throws IOException
f
I
int k;
int i l ;
for(k = O; k < j; k += i l )
f
t
int 1 = count - pos;
i f(l <= O)
I
fill();
I = count - pos;
if(1 <= O)
if(k > O)
return k;
else
return - 1 ;
I
I
i 1 = Math.min('j - k, 1);
System.arraycopy(buf, pos, abytea,.i + k, i I ) ;
pos += i l ;
1
return k;
1 IO
I
I
I
I
package multipart;
public abstract classPart
I
1
private String name;
Part(String
S)
I
name = S;
I
I
public String getName()
f
t
return name;
I
I
public boolean isFile()
f
I
return false;
I
public boolean isparam()
I
I
return false;
I
J
I
I
package multipart;
importjava.io.*;
import javax.servlet.Servlet1nputStream;
public class PartInputStream extends FilterlnputStream
I
private String boundary;
private byte bufl];
private int count;
private int pos;
private boolean eof;
PartlnputStream(Serv1etlnputStream sewletinputstream, String S )
throws IOException
t
super(servletinputstream);
buf = new byte[Ox 100001;
boundary = S;
I
f
private void fill()
tl7rows IOException
I
I
if(eof)
return;
$(count > O)
if(count - pos == 2)
I
t
System.arraycopy(buf, pos, buf, O, count - pos);
count -= pos;
pos = o;
f else
I
t
throw new IllegalStateExceptior~("fill()detected illegal buffer state");
I
I
boolean flag = false;
int i;
for(; count < buf.length; count += i)
I
1
i = ((ServletInputStrea~n)in).readLine(buf, count, buf.length - count);
if(i == - 1 )
throw new lOException("unexpected end of part");
if(i < boundary.length())
continue;
eof = true;
for(int J = O; J < boundary.length(); j++)
I
t
if(boundary.charAt(i) == buflcount
continue;
eof = false;
break;
+ j])
I
I12
if(eo0
break;
t
public int read()
throws IOException
í
if(count - pos <= 2)
f
I
fill();
t
I
if(count - pos <= 2)
return - 1 ;
return bufIpos++] & Oxff:
I
public int read(byte abyte0[], int i, int j)
throws IOException
f
int k = O;
if(¡ == O)
return O;
int 1 = count - pos - 2;
if(l <= O)
I
fill();
I = count - pos - 2;
if(l <= O)
return - 1 ;
1
l
int .j 1 = Math.min(j, I);
System.arraycopy(buf, pos, abyte0, i, .j I );
pos += j I ;
for(k += .j 1; k < i; IC += j 1)
I
I
fill();
int i 1 = count - pos - 2;
if(i1 <= O)
return k;
.j 1 = Math.min(j - k, i 1);
System.arraycopy(buf, pos, abyte0, i
pos +=.jI;
I
I
return IC;
+ k, j
1 );
public int available()
throws IOException
int i = (count - pos - 2) + in.available();
return i >= O ? i : O;
1
I
public void close()
throws IOException
r
t
if(!e o 0
while(read(buf, O, buf.length) != -1) ;
1
I
1
I
//esta es la clase que contiene una variable estática
para internacionalización de las rutas
package multipart;
import java.utiI.Locale;
in~portjava.util.ResourceBundle;
public class Textos2
I
public static ResourceBundle ruta = ResourceBundle.getBundle("inter2". new
I,ocale("en", "US"));
public Textos20
I14
Implementación del correo
Modelo de requerimientos
Use Case del Envio de correo
Usuario
Use Case Envio de Correo
Un usuario (maestro o alumno) envía un correo.
PASOS
1.-Usuario selecciona el vínculo “Directorio”
2.-Sistema Muestra todos los posibles usuarios a los que se les puede enviar correo
3.-Usuario selecciona uno delos nombres.
4.-Sistema despliega pantalla paraeditar el correo
5.-Usuario edita correo (Asunto y texto)
6.-Usuario oprime en “Enviar”
-/.-Sistema Sistema envía correo
8.-Sistema despliega mensaje deexito
9.-Fin
Modelo de lnterfaz
Diagrama de Estado (Use Case Envío de correo)
Aceptar
:.
O
IlllC 10
Fin de Clase
Fantalla pnnclpal
[la cllckeli el riornbre
Carga nornbies
v Fotos
Da clicken la foto
Cancelar
Carga el cone0
Cancelar
4lecclona Dreciono
Y
la
pantalla d e cone0
Mita el correo
y da clicken enviar
Vlsrallza losdatos
Modelo del Dominio del problema
Diagrama de Clases (Use Case Envío de correo)
~
<<Interface> >
ClEnvioCorreo
( f r o mL o g l c a l
o,,*
1 . .I
cMaestro
View)
&CorreoExitoso()
GEntrarCorreo()
Osalircorreo()
o *
@Coreo
@Nombre
%Foto
@Clave
GMandarCorreo()
&G etCorrqo()
1..
1. . I
cCurso
eCveUEA
@CveGrupo
@Matricula
1..1
1. . *
1..*
cAlum no
@Correo
@Nombre
@Matricula
@Foto
+Mandarcorreo()
GG e t c o r r e o 0
Diagrama de Colaboracion
2 McerconsXa(regl3ms)
1 Clicken Drectono
ONCOnslita
=
O
Rlnclgal
OK-
m?
Base
Usuario
3 Qebuta SQL
S
wgresaregtstms
4 wgresareglstms
8
4
9 DE
m10s
6 Deqllega reg
0
Correo
7 clicksabre elnornbre
8 cilcken envlar
OIConeo_s
Fotos
I I6
Diagrama de Secuencia
Modelo del Dominio del problema
I I7
-~~.,
...... .... ........... "".
"
"
Ami tambien puedes cclnsultar
;+Ira
tu correo
UAM virtual, Colrreo E l e c t r h i c o
Correo encolado pma ser enviado
remitente
=UA.MFYXNLTM.COM
destinatarios =hij [email protected]. con
iasunto
=Escolar
texto
=Presentarse
al
exratea
Modelo de Diseño (Diagramas de Secuencia)
1.
(Use Case Envío decorreo)
Case Visualiza datos
Modelo de requerimientos
Usuario
Visualiza datos
Un usuario (maestro o alumno) visualiza los datos de otra persona.
PASOS
1.-Usuario selecciona elvínculo “Directorllo”
2.-Sistema Muestra todos los posibles usuarios a los que se les puedeenviar correo
3.-Usuario selecciona una de las fotos.
4.-Sistema despliega pantalla todos los d’atos del alumno seleccionado
5.-Usuario oprime “Aceptar”
6.-Fin
Modelo de lnterfaz
Diagrama de Estado (Use Case Envío de correo)
0
llllCl0
Wntalla principal
Da clicken elnombre
Cancelar
Carganombres
Da clicken la foto
y Fotos
Vlslaliza losdatos
Pceptar
Carga el como
Cancelar
Slecclona Drectono
ymuestra la
pantalla de CORO
Mita elcorreo
y da clicken enviar
<<Interface>>
ClVisualizaDatos
Modelo del Dominio del problema
(from L o g i c a l V l e w )
Diagrama
de
Clases
de correo)
(Use Case
Envío
1..1
cUsuario
O..*
, +visualiza()
%Nombre
@Foto
&GetCorre*o()
1. .
1..1
cConsulta
%Matricula
120
Diagrama de Colaboracion
I
2 Hiicercons~lta(regi~ros)
C l l c k e n Dreclono
C)lhntaj!a
Fhncipal
ONCo!lsiha
@se
ODConsulta
Base
Usuario
3 Qebuta s)L
5 wglesaregistms
4 wgresaregistros
m 9 ELADS
6 Despliegareg
Olmlta
ONbvia
como
Y k g r e s a a pantalla
OIFa_n!alla
cone0
M
7 clicksobre elnombre
8 cltcken enviar
olcomos
Fotos
Diagrama de Secuencia
Modelo del Dominio del problema
I22
Modelo de Diseño (Diagramas de Secuencia)
2.
(UseCaseVisualizadatos)
Oli'dntdlla
mnclpa!
Usugrio
cu,nwnrn
Códigos de las distintas clases
/*Archivo temporal, en el quese hace la consulta de los alumnos
del aula virtual, requiere los archivos ConsultaA2 y ConsultaA3
y de la pagina html BIEVENIDA.htm*/
package mailes;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class consulta1 bis extends
HttpServlet
{
p4vWf!lVv (IIWIR
lAyI
PC1RII~""t
public void Inlt(ServTetCot%g config) throws ServletException {
super.init(config); // NO OLVIDAR PONER EL NOMBRE DEL SERVLET
1
public void service (HttpServletRequest request,
HttpServletResponse response){
ServletOutputStream out;
String parametro,value,url,db-user,passwd,driver;
int matricula;
Connection db;
Statement st;
Resultset rs;
int ¡=O;
url="jdbc:odbc:Aula-Virtual";// Nombre de la base de datso en ODBC
db-user="SYSDBA";
//Usuario
passwd="masterkey";
I1 Password
driver="sun.jdbc.odbc.JdbcOdbc:Driver";
//Drivers de ODBC
try {
Class.forName(driver); ¡++;//Se inicializa el driver
i++;
db = DriverManager.getConnectiori(url,db_user,passwd);
// Se hace la conexion a la BD
st = db.createStatement(); i++;
// Inicializa una sesion a la conexion
out= response.getOutputStream();
response.setContentType("text/html");
out.println("<HTML><HEAD>~TlTl-E>");
out.println("CONSULTA DE ALUMNOS DE LA UNIVERSIDAD VIRTUAL");
out.println("</TITLE></HEAD><BC)DY>");
CveGrupo=request.getParameter("id");
out.println("<H2><1> A continuacion, se muestran los alumnos"
inscritos en el aula virtual </I></H2>");
+'I
I24
rs=st.executeQuery("Select * from
ALUMNO
where
matricula
in (select
i++;
matricula from INSCRIPCION WHERE CVEGRUPO=\""+CveGrupo+"\")");
// Se hace la consulta
if(rs.next()){ ¡=IO; // Avanza al siguiente registro
matricula=rs.getlnt(l);
out.println("<H3> "+
"<a href=http://lis.uam.mx:8080/servlet/mailes.Consulta2?id="
+matricula+"><lMG
SRC=\"http://lis.uam.mx/EducDistancia/PrincipalPag/fotos~'+matricula+".gi~'
alt=\"Obras\"HSPACE=2O></a>"
+
matricula
+"
href=http://lis.uam.mx:8080/servlet/mailes.Consulta2b¡s?~d="+
matricula
+ "> " + rs,getString(3)+ CveGrupo +"</a>");
while(rs.next()) {
matricula=rs.getlnt(l);
out.println("<H3>"+
"<a href=http://lis.uam.m~:808O/servlet/"
+"mailes.Consulta2?id="+matricula
+"><IMG
SRC=\"http://lis.uam.mx/EducDistancia/PrincipalPag/fotos/"+matricula+".GlF\"
alt=\"Obras\"HSPACE=2O></a>"
//
+"><IMG
SRC=\"http://lis.uam.mx:8080/servlet/Cardozo.jpg\"
alt=\"ObrasYqHSPACE=20></a>"
+
matricula+"
<a
href=http://lis.uam.mx:8080/servlet/mailes.Consulta2bis?id="+
matricula
" + rs,getString(3)+"</a>");
+'I>
1
//aqui se hara referencia a la pagina principal
out.println("<BR><BR><A
HREF=\"http://lis.uam.mx/EducDistancia/Princ¡palPag/ejemplos.htm~"');
out.println(">Salir</A> ");
1
else
out.println("<H2> No HAY REGISTROS<br>");
out.println("</BODY></HTML>");
out.close();
rs.close();
st.close();
db.close();
1
catch(Exception e) {
System.out.println("ERR0R: "+e+"
1
'I+¡);
/*Archivo temporal, en el que se hace
la consulta de los alumnos
del aula virtual, requiere los archivos Con:jultaAl y ConsultaA3*/
package mailes;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class Consulta2bis extends HttpSelvlet
{
private String matricula="" ;
public void init(Serv1etConfig config) throws ServletException {
super.init(config); // NO OLVIDAR PONER EL NOMBRE DEL SERVLET
I
public void service (HttpServletRequestrequest,
HttpServletResponse response){
String SQL-consulta = "SELECT * FROM ALUMNO";
ServletOutputStream out;
String parametro,value,url,db-user,passwd,driver;
Connection db;
Statement st;
Resultset rs;
int ¡=O:
url="jdbc:odbc:Aula-Virtual"; // Nombre de la base de datos en ODBC
db-user="SYSDBA";
//Usuario
// Password
passwd="masterkey";
driver="sun.jdbc.odbc.JdbcOdbcDriver";
//Drivers de ODBC
try {
out= response.getOutputStream();
1
catch(Exception e) {
System.out.println("ERR0R: "+e+"
return;
'I+¡);
I
try {
Class.forName(driver); ¡++;//Se inicializael driver
¡++;/I Se
hace
db = DriverManager.getConnection(url,db_user,passwd);
conexion a la BD
st = db.createStatement(); i++;
// Inicializa una sesion a la conexion
response.setContentType("text/htrnl");
out.println("<HTML>cHEAD><Hl:>Envio
de correo UAMVIRTUAL4MG"
+ " SRC="UAM.GIF" HSPACE=2O></Hl></HEAD>"
+" <BODY background=Y'fondol .jpgY' >");
e-mail=request.getParameter("e-,mail");
i=lOOO;
la
SQL-consulta=SQL-consulta +" WHERE MATRICULA=" + matricula;
rs=st.executeQuery(SQL_consulta);
if(rs.next()){
out.println("<FORMACTION="http://lis.uam.mx:8080/servlet/mailes.Consultal"
METHOD=\"POST\">");i=200;
NAME="remitente"
<INPUT out.println("<PRE>
De:
TYPE="TEXT" SIZE=55><br><br>");
out.println("
<INPUT
Para:
NAME="destinatarios"
TYPE="TEXT"
SIZE=55><br><br>");
out.println("
NAME="asunto"
<INPUT
Asunto: TYPE="TEXT"
SIZE=55><br><br>");
out.println("
Texto:<BR>");
out.println("
<TEXTAREA
COLS=60
ROWS=7
NAME="texto"
></TEXTAREA><br>");
out.println("
NAME="MANDAR"
<INPUT
TYPE="SUBMIT"
VALUE="Enviar"><br>");
out.println("
<a
href="http://lis.uam.mx/EducDistancia/PrincipalPag/UniversidadVi~ual.htm"~Cancelar~/a~"
);
out.println("</PRE></FORM>");
//aqui debe ir la direcc.de la pagina principal.
//
out.println("<form action=http://localhost/trabajo/Consulta3
method=
post>");
//
out.println("<form method=POST>
<p><input
type=submit
name=Bl
");
value=Salir></p>
</form>
1
out.println("</BODY></HTML>");
out.close();
rs.close();
st.close();
db.close();
1
catch(Exception e) {
try {
out.println("ERROR:"+e+" "+i );
out.close();
1
catch(Exception ei) {}
System.out.println("ERR0R: "+e+"
1
'I+¡);
ackage mailes;
import java.net.*;
I27
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class correo extends HttpServlet
{
private static final int PUERTO_SMTP=25;
private static final char ERROR-SMTP-1='4';
private static final char ERRORSMTP-2='5';
public void service(HttpServ1etRequestreq,
HttpServletResponse res) throws ServletException, IOException
{
String host;
String dominio;
String remitente;
String destinatarios;
String asunto;
String texto;
String datos;
Vector sesion = new Vector (20);
host = "xanum.uam.mx";
dominio = "uam.mx";
remitente = obtieneParametro(req, "rernitente");
destinatarios = obtieneParametro(req, "destinatarios");
asunto = obtieneParametro(req, "asunto");
texto = obtieneParametro(req, "texto");
try
{
datos=
"Fecha: ''+(new Date()).toString()+"\W+"De: "+remitente+"\r\n"+
"Para: "+destinatarios+"\r\n"+
"Asunto: "+asunto+"\r\n"+
"\r\n"+
texto+"\r\n";
enviaCorreo(host, dominio, remitente, destinatarios,asunto, datos, sesion);
enviaRespuesta(req, res, "Correo encoladopara ser enviado", sesion);
}catch(lOException e){
enviaRespuesta(req, res, e.toString(), sesion);
1
1
protected String obtieneParametro(HttpServ1etRequest
req, String parametro)
{
String[] valores;
String resultado="";
valores=req.getParameterValues(parametro);
if (valores!=null)
{
resultado=valores[O];
1
return (resultado);
1
I28
protected void enviaCorreo(String host, String dominio, String remitente,
String destinatarios, String asunto, String datos, Vector sesion)
throws IOException
{
Socket SockCorreo;
BufferedReader in;
DataOutputStream out;
StringTokenizer token;
SockCorreo=new Socket(host, PUERTO-SMTP);
in = new BufferedReader(new InputStreamReader(SockCorreo.getlnputStream()));
out = new DataOutputStream(SockCorreo.getOutputStream());
leeRespuesta(in,sesion);
enviaComando(out,"Helo "+dominio,sesion);
leeRespuesta(in,sesion);
enviaComando(out,"MAIL FROM: "+remitente,sesion);
leeRespuesta(in,sesion);
token = new StringTokenizer(destinatarios,",");
while (token.hasMoreElements())
{
enviaComando (out,"RCPT TO: "+token.nextToken(),sesion);
leeRespuesta(in,sesion);
I
enviaComando(out,"DATA ",sesion);
leeRespuesta(in,sesion);
enviaComando(out,datos+".",sesion);
leeRespuesta(in,sesion);
enviaComando(out,"QUIT ",sesion);
leeRespuesta(in,sesion);
1
private void enviaComando(Data0utputStream out,String comando,
Vector sesion) throws IOException
{
out.writeBytes(comando+"\r\n");
sesion.addElement(comando);
1
private void leeRespuesta(BufferedReaderin, Vector sesion) throws IOException
{
String respuesta;
char estado;
respuesta = in.readLine();
estado = respuesta.charAt(0);
sesion.addElement(respuesta);
if ((estado == ERROR_SMTP-I)II(estado == ERROR-SMTP-2))
{
throw (new IOException ("SMTP: "+respuesta));
1
I
protected void enviaRespuesta(HttpServ1etRequestreq,
HttpServletResponse res, String mensaje, Vector sesion)
throws IOException
{
ServletOutputStream out;
res.setContentType("text/html");
out = res.getOutputStream();
de java,
out.println ("<HTML><HEAD><TITLE>Tutorial
"Servlet</TITLE></HEAD>"+
"<BODY BGCOLOR=\"white\"TEXT=\'black\">"+
"<HI> Tutorial de Java, Correo Electrhico</HI>");
out.println("<P>"+mensaje);
out.println("<P><B>Parámetros
del mensaje de ");
out.println("correo elecrónico:</B>");
out.println ("<PRE>");
="+obtieneParametro(req,"remitente"));
out.println
("remitente
out.println ("destinatarios ="+obtieneParametro(req,"destinatarios"));
out.println
("asunto
="+obtieneParametro(req,"asunto"));
="+obtienePararnetro(req,"texto"));
out.println
("texto
out.println("</PRE>");
out.println("<P><B>Traceado
de la Sesión: </E+");
out.println("<PRE>");
//Enumeration en = sesion.elements();
//while (en. hasMoreElements())
'I+
// out.println((String) en.nextElement());
14
out.println("</PRE>");
out.println ("cGR WIDTH=\"20%\" ALIGN=\"LEFT\">"+
"Correo de la Universidad Virtual<br>cpre>");
out.println("
href=\"http://lis.uam.mx"+
"/EducDistancia"+"/PrincipalPag/UniversidadVirtual.htm
Y'>"+
"regreso"+ "c/a></pre></BODY></HTML>");
<a
1
7. Migración del sistema a servidor virtual.uam.mx
Justificación
Es de todos sabido que un servidor soportado por un sistema operativo como Uníx
es mas seguro y mas funcional, aunque el tratamiento a este sea de mayor complejidad,
lasrazonespara
tener nuestro sistema en un servidor Solaris que cuenta conestas
características es símbolo de seguridad para el usuario final.
La seguridad deestos sistemas no solo se basa en lacomplejidad del sistema
operativo, sino también en la parte correspondiente a virus informaticos, ya que al día de
hoy no existen virus capaces de doblegar un sistema que este alojado bajo un sistema
como lo es Uníx.
Proceso de Preparación
Como este sistema esta hecho totalmente en lenguaje Java, y sabemos que los
programas hechos en este lenguaje es posible ejecutarlo en la mayoría de los sistemas
operativos, ésta parte de la migración es la que tiene menor dificultad.
Dentro de la estructura planteada tanto en los archivos HTML como en los servlets
y clases que tienen contacto directo con la base de datos, la importancia radica en hacer
el cambio correcto para realizar el direccionamiento hacia el nuevo sitio, así como hacia la
nueva dirección de la base
de datos, también es importante que, como dentro de este
sistema operativo no existe el puente ODBC es necesario hacer uso de un controlador de
tipo 4 como lo es el que contiene interbase a través de la API que contiene el paquete, y
de estaformacomunicarnos
de forma correcta con la basede datos realizada en
interbase para Solaris.
Archivos HTML
Sistema
Windows
Redireccionamient
o hacia el nuevo
Archivos HTML
del
b Sistema
Solaris
Diagrama de proceso de redireccionamiento de archivos
HTML
Servlets
del
Sistema
Windows
Redireccionamiento
hacia el nuevo sitio y
Recompilación de
todos los archivos
Servlets
del
b Sistema
Solaris
Diagrama de proceso de redireccionamientoa la nueva base de datos.
Software a Utilizar
Para la migracióndelsistemaalservidorvirtual.uam.mxesnecesario
y tenemos que
evaluar todo el software que vamos a necesitar para esta tarea,
considerar los siguientes paquetes:
J2SDK 1.2.2que es necesario paraejecutar y compilarlosprogramas
hechos en Java.
lnterbase Server 6.0 o superior que es necesario para alojar la base de
datos de este sistema.
Interclient compatible con el lnterbase que hayamos instalado, este es el
que nos proporcionara la conexión entre la aplicación Java
y la base de
datos.
Apache Web Server 1.3.0o superior, este el encargado de proveernos una
configuración para poner nuestras paginasweb.
Apache Jserver 1.1 .O o superior, software encargadodeconfiguraruna
zona en la que se alojaran todos los Servlets que ocuparemos a travésdel
uso del sistema.
Gzip, necesario para hacer la descompresión de los diferentes paquetes
que vengan comprimidos con este formato.
Proceso de instalación de Java 2 SDK and Runtime Environment Versión1.3.0
Introducción:
EstaliberacióndeJava
2 SDKandJava
2 RuntimeEnvironmentv
1.3.0para
Solaris SPARC incluye nuevas clases y librerías, además de la maquina virtual de Java
con características de tecnología HotSpot.
Requerimientos:
Solaris 2.6, Solaris 7 o Solaris 8 requieren los parches
mencionados
a
continuación los cuales se encuentran en
http://java.sun.com/~2se/l.3/install-solaris-patches.html
Solaris
Version
Patch
Note
Id
-""""""
""-""
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
2.6 (5.6)
"""-"
"
"
107733-06 requerido
105568-17 requerido
requerido
10521
0-27
106040-13 requerido
105633-38 requerido (1,4,5)
106409-01 requerido (2)
108091-03 requerido (3)
106842-09 requerido (4)
106841-01 requerido (4)
1051 -20
81 requerido
2.6 (5.6) 105669-1O recomendado
2.6 (5.6) 105284-33recomendado
2.6 (5.6) 105591-09requerido
25-09
requerido
2.6 (5.6)1061
7
7
7
7
7
7
7
7
7
7
7
(5.7) 106980-1O requerido
(5.7) 107636-03requerido
(5.7) 108376-07 requerido (1,5)
requerido ( 1 )
(5.7)1071 53-01
(5.7) 106541-1 1 requerido
(5.7) 107544-03requerido
requerido
(5.7) 1 O91 04-01
(5.7) 106950-09requerido
(5.7) 106327-08requerido
(5.7) 106300-09requerido
-20
requerido
(5.7) 107081
8
(5.8) 108940-07requerido
NOTAS:
( 1 ) - parche requerido para localidades Asiáticas.
(2)- parche requerido para desplegar caracteres chinos en aplicaciones Swing
(3)
- parche requerido paca cualquier localidad en la que se usen caracteres
SO8859-1 O lSO8859-15
(4)- parche requerido para soportar moneda europea
(5) - requeido para correr kit de compatibilidad Java Test
Instalación de los parches:
Use el comando “showrev -p” para listar los parches instalados en el sistema, si
los parches no están previamente instalaclos, siga los pasos abajo mencionados para
hacer la instalación. Esta es simple si ha descargado los archivos.tar correspondientes
1 . Extraiga los archivos.tar de los parches que corresponden a la version de
su sistema Solaris como se muestra:
Solaris 6:$ tar xvf j2sdkl~3~0-patches-solsparc-5.6.tar
Solaris 7: $ tar xvf j2sdkl~~3~0-patches-solsparc-5.7.tar
Solaris 8: $ tar xvf j2sdkl~~3~0-patches-solsparc-5.8.tar
Estos crearan archivos con el numero de parche con extensi6n.tar.Z.
2. Descomprima y extraiga cada uno de los archivos que desee instalar
$ uncompress .tar.Z
$ tar xvf .tar
Un directorio con un nombre similar al de cara parche se creara, las
instrucciones generales de instalación son incluidas en elarchivo install.info
en el nivel superior del directorio de cada parche. Se adicionan también
instrucciones de instalación especial o requerimientos de post-instalación
I34
(tal como un reboto de susistema) en el archivo README incluido en cada
parche.
3. Logear el sistema como root.
4. Poner el sistema como monousuario (este paso no es requerido, pero es
recomendado para la instalación de los parches)# shutdown
5. Instale los parches, estos deben ser instalados usando los comandos abajo
mencionados, debiendo ser consultados los archivos install.info y
README. En los comandos abajo mencionados reemplace con la ruta de
el directorio de donde serán extraídos.
# patchadd -M . . .
6. Salga del sistema y reinicie
# shutdown -i6
Instalación de SDKlJRE:
Java 2 SDK está disponible como paquete Solaris o como binario auto-extraíble;
JRE esta disponible solo como binario auto-extraible. Las siguientes son instrucciones de
instalación para SDKIJRE que se desee instalar.
Instalación de paquete Solaris SDK:
La instalación es simple si el archivo .tar de SDK es descargado en un directorio
vacío, y en este.
1. Extraiga el contenido del archivo comprimido.
$ zcat j2sdkl-3-0-so1sparc.tar.Z I tar -xf Este creara un conjunto de 6 archivos y 4 paquetes
README.sparc
LICENSE.ps
COPYRIGHT
1.3-Developer-Guide.ps
1.3-Release-Notes.ps
1.3-Release-Notes.htmI
SUNWj3rt
SUNWj3dev
SUNWj3man
SUNWj3dem
READMEsparc is this file; the LICENSE file is acopy of the license
agreement.
2. Conviértase en root
su
3. Si se tiene previamente instalado algún paquete de liberación beta de J2SE
remuévalos primero
$ pkgrm SUNWj2dem SUNWj2man SUNWj2dev SUNWj2rt
Si su liga simbólica estaba apuntando a /usr/javal.2, puedes querer
actualizar este apuntador a otra plataforma Java como /usr/javaI . I para
JDK 1. I .x o /usr/j2se para J2SE 1.3
4. Ejecuta el comando pkadd para instalar los paquetes
$ pkgadd -d . SUNWj3rt SUNWj3dev SUNWj3man SUNWj3dem
Este instalara SDK dentro de /usr/j2se
5. Elimina los archivos .tar y directorios de extracción
6. Salir del sep de root
Instalación de binarios auto-extraíbles de SDKlJRE:
Estas instrucciones se aplican pare ambos archivos. Los comandos ejemplo
usados abajo usan los nombres de archiv,osde SDK; para JRE simplemente reemplace
"j2sdk" por "j2re" en los directorios y archivos mencionados.
1. Cambie los permisos de el grupo de archivos binarios de auto-extracción
$ chmod +x j2sdkl-3-0-solsparc.bin
2. Cambie el directorio a la locacion donde serán instalados los archivos.
3. Ejecute los archivos binarios de auto-extracción. Los archivos serán
instalados en un subdirectorio llamado j2sdk1-3-0. Después de completar
la instalación, el directorio puede ser renombrado según las necesidades.
Ejemplo:
$ chmod +x /tmp/j2sdkl-3-O-solsparc.bin
$ cd /export
$ /tmp/j2sdkl~3~0-solsparc.bin
Unpacking...
Checksumming ...
Extracting...
Archive: ./install.sfx. 1665
creating: j2sdk1-3-01
Usando Java 2 SDK 1.3:
Antes de usar Java 2 SDK o Java Runtime Environment, por favor verifique que los
parches requeridos para su versión de Solaris estén instalados.
La manera mas fácil de ejecutar Java 2 SDK es actualizando la variable de medio
ambiente PATH en su shell colocando la ruta de los ejecutable java al frente, antes
/usr/bin. Por ejemplo, si SDK esta instalaclo en /usr/j2se,
(csh)
setenv PATH "/usr/j2se/bin:$PATH"
(sh or ksh) PATH="/usr/j2se/bin:$FATH"
Alternativamente, los ejecutables pueden correrse especificando la ruta completa,
/usr/j2se/bin/javac, /usr/j2se/bin/java, etc.
Ninguna otra variable de ambiente (tal como JDK-HOME, JAVA-HOME o
CLASSPATH) son requeridas para ejecutar SDK, sin embargo, existen escenarios de
estas variables que pueden resultar en una impropia operación y deben ser checados
para posibles conflictos.
I36
8. Migración del sistema a servidor infocbi.uam.mx
Justificación
La razón mas importante de esta migración fue que a raíz del funcionamiento no
muy bueno del servidor original en el que se encontraba lis.uam.mx se decide hacer este
proceso, el sistema esta siendo usado de forma real por algunos profesores y alumnos,
así que es necesario que este sea constante para que el usuario final no se de cuenta de
la transición entre un servidory otro.
Proceso de Preparación
Lasbondadesdellenguaje
Java son muy útiles para estosfines, ya quelos
al
cambios no serán extremadamente grandes, solo serán algunos cambios en cuanto
código fuente.
Dentro de la estructura planteada tanto en
los archivos HTML como en los
servlets y clases que tienen contacto directo con la base de datos, la importancia
radica en hacer el cambio correcto para realizar el direccionamiento hacia el nuevo
sitio,asícomohacialanuevadireccióndelabasededatos.Dentrodela
migraciónhaciaestenuevoservidor,laparteimportantedentrodelabasede
datos es el paso de una originalmente creada en lnterbase 5, a un lnterbase 6 que
incluye un proceso de migración entre controladores de bases de datos.
Las siguiente graficas muestran
archivos HTML y los archivo .class.
el procedimiento de migración utilizado para los
Archivos HTML
del
Servidor
lis.uam.mx
Redireccionamiento
hacia el nuevo sitio
Archivos HTML
del
b Servidor
infocbi.uam.mx:85
Diagrama de proceso de redireccionamiento de archivos HTML
Servlets
del
Servidor
lis.uam.mx
/Y
Redireccionamiento
hacia el nuevo sitioy a
la nueva base de datos
Recopilación de
todos los archivos
Servlets
del
b Servidor
infocbi.uam.mx:
-8-
Diagrama de proceso de redireccionamientoa la nueva base de datos.
Migración de base de datos de Interbase5 a lnterbase 6
Detenga todos los procesos que este corriendo en ambos manejadores.
Respalde la base de datos de la versión 5 este creara un archivo .gbk.
Apague su lnterbase 5.
instale la versión 6 de Interbase.
inicializa el nuevo servidor.
0
En WndowsNT, hágalo desde Servicios en el panel de control e inicie
lnterbase Guardian.
0
En Windows 9x, ejecute la aplicación lnterbase Guardian
6. Restaure la base de datos .gbk. , esto generara un nuevo .gdb.
1.
2.
3.
4.
5.
9. Conclusiones.
El proyecto de Educaciónesunanecesidaddemuchas
Universidades, pero no
solo anivel nacional, si no a nivel mundial, esta necesidad a provocado el
desarrollo deéste
proyecto quehabía
llegado aun
segundo prototipo. Sin
embargo en este trimestre se ha llegado a un sistema funcional y estable que está
siendo utilizado por varios grupos de licenciatura y posgrado y está teniendo muy
buena aceptación.
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, afortunadamente pudimos realizamos la
migración del sistema a un servidor mas estable y seguro.
De la realización del presente proyecto, se pudo observar y tener viva conciencia
de la importancia y el impacto en la sociedad de ladenominada"Educación
a
Distancia". Asumiéndose ala
Universidad Virtual como
una
aplicación que
muestra las ventajas de la educación a distancia en esta
era
de las
comunicaciones,ya que esunaforma
flexible de enseñanza especializada a
distancia que utiliza avanzadas tecnologías, esto permite ofrecer una formación de
excelencia, cumpliendo con los estándares académicos internacionales.
Entre otras cosashay que destacarque este proyecto brinda comodidad a los
alumnos,ya que puedentomarse las clases en cualquier parte donde exista
Internet, por lo que puede ser muy comercial. Cabe mencionar que el proyecto fue
desarrollado completamente por alumnosde
las carreras de computacióny
electrónica con asesorías de profesores de la universidad.
1O. Apéndice
Aspectos sobre la máquina conSis1:ema Solaris UAM Virtual
n los inicios de este proyecto se pretendió realizar el correo electrónico para
la UniversidadVirtualde
la UAMy con éxito se realizó, el correo fue
implementado en Java (corno todo el proyecto se ha hecho), se desarrollo
por medio de un Servlet y se incrusto en la primera página en donde estas
apenas eligiendo la forma en que vas a entrar, ya sea como alumno o como maestro. Con
esto el correofuncionanadamas
como servicio pues no brinda un correo personaly
mucho menos su administración tan sólo brinda la interfaz y el envío del mismo. Desde
estecorreo se puedemandar de cualquier correo hacia cualquier otro pues te pide
destinatario y remitente, además de que se le agregaron vínculos a otros correos de los
más conocidos.
Bueno a groso modoesto fue lo que desarrollo el proyecto y claro la integración a lo
que fue el proyecto el conocerlo y tomar las bases y antecedentes para poder participar
en eldesarrollo del mismo.
Para desarrollar una segunda parte del proyecto, la idea fundamental que movió los
intereses deestefueel
migrartodoslos
avances hasta elmomentoaunanueva
plataforma (y máquina), es decir se quería incursionar en la plataforma UNIX. Para lograr
esto se tuvo que empezar desde el principio a conocer este nuevo sistema para todos, no
habíanadiequetuviera
alguna experiencia eneste sistema. Pero hubo un pequeño
inconveniente, la Base de Datos, si la Base de Datos no se podía migrar tal como estaba,
para la máquina que trabaja UNIX se utilizará como manejador ORACLE, pero aún falta
comprar el Software. Bueno a esto, se comenzó a pensar como poder dar un adelanto a
lamigraciónmientrasseconsigueORACLE.Una
de las formasfáciles de hacerlo es
FTPeando los programas, así que dijimos: vamos a hacer esta máquina un servidor FTP.
Y pues manos a la obra, y el FTP se hizo, y bueno los detalles se dan a continuación.
¿Y como fue el FTP?
E
I desarrollo de FTP fue sencillo, para empezar secreo un directorio en donde se
guardaría la información este directorio esta en el directorio raíz y se llama home2 dentro
de home2 esta el directorio ftp que como habrán adivinado este es donde pondremos los
archivos FTP que además se encuentra acompariado por otro archivo(de requisito) que
es lost+found.
Y dentrode FTP se encuentran algunas subcarpetas que fueron creadas
requisito para tener el buen funcionamiento del FTP.
nuevamente
como
Las carpetas creadas son:
bin
dev
etc
Pub
usr
Dentro de la carpeta bin, todas estas carpetas tienen como owner al superusuario y tienen solo el
atributo de lectura, es decir, no se puede escribir en ellas ni ejecutar sobre ellas.
140
Se copiaron algunos archivos del verdadero bin que se encuentra en el directorio raíz
Los archivos son:
compress
IS
tar
Después tenemos el directorio dev (Que nuevamente es una copia) y dentro de éI se hace un
proceso un poco raro se van a crear nodos, de hecho este es uno de los pasos mas importantes
para llegar a tener nuestro servidor de FTP anónimo, a modo de comentario le quiero decir que
cuando se implemento el FTP esto fue lo que hice hasta el ultimo y antes de hacerlo el FTP todavía
no servia para nada y despues de este paso como por artede magia, FTP funciona.
Para mayor información sobre como hacer este proceso puede consultar el manual de mknod (
escriba en la línea de comando: man mknod).
Bueno como habíamos dicho tenemos que crear nodos a los archivos:
tCP
ticotsord
UdP
zero
Que se encuentran originalmente en el directorio Idev. Bueno para darnos una ayuda de como
crear los nodos debemos teclear en la línea de comandos lo siguiente:
# cd /dev
# Is -1L
Con estoestaremos obteniendo el mayor y menor de cada uno de los archivos mencionados
arriba. El numero mayor y menor aparecen al lado izquierdo de la fecha, yconesto
también
obtendrá la información para saber si es un archivo de bloque(b), de caracter(c) o bien FIFO(p),
que es la primera letra que aparece en el renglón del archivo.
El siguiente paso ya que conocemos el mayor y menor de estos archivos, es crear ahora si los
nodos. Si ya se consulto el manual de mknod se vera que mas o menos la sintaxis para crear cada
uno de los nodos es algo parecido a esto:
# mknod tcp c I I 42
Y así sucesivamente para los otros tres archivos
también hay una copia del directorio etc, que tan importante es para el sistema en esta copia están
los archivos:
group
netconfig
passwd
De los cuales solo netconfig es una copia, los demás fueron hechos con las entradas mínimas
para existir. Esto es, el archivo group no es el original que esta en el directorio etc del directorio
raíz, si no que es un archivo que tiene mas o menos la siguiente estructura:
root::O:root
ftp::50O:ftp
141
La declaración de un grupo llamado roof, luego dos puntos, no tiene contraseña, dos puntos, el
numero de grupo O, dos puntos y decir que es miembro de roof.
Nuevamente declaramos un grupo nuevo llamado ftp, que de hecho este va a ser el usuario
anónimo, dos puntos, sin contraseña, dos puntos, el numero de grupo 500 (que no necesariamente
tiene que ser 500, si no solo uno que no haya sido ya utilizado), dos puntos, y decir que pertenece
a ftp.
Después de esto creamos un archivo llamado passwd (igual que el que esta en /etc) y nuevamente
le vamos a poner las entradas necesarias para que se crea que es el que tiene las passwords, pero
solo nosotros sabemos que es falso (jajajajajaja).
La estructura del archivo es la siguiente:
root:x:O: ? : S u p e r - U s e r : L / s b i h
sys:x:3:3::/:
ffp:x: 1006:
1:Anonymous FTP:/home2/ftp:/birue
El usuario roof, el usuario sys y el usuario ftp (este es el bueno para el FTP anónimo), dos puntos,
luego una x que simula ser las contraseñas, dos puntos, el numero de identificación de usuario,
dospuntos, el numero del grupo al que pertenecen, dos puntos, un comentario cualquiera, dos
puntos, el directorio que le pertenece al usuario, dos puntos y por ultimo el directorio a donde irán
las salidas erróneas. Y así queda estructurado un archivo que nos servirá para decir que ahí están
las contraseñas (Cualquiera pensaría que puede burlar por ahí la seguridad del sistema pero el
archivo es falso).
Y vamos a tener una carpeta que por convención se llama en la mayoría de las veces PUB que es
la contracción de PUBLICO. En este directorio se colocan los archivos, es decir el software, que
estará disponible en este tipo de paginas.
Sigue la historia
La siguiente carpeta en crearse fue usr que recursivamente tiene, o bien, se le crearon enseguida
las siguientes carpetas:
lib
sbin
share
Y estas carpetas a su vez tienen algo adentro, veamos:
La carpeta lib tiene
Idso. 1*
libcso. 1*
1ibdl.so.I *
libmp.so.2*
libnsl.so. I *
libsocketso. I *
nss-compatso. I *
nss-dnsso. I *
nss-filesso. 1*
nss-nis.so. I *
nss-nisplusso. 1 *
142
nss-xfnso. I *
sfraddr.so*
straddr.so.2*
Que fueron copiados de la usrllib pero del que esta en la raíz.
La carpeta share es la mas ocupada de todas, pues dentro tiene una carpeta llamada lib que a su
vez esta llena de archivos que fueron copiados de usrlliblzoneinfo.
Que nuevamente es un requisito que pide el demonio del ftp para poder funcionar bien.
¿Que es ftpd?
Es el programa o bien llamado demonio que hace posible todos los servicios que pudiera tener el
ftp, es decir, este programa siempre esta corriendo, por default, un sistema UNlX es un servidor de
FTP, lo Único que falta implementarle, y que fue lo que hicimos, es el ftp anónimo o bien publico.
Paraestoprimeramente recurrimos a la información del ftpd, conesto supimos los pasos para
implementar este servicio, y además te d ce como protegerte de la red, es decir como dar
seguridad a tu ftp anónimo.
Para mas información teclear en la línea de comando:
# man ftpd
Y obtendrás toda la información referente al FTP
Bueno con esto quedo implementado el FTP en la maquina de la UOC.
Después de haber hecho este servidclr FTP parece fácil la migración del Software, aunque
no se trata nadamas de pasar los programas y ya, pues al menos con eso ya tenemos hecho mas
del 50%, buenodaré por hecho que el que tenga que pasar los programas sabrá FTPear, y
supondré que ya están en la máquina UNIX.
Siguiente paso es definir en donde pc'ndremos estos programas (que son servlets, html's y
dibujos que aún no investigo si no tienen rlingún problema de una plataforma aotra),bueno la
pregunta es ¿Cómo definir en donde estarán los servlets, los html's y los dibujos?. Para empezar
para poder correr los Servlets tenemos un programa que se nos acaba de instalar recientemente
que es el ¡Planet Web Server del cual tenernos una licencia de 90 días que lo más seguro es que
la tendremos que extender, aunque Luis Castro esta negociando el comprar la versión académica,
pero independientemente de esto la prioridad para las siguientes personas que ingresen a este
proyecto, apartede
aprender UNlX tendrán que familiarizarse con esteprograma,eneste
momento doy un bosquejo de como utilizar vagamente este programa, después formalizaré mas
mi explicación.
Primeramente el manual lo encontramos tecleando en el browser
www.virtual.uam.mx:85
(Claro estoy pensando que estamos en Internet)
Ahí se encuentra toda la información de este programa, y ya después que uno le sabe mover
la forma de entrar aéI es:
www.virtual.uam.mx:8888
El usuario es : admin
Y la clave es : admin
(Parece conocido verdad)
Dentro de este programa esta toda una ficha para la administración de los servlets ahí es donde se
define en que directorio vas a tener los servlets ( o bien mejor dicho, cuando se ejecute un servlet
en que directorio lo encontrará la máquina), :;e creará una carpeta en donde quedarán los archivos
html y otra en donde quedaran los dibujos por último lo que hay que hacer es cambiar las rutas a
los archivos html y a los servlets.
I44
1l.Bibliografía.
1001 tips para programar en Java, Steven W. Griffith et al.
Mc Graw Hill , México ,D.F ,1998, Ira. Edición Español.
Java Servlets, Kalr Moss, Mc Graw Hill, United States of America, 1999,
first edition (Primera Edición).
Aprendiendo Borland Jbuilder2 en 21 días, Donald Doherty y Michelle M.
Manning, Prentice may HispanoamericanaS.A., México, 2000, 1ra. Edición
Español.
Documentación de reportes anteriores de Educación a Distancia
Java Secrets, Elliotte Rusty Harold,
o f America, 1997.
IDG Books Worldwide, United States
REFERENCIAS
Ittp://developer.java.sun.com/developer/onlineTraininn/Servlets/
=undamentals/contents.html
Ittp://iava.sun.com/docs/books/tutorial/index.html
~ttp://www.netverk.com.ar/usuarios/suweb/html/manualde/man000.htm
~ttp://members.es.tripod.de/froufe/parte2/cap2-1
.html
~ttp://iava.sun.com/products/jdk/l.2/docs/api/
lttp://qeminis.adi.uam.es/-dcc/html/htmll
.htm
1ttp://www.eis.uva.es:8O/GuiaHTML/introHTML.html
1ttp://www.fie.us.es/docencia/publi/JAVA
lttp://www.servlets.com
lttp://java.proqramacion.net/cursos.htm
Descargar