Apuntes PWEB
Apuntes PWEB
PRESENTE.
Bajo protesta de decir verdad, Nicolás Alonzo Gutiérrez, personal docente adscrito al
Instituto Tecnológico de Apizaco del Tecnológico Nacional de México, manifiesto que, en
cumplimiento de mis actividades relacionadas con el Año Sabático, elaboré la obra titulada
“ELABORACIÓN DE APUNTES”. Con base en lo anterior, y con fundamento en los
artículos 83 de la Ley Federal del Derecho de Autor y 46 de su Reglamento, reconozco que
el Tecnológico Nacional de México es titular de los derechos patrimoniales sobre la misma
y le corresponden las facultades relativas a la divulgación, integridad de la obra y de
colección, conservando el derecho a figurar como autor. Asimismo, respondo por la autoría
y originalidad de la citada obra; y relevo de toda responsabilidad al Tecnológico Nacional de
México de cualquier demanda o reclamación que llegara a formular alguna persona física o
moral que considere que con esta obra es afectado en alguno de los derechos protegidos por
la Ley en cita, asumiendo todas las consecuencias legales y económicas.
ATENTAMENTE
___________________________
AUTOR
ii
Contribución académica
La programación web ha crecido exponencialmente durante los últimos años. El enfoque
de desarrollo de software basado en escritorio ha demostrado tener más desventajas que
ventajas cuando se trata de sistemas de atención al cliente de forma masiva. Aquí es donde
entra el concepto de intranet en contraposición al concepto de internet. La intranet se refiere
al desarrollo de una ‘internet’ local que permita ejecutar las aplicaciones locales en un
servidor web al cual puedan acceder todos los departamentos de una empresa o una
institución. El desarrollo de aplicaciones de intranet permite migrar muy fácilmente a las
aplicaciones de internet o de desarrollo web. Además, las ventajas de las aplicaciones web
es que son muy fácilmente escalables: sólo requieren un sistema operativo y un navegador
web para poder funcionar. No es necesario instalar la aplicación computadora por
computadora, simplemente se comparte la dirección o URL del servidor que aloja la
aplicación y tener los permisos correspondientes. Todo esto abre muchas posibilidades a los
ingenieros en TICS.
El ingeniero de TICS entonces, haciendo uso de los conocimientos de esta materia, puede
implementar aplicaciones computacionales para solucionar problemas de diversos contextos,
integrando diferentes tecnologías, plataformas o dispositivos. Puede también implementar
aplicaciones computacionales para solucionar problemas de diferentes contextos, integrando
diferentes tecnologías, plataformas o dispositivos. Puede también administrar proyectos que
involucren tecnologías de la información y comunicaciones para el logro de objetivos
organizacionales conforme a los requerimientos establecidos ayudándose, naturalmente de
otras materias de la retícula, considerando que la programación web es una parte importante
en el ciclo de desarrollo de software. En esta materia recae la responsabilidad de lograr un
producto tangible para el cliente.
iii
Contribución académica
decisiones que realizan los directivos. Estas estadísticas están –la mayoría de las veces- a un
clic de distancia.
En ingeniero en Tics a través de esta materia tiene un primer contacto con las metodologías
basadas en estándares internacionales y que son de uso común en las empresas de desarrollo
de software.
En la programación del lado del cliente el ingeniero en tics, diseña e implementa interfaces
gráficas de usuario para facilitar la interacción entre el ser humano y los equipos de cómputo
y sistemas electrónicos. Actualmente los lenguajes de programación ofrecen muchas
herramientas para construir sistemas con interfaces gráficas prediseñadas utilizando marcos
de trabajo o frameworks lo que facilita enormemente el proceso de desarrollo de software,
permitiendo la interfaz entre la base de datos, la lógica de negocio, el control del sistema y
la vista o interfaz de usuario.
Por último, el ingeniero en tics con ayuda de la programación web puede ser capaz de
empezar a desarrollar sistemas que resuelvan una necesidad y en ocasiones es posible crear
empresas en el ámbito de las tecnologías de la información y comunicaciones contribuyendo
de esta forma al desarrollo de su entorno.
Por último, una aplicación de escritorio requiere menos atención sobre los aspectos de
seguridad, ya que en algunas ocasiones puede ser relegada al sistema operativo o administrar
permisos sobre clientes locales o una red local.
iv
Contribución académica
En una aplicación web, la seguridad recae en el mismo sistema y debe considerarse
cuidadosamente. Aparte de asignar los permisos a los usuarios de la empresa. Existen
módulos que están de cara a internet y expuestos a diferentes ataques de fuerza bruta, ataques
cruzados, suplantación de identidad, ataques de denegación de permisos, inyección de código
a bases de datos o de inyección de código de JavaScript.
v
Contribución académica
Contenido
Carta de reconocimiento del autor de los derechos a favor del TECNM ............................................ ii
Contribución académica......................................................................................................................iii
Contenido ............................................................................................................................................vi
Índice de tablas ...................................................................................................................................xi
Índice de ilustraciones........................................................................................................................ xii
Planeación del curso ......................................................................................................................... xiii
Caracterización de la asignatura .................................................................................................. 14
Intención didáctica ....................................................................................................................... 14
Capítulo 1 Introducción a las aplicaciones web ................................................................................ 20
Competencias específicas y genéricas ......................................................................................... 20
Temario detallado de la unidad ................................................................................................... 20
Introducción ................................................................................................................................. 20
1.1. Evolución de las aplicaciones web ........................................................................................ 21
1.1.1. Orígenes de la internet ................................................................................................. 21
1.1.2. Evolución del desarrollo web ........................................................................................ 35
1.2. Arquitectura de las aplicaciones web ................................................................................... 44
1.2.1. ¿Qué es la arquitectura de aplicaciones web? ............................................................. 45
1.2.2. Resumen de estilos arquitectónicos ............................................................................. 46
1.2.2. Arquitectura cliente servidor ........................................................................................ 47
1.2.3. Arquitectura basada en CGI .......................................................................................... 48
1.2.4. Arquitectura modelo vista controlador MVC................................................................ 51
1.2.5. Elementos arquitectónicos de sistema básicos ............................................................ 53
1.3. Tecnologías para el desarrollo de aplicaciones web ............................................................. 58
1.3.1. Prototipo ....................................................................................................................... 60
1.3.2. Diseño ........................................................................................................................... 60
1.3.2. Infraestructura .............................................................................................................. 61
1.3.3. Tecnologías para administración de bases de datos .................................................... 69
1.3.4. Administración de versiones ......................................................................................... 71
1.3.5. Editores para programación ......................................................................................... 73
1.4. Planificación de aplicaciones web ......................................................................................... 74
1.4.1. Requerimientos............................................................................................................. 75
1.4.2. Análisis y diseño ............................................................................................................ 76
1.4.2. Construcción ................................................................................................................. 76
vi
Contenido
1.4.3. Integración y pruebas ................................................................................................... 77
1.4.4. Cierre............................................................................................................................. 78
Capítulo 2 HTML, XML, CSS ............................................................................................................... 80
Competencias específicas y genéricas ......................................................................................... 80
Temario detallado de la unidad ................................................................................................... 80
2.1. Introducción .......................................................................................................................... 81
2.2. Estructura global de un documento web .............................................................................. 82
1.2.1. Estructura de un documento web ................................................................................ 82
1.2.2. Bloques de texto ........................................................................................................... 83
1.2.3. Marcadores lógicos ....................................................................................................... 84
1.2.2. Estructura de directorios de un proyecto ..................................................................... 84
2.3. Elementos básicos ................................................................................................................. 88
2.3.1. Tipos de letra ................................................................................................................ 88
2.3.2. Vínculos ......................................................................................................................... 90
2.3.3. Listas.............................................................................................................................. 93
2.3.4. Tablas ............................................................................................................................ 94
2.3.5. Objetos ........................................................................................................................ 100
2.3.6. Imágenes ..................................................................................................................... 100
2.3.7. Aplicaciones ................................................................................................................ 103
2.4. Formularios ......................................................................................................................... 113
2.4.1. Definiciones................................................................................................................. 113
2.4.2. Atributos de formularios ............................................................................................. 114
2.4.3. Elementos de formularios ........................................................................................... 116
2.4.4 Tipos de entrada .......................................................................................................... 121
2.4.5. Atributos de input ....................................................................................................... 130
2.4.6. Atributos de form........................................................................................................ 139
2.5. Lenguajes de presentación en documentos web................................................................ 144
2.5.1. Metadatos ................................................................................................................... 144
2.5.2. Representación y codificación .................................................................................... 144
2.5.3. XML ............................................................................................................................. 147
2.6. Selectores ............................................................................................................................ 158
2.6.1. Introducción a CSS ...................................................................................................... 158
2.6.2. Importar una hoja de estilo ........................................................................................ 159
2.6.3. Identificadores ............................................................................................................ 160
vii
Contenido
2.6.4. Clases .......................................................................................................................... 160
2.6.5. Reglas CSS ................................................................................................................... 161
2.6.6. Tipos de estilo ............................................................................................................. 163
2.6.7. Hojas de estilo externas .............................................................................................. 164
2.6.8. Estilos internos ............................................................................................................ 164
2.6.9. Estilos en línea ............................................................................................................ 165
2.6.10. Selectores CSS ........................................................................................................... 165
2.7. Modelo de caja.................................................................................................................... 172
2.7.1. Establecer los márgenes ............................................................................................. 172
2.7.2. Aplicación de los bordes ............................................................................................. 174
2.7.3. Ajustar el relleno ......................................................................................................... 176
Capítulo 3 Programación del lado del cliente ................................................................................. 179
Competencias específicas y genéricas ....................................................................................... 179
Temario detallado de la unidad ................................................................................................. 179
3.1. Introducción al lenguaje...................................................................................................... 180
3.1.1. Introducción a JavaScript ............................................................................................ 180
3.1.2. Sintaxis ........................................................................................................................ 180
3.1.3. Variables...................................................................................................................... 181
3.1.3. Operadores ................................................................................................................. 182
3.1.3. Tipos de datos ............................................................................................................. 185
3.1.4. Funciones .................................................................................................................... 186
3.1.5. Ámbito de variables .................................................................................................... 188
3.1.6. Cadenas ....................................................................................................................... 190
3.1.7. Uso de onerror ............................................................................................................ 194
3.2. Manejo de frameworks ....................................................................................................... 195
3.2.1. Introducción a los frameworks del lado del cliente .................................................... 195
3.2.2. Angular ........................................................................................................................ 196
3.2.3. Vue .............................................................................................................................. 197
3.2.4. React ........................................................................................................................... 197
3.3. Estructuras de control ......................................................................................................... 197
3.3.1. Condiciones simples .................................................................................................... 198
3.3.2. Condición múltiple ...................................................................................................... 200
3.3.3. Ciclos ........................................................................................................................... 201
3.3.4. Eventos........................................................................................................................ 204
viii
Contenido
3.3.5. Formularios ................................................................................................................. 216
3.4. Manipulación de objetos .................................................................................................... 227
3.4.1 Representación de objetos .......................................................................................... 227
3.4.2. Operaciones sobre objetos ......................................................................................... 229
Capítulo 4 Programación del lado del servidor ............................................................................... 232
Competencias específicas y genéricas ....................................................................................... 232
Temario detallado de la unidad ................................................................................................. 232
4.1. Introducción al lenguaje...................................................................................................... 233
4.1.1. Introducción a las tecnologías de scripting del lado del servidor ............................... 233
4.1.2. Algunos lenguajes de programación para web ........................................................... 233
4.1.3. Variables y tipos de datos ........................................................................................... 235
4.1.4. Expresiones ................................................................................................................. 252
4.1.5. Operadores ................................................................................................................. 253
4.2. Estructuras de control ......................................................................................................... 255
4.2.1 Sentencia IF .................................................................................................................. 255
4.2.2. Sentencia switch ......................................................................................................... 257
4.2.2. Sentencia while ........................................................................................................... 258
4.2.3. Sentencia do while ...................................................................................................... 259
4.2.4. Sentencia for ............................................................................................................... 260
4.2.5. Constructor foreach .................................................................................................... 261
4.3. Tratamiento de formularios ................................................................................................ 262
4.3.1. Formularios HTML (GET y POST) ................................................................................. 262
4.3.2. Saneamiento y validación de variables de entrada .................................................... 264
4.3.3. Subida de archivos ...................................................................................................... 271
4.4. Manejo de objetos en el servidor ....................................................................................... 274
4.4.1 Terminología ................................................................................................................ 275
4.5. Creación de clases ............................................................................................................... 276
4.5.1. Propiedades y métodos .............................................................................................. 277
4.5.2. Creación de un objeto ................................................................................................. 277
4.5.3. Herencia (Extends) ...................................................................................................... 278
4.5.4. Visibilidad .................................................................................................................... 279
4.6. Acceso a datos..................................................................................................................... 283
4.6.1. Conexiones y su administración.................................................................................. 284
4.6.2. Transacciones y auto-commits ................................................................................... 286
ix
Contenido
4.6.3. Sentencias preparadas ................................................................................................ 287
4.6.4. Errores y su manejo .................................................................................................... 289
Capítulo 5 Cómputo en la nube y servicios ..................................................................................... 292
Competencias específicas y genéricas ....................................................................................... 292
Temario detallado de la unidad ................................................................................................. 292
5.1. Conceptos generales ........................................................................................................... 293
5.1.1. Características esenciales ........................................................................................... 293
5.1.2. Modelos de servicio .................................................................................................... 294
5.1.3. Modelos de despliegue ............................................................................................... 295
5.2. Tipos de servicios en la nube .............................................................................................. 296
5.2.1. Conectividad y administración de redes ..................................................................... 297
5.2.2. Virtualización .............................................................................................................. 298
5.3. Patrones de diseño.............................................................................................................. 301
5.3.1. Patrones de diseño de software ................................................................................. 301
5.3.2. Patrones de diseño en la nube.................................................................................... 320
5.4. Estándares en servicios ....................................................................................................... 324
5.4.1. Introducción ................................................................................................................ 324
5.4.2. Conceptos básicos de Cloud Computing ..................................................................... 326
5.4.3. Estándares de Cloud Computing ................................................................................. 327
5.5. Plataformas tecnológicas .................................................................................................... 329
5.5.1 AWS .............................................................................................................................. 330
5.5.2. Azure ........................................................................................................................... 331
5.5.3. Google ......................................................................................................................... 331
5.5.4. Red Hat openshift ....................................................................................................... 333
5.5.5. IBM SmartCloud .......................................................................................................... 333
5.5.7 VM Cloud Suite............................................................................................................. 333
5.5.8. OpenStack ................................................................................................................... 334
5.5.9. DigitalOcean ................................................................................................................ 334
5.5.10. Oracle Cloud OCl ....................................................................................................... 335
5.6. Seguridad e interoperabilidad ............................................................................................ 338
5.6.1 Seguridad en la nube ................................................................................................... 338
5.6.2. Interoperabilidad en la nube ...................................................................................... 346
Bibliografía ...................................................................................................................................... 349
x
Contenido
Índice de tablas
TABLA 0.1 PLANEACIÓN DEL CURSO .......................................................................................................................... XIII
TABLA 1.1 RESUMEN DE ESTILOS ARQUITECTÓNICOS .................................................................................................... 46
TABLA 1.2 ALGUNAS HERRAMIENTAS PARA PROGRAMACIÓN WEB................................................................................... 59
TABLA 1.3 HERRAMIENTAS DE MODELADO ................................................................................................................. 70
TABLA 1.4 HERRAMIENTAS DE ADMINISTRACIÓN ......................................................................................................... 71
TABLA 1.5 ALGUNOS EDITORES PARA DESARROLLO ...................................................................................................... 73
TABLA 2.1 BLOQUES DE TEXTO................................................................................................................................. 83
TABLA 2.2 MARCADORES LÓGICOS ........................................................................................................................... 84
TABLA 2.3 TIPOS DE LETRA ...................................................................................................................................... 88
TABLA 2.4 VALORES DEL ATRIBUTO TARGET ................................................................................................................ 91
TABLA 2.5 PROPIEDADES DE REJILLA ......................................................................................................................... 98
TABLA 2.6 FORMATOS Y TIPOS DE IMAGEN ............................................................................................................... 103
TABLA 2.7 EVENTOS DISPONIBLES EN UN OBJETOS EVENTSOURCE ................................................................................. 113
TABLA 2.8 VALORES DEL ATRIBUTO TARGET .............................................................................................................. 114
TABLA 2.9 ATRIBUTOS DE LA ETIQUETA FORM ........................................................................................................... 116
TABLA 2.10 ELEMENTOS DE FORMULARIOS .............................................................................................................. 120
TABLA 2.11 RESTRICCIONES DE ENTRADA COMUNES .................................................................................................. 127
TABLA 2.12 ELEMENTOS SINTÁCTICOS DE DTD ......................................................................................................... 153
TABLA 2.13 ATRIBUTOS ....................................................................................................................................... 155
TABLA 2.14 VALORES .......................................................................................................................................... 156
TABLA 3.1 ALGUNOS OPERADORES DE JAVASCRIPT .................................................................................................... 183
TABLA 3.2 PRECEDENCIA DE OPERADORES DE MAYOR A MENOR ................................................................................... 184
TABLA 3.3 CICLOS DE JAVASCRIPT .......................................................................................................................... 201
TABLA 3.4 ALGUNOS EVENTOS DEFINIDOS EN JAVASCRIPT ........................................................................................... 205
TABLA 3.5 PROPIEDADES/MÉTODOS DEFINIDAS POR DOM ........................................................................................ 214
TABLA 3.6 VALIDACIONES COMUNES ....................................................................................................................... 224
TABLA 3.7 ALGUNAS VALIDACIONES COMUNES ......................................................................................................... 226
TABLA 4.1 TIPOS BÁSICOS DE PHP ........................................................................................................................... 236
TABLA 4.2 TIPOS COMPUESTOS DE PHP 7 ................................................................................................................. 244
TABLA 4.3 PRECEDENCIA DE OPERADORES................................................................................................................ 254
TABLA 4.4 FILTROS DE SANEAMIENTO ..................................................................................................................... 264
TABLA 4.5 TIPOS DE FILTROS DE VALIDACIÓN PARA LA FUNCIÓN FILTER_VAR ................................................................... 267
TABLA 4.6 VALORES DE ERROR PARA SUBIR ARCHIVOS ................................................................................................ 273
TABLA 5.1 DIFERENCIAS ENTRE VIRTUALIZACIÓN Y CLOUD COMPUTING ......................................................................... 300
TABLA 5.2 PATRONES DE ADMINISTRACIÓN DE DATOS ............................................................................................... 320
TABLA 5.3 PATRONES DE DISEÑO E IMPLEMENTACIÓN ................................................................................................ 321
TABLA 5.4 PATRONES DE MENSAJERÍA ..................................................................................................................... 323
TABLA 5.5 OTROS SERVICIOS DE NUBE ..................................................................................................................... 336
xi
Índice de tablas
Índice de ilustraciones
ILUSTRACIÓN 1.1 ARQUITECTURA CLIENTE SERVIDOR .................................................................................................... 48
ILUSTRACIÓN 1.2 ARQUITECTURA CLIENTE-SERVIDOR CON CGI ...................................................................................... 48
ILUSTRACIÓN 1.3 MODELO VISTA CONTROLADOR ........................................................................................................ 51
ILUSTRACIÓN 1.4 INFRAESTRUCTURA WEB TÍPICA......................................................................................................... 53
ILUSTRACIÓN 1.5 EJECUCIÓN DE POWERSHELL............................................................................................................ 62
ILUSTRACIÓN 1.6 COMPATIBILIDAD CON HYPER-V ....................................................................................................... 63
ILUSTRACIÓN 1.7 DESCARGAR DISTRIBUCIÓN A INSTALAR .............................................................................................. 64
ILUSTRACIÓN 1.8 PHP INSTALADO CORRECTAMENTE.................................................................................................... 66
ILUSTRACIÓN 1.9 SELECCIONAR APACHE2 .................................................................................................................. 67
ILUSTRACIÓN 2.1 FORMATO DE ETIQUETA EN XML .................................................................................................... 149
ILUSTRACIÓN 2.2 REFERENCIA PRIVADA DE XML ....................................................................................................... 152
ILUSTRACIÓN 2.3 REFERENCIA PÚBLICA DE XML........................................................................................................ 152
ILUSTRACIÓN 2.4 RESULTADO DE OL OL ................................................................................................................... 167
ILUSTRACIÓN 2.5 RESULTADO DE LA LISTA EN NEGRITAS .............................................................................................. 168
ILUSTRACIÓN 2.6 USO DE MÁRGENES CON CSS ......................................................................................................... 174
ILUSTRACIÓN 2.7 APLICACIÓN DE BORDES ................................................................................................................ 175
ILUSTRACIÓN 2.8 APLICACIÓN DE RELLENO ............................................................................................................... 177
ILUSTRACIÓN 3.1 SALIDA DEL SCRIPT DEL EJEMPLO DE JAVASCRIPT ................................................................................ 181
ILUSTRACIÓN 3.2 USO DE VARIABLES....................................................................................................................... 182
ILUSTRACIÓN 3.3 RESULTADO DE OPERADORES DE JAVASCRIPT .................................................................................... 185
ILUSTRACIÓN 3.4 RESULTADO DE LA FUNCIÓN ........................................................................................................... 187
ILUSTRACIÓN 3.5 SALIDA DEL SCRIPT ÁMBITO DE VARIABLES......................................................................................... 190
ILUSTRACIÓN 3.6 MANEJO DE CADENAS Y ARREGLOS .................................................................................................. 192
ILUSTRACIÓN 3.7 MÉTODOS POP() Y PUSH()............................................................................................................. 194
ILUSTRACIÓN 3.8 CAPTURA DE ERRORES .................................................................................................................. 195
ILUSTRACIÓN 3.9 RESULTADO DEL SCRIPT CON CONDICIÓN SIN ELSE .............................................................................. 199
ILUSTRACIÓN 3.10 CONDICIONAL CON ELSE .............................................................................................................. 200
ILUSTRACIÓN 3.11 RESULTADO DE LA SENTENCIA SWITCH ........................................................................................... 201
ILUSTRACIÓN 3.12 RESULTADO CICLO WHILE ........................................................................................................... 203
ILUSTRACIÓN 3.13 FUNCIONAMIENTO DE EVENT BUBBLING EN MOZILLA ........................................................................ 211
ILUSTRACIÓN 3.14 ESQUEMA DEL FLUJO DEL MODELO DOM EVENT ............................................................................. 212
ILUSTRACIÓN 3.15 VENTANAS EMERGENTES DE JAVASCRIPT ........................................................................................ 224
ILUSTRACIÓN 5.1 TIPOS DE PATRONES DE DISEÑO ...................................................................................................... 304
ILUSTRACIÓN 5.2 PATRÓN DE ACTIVE RECORD .......................................................................................................... 309
xii
Índice de ilustraciones
Planeación del curso
El curso está diseñado para impartirse en dieciséis semanas incluyendo los exámenes que
se realizarán en el último día de la última semana correspondiente al tema.
La semana consta de 1 hora teórica y cuatro horas prácticas de acuerdo con el temario
correspondiente.
Tema Subtema Subtema Subtema Subtema Subtema Subtema Subtema 7 Semanas
1 2 3 4 5 6
xiii
Planeación del curso
Presentación
Caracterización de la asignatura
Esta asignatura aporta al perfil del egresado la capacidad para desarrollar y administrar
software que apoye la productividad y competitividad de las organizaciones cumpliendo con
estándares de calidad, mediante el desarrollo de aplicaciones web utilizando lenguajes de
marcas, de presentación, del lado del cliente, del servidor y con la colaboración de cómputo
en la nube.
Intención didáctica
La asignatura está organizada en cinco temas:
El segundo, aborda los lenguajes de marcado, como lo es HTML, XML en sus versiones
más recientes, de la misma forma se aborda el tema de lenguaje de presentación CSS para la
creación de hojas de estilo en cascada, en donde se obtenga una comprensión de su estructura
y forma de trabajar con los elementos que la integran.
xiv
Planeación del curso
En el cuarto tema, se aborda la programación del lado del servidor en donde se logre la
manipulación de objetos y el acceso a datos para la presentación de procesos dinámicos y sus
resultados en una aplicación web.
xv
Planeación del curso
Introducción
Existen muchos libros que hablan sobre la programación web. La mayoría traen más
información de la que puede ser tratada en un curso de seis meses. En estos apuntes se trató
de incluir aquella información que se consideró más importante para poder concluir el curso
en el tiempo señalado. No se pretende la substitución de la investigación por parte del
estudiante sobre los temas de la materia, más bien, proporcionar un marco que ubique al
estudiante para que, de ser necesario y a partir de ello, tenga una idea clara de los conceptos
clave y luego dirigir su búsqueda en otras fuentes informativas.
También es muy importante que el alumno haya cursado las materias básicas de
programación incluyendo estructuras de datos y programación II. Sin estas bases sería muy
difícil dar seguimiento a las ideas subyacentes de programación web.
Existen muchos temas en los que se recomienda encarecidamente que el alumno haga
programas breves en donde desarrolle los fundamentos de los módulos más comunes de los
que consta un sistema web.
Al mismo tiempo que se enseña la teoría, se recomienda también poner ejemplos sobre el
uso de las interfaces o instrucciones que están directamente involucradas con el tema. En la
mayoría de las unidades se incluyen algunas técnicas de implementación de módulos
comunes en los sistemas web.
Por último, quiero agradecer también a todos aquellos que directa o indirectamente
intervinieron para que este trabajo se hiciera realidad.
xvi
Planeación del curso
Ojalá también este libro sea la base para futuros trabajos y como toda obra humana, el
escrito actual puede aún mejorarse de innumerables formas. Cualquier sugerencia o
aportación será bienvenida.
Espero también que nuestros alumnos hagan uso intensivo de este material como una guía
dentro de su aprendizaje, que al final es el objetivo principal de esta y de todas las obras del
ser humano.
xvii
Planeación del curso
Estructura conceptual
xviii
Planeación del curso
Competencias específicas y genéricas
Competencias genéricas
Introducción
20
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
‘Leonard Kleinrock, del MIT, publicó el primer artículo sobre la teoría de la conmutación
de paquetes en julio de 1961 y el primer libro sobre el tema en 1964. Kleinrock convenció a
Roberts de la viabilidad teórica de las comunicaciones mediante paquetes en lugar de
circuitos, lo que supuso un paso importante en el camino hacia la creación de redes de
computadoras. El otro paso clave era hacer que las computadoras se comunicaran entre sí.
Para ello, en 1965, Roberts, en colaboración con Thomas Merrill, conectó el ordenador TX-
2 de Massachusetts con el Q-32 de California mediante una línea telefónica de baja velocidad,
creando la primera red de computadoras de área amplia (por pequeña que fuera) jamás
construida. El resultado de este experimento fue la constatación de que las computadoras de
tiempo compartido podían trabajar bien juntos, ejecutando programas y recuperando datos
según fuera necesario en la máquina remota, pero que el sistema telefónico de conmutación
de circuitos era totalmente inadecuado para el trabajo. La convicción de Kleinrock sobre la
necesidad de la conmutación de paquetes se confirmó. A finales de 1966, Roberts se dirigió
a DARPA para desarrollar el concepto de red computadoras y elaboró rápidamente su plan
para la "ARPANET", publicándolo en 1967. En la conferencia en la que presentó el
documento, también había un documento sobre un concepto de red de paquetes del Reino
21
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
Unido por Donald Davies y Roger Scantlebury del NPL. Scantlebury le habló a Roberts del
trabajo del NPL, así como del de Paul Baran y otros de la RAND. El grupo RAND había
escrito un documento sobre redes de conmutación de paquetes para seguridad de voz en el
ejército en 1964. Resulta que los trabajos del MIT (1961-1967), de RAND (1962-1965) y del
NPL (1964-1967) se desarrollaron en paralelo sin que ninguno de los investigadores supiera
nada de los otros trabajos. La palabra "paquete" se adoptó a partir del trabajo del NPL y la
velocidad de línea propuesta para el diseño de ARPANET pasó de 2,4 kbps a 50 kbps.5 En
agosto de 1968, después de que Roberts y la comunidad financiada por DARPA hubieran
perfeccionado la estructura general y las especificaciones de ARPANET, DARPA publicó
una solicitud de ofertas para el desarrollo de uno de los componentes clave, los conmutadores
de paquetes denominados procesadores de mensajes de interfaz (IMP). Mientras el equipo de
BBN trabajaba en los IMP, con Bob Kahn desempeñando un papel importante en el diseño
arquitectónico general de ARPANET, la topología y la economía de la red fueron diseñadas
y optimizadas por Roberts trabajando con Howard Frank y su equipo de Network Analysis
Corporation, y el sistema de medición de la red fue preparado por el equipo de Kleinrock en
la UCLA. Debido al temprano desarrollo de Kleinrock de la teoría de la conmutación de
paquetes y a su enfoque en el análisis, el diseño y la medición, su Centro de Medición de
Redes en la UCLA fue seleccionado para ser el primer nodo de la ARPANET. Todo ello se
materializó en septiembre de 1969, cuando BBN instaló el primer IMP en la UCLA y se
conectó el primer ordenador central. El proyecto de Doug Engelbart sobre "Aumento del
intelecto humano" (que incluía NLS, un primer sistema de hipertexto) en el Stanford
Research Institute (SRI) proporcionó un segundo nodo. El SRI apoyó el Centro de
Información de Redes, dirigido por Elizabeth (Jake) Feinler y que incluía funciones como el
mantenimiento de tablas de mapeo de nombres de host a direcciones, así como un directorio
de RFC's.
‘Un mes después, cuando el SRI se conectó a la ARPANET, se envió el primer mensaje
de host a host desde el laboratorio de Kleinrock al SRI. Se añadieron dos nodos más en la
UC Santa Barbara y en la Universidad de Utah. Estos dos últimos nodos incorporaron
proyectos de visualización de aplicaciones, con Glen Culler y Burton Fried en la UCSB
investigando métodos para la visualización de funciones matemáticas utilizando pantallas de
22
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
‘En octubre de 1972, Kahn organizó una gran demostración de ARPANET, que tuvo
mucho éxito, en la Conferencia Internacional de Comunicaciones de Computadoras (ICCC).
Esta fue la primera demostración pública de esta nueva tecnología de red al público. También
fue en 1972 cuando se presentó la primera aplicación "caliente", el correo electrónico. En
marzo, Ray Tomlinson, de BBN, escribió el software básico de envío y lectura de mensajes
de correo electrónico, motivado por la necesidad de los desarrolladores de ARPANET de
contar con un mecanismo de coordinación sencillo. En julio, Roberts amplió su utilidad
escribiendo el primer programa de utilidad de correo electrónico para listar, leer
selectivamente, archivar, reenviar y responder a los mensajes. A partir de ahí, el correo
electrónico despegó como la mayor aplicación de red durante más de una década. Esto fue
un presagio del tipo de actividad que vemos en la World Wide Web, es decir, el enorme
crecimiento de todo tipo de tráfico "de persona a persona".
‘La ARPANET original se convirtió en Internet. Internet se basó en la idea de que habría
múltiples redes independientes de diseño más bien arbitrario, empezando por ARPANET
como red pionera de conmutación de paquetes, pero que pronto incluiría redes de satélites de
paquetes, redes de radio de paquetes en tierra y otras redes. Internet, tal y como la conocemos
23
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
ahora, encarna una idea técnica clave, la de las redes de arquitectura abierta. En este enfoque,
la elección de cualquier tecnología de red individual no estaba dictada por una arquitectura
de red concreta, sino que un proveedor podía seleccionarla libremente y hacerla funcionar
con las demás redes a través de una "arquitectura de interconexión" de meta nivel. Hasta
entonces sólo existía un método general para federar redes. Se trataba del método tradicional
de conmutación de circuitos, en el que las redes se interconectaban a nivel de circuito,
pasando bits individuales de forma sincrónica a lo largo de una parte de un circuito de
extremo a extremo entre un par de ubicaciones finales. Recordemos que Kleinrock había
demostrado en 1961 que la conmutación de paquetes era un método de conmutación más
eficaz. Junto con la conmutación de paquetes, los acuerdos de interconexión para fines
especiales entre redes eran otra posibilidad. Aunque había otras formas limitadas de
interconectar diferentes redes, requerían que una se utilizara como componente de la otra, en
lugar de actuar como par de la otra para ofrecer un servicio de extremo a extremo.
‘En una red de arquitectura abierta, las redes individuales pueden diseñarse y desarrollarse
por separado y cada una de ellas puede tener su propia interfaz única que puede ofrecer a los
usuarios y/o a otros proveedores. incluidos otros proveedores de Internet. Cada red puede
diseñarse de acuerdo con el entorno específico y los requisitos de los usuarios de esa red. Por
lo general, no hay limitaciones en cuanto a los tipos de red que pueden incluirse o en su
alcance geográfico, aunque ciertas consideraciones pragmáticas dictarán lo que tiene sentido
ofrecer.
‘La idea de las redes de arquitectura abierta fue introducida por primera vez por Kahn
poco después de haber llegado a DARPA en 1972. Este trabajo formaba parte originalmente
del programa de radiocomunicación por paquetes, pero posteriormente se convirtió en un
programa independiente por derecho propio. En aquella época, el programa se llamaba
"Internetting". La clave para que el sistema de paquetes de radio funcionara era un protocolo
de extremo fiable que pudiera mantener una comunicación eficaz frente a las interferencias
de radio o soportar apagones intermitentes como los causados por estar en un túnel o
bloqueados por el terreno local. Kahn pensó primero en desarrollar un protocolo local sólo
24
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
para la red de paquetes de radio, ya que así evitaría tener que lidiar con la multitud de sistemas
operativos diferentes, y seguir utilizando el NCP.
‘Sin embargo, NCP no tenía la capacidad de dirigirse a redes (y máquinas) más allá de un
PDI de destino en la ARPANET y, por tanto, también sería necesario realizar algún cambio
en NCP. (Se suponía que ARPANET no era modificable en este sentido). NCP dependía de
ARPANET para proporcionar fiabilidad de extremo a extremo. Si se perdía algún paquete,
el protocolo (y presumiblemente las aplicaciones que soportaba) se paralizaba. En este
modelo, NCP no tenía control de errores de extremo a extremo, ya que ARPANET iba a ser
la única red existente y sería tan fiable que no sería necesario ningún control de errores por
parte de los hosts. Así, Kahn decidió desarrollar una nueva versión del protocolo que pudiera
satisfacer las necesidades de un entorno de red de arquitectura abierta. Este protocolo
acabaría llamándose Protocolo de Control de Transmisión/Protocolo de Internet (TCP/IP).
Mientras que NCP tendía a actuar como un controlador de dispositivos, el nuevo protocolo
sería más bien un protocolo de comunicaciones.
1. Algoritmos para evitar que los paquetes perdidos inhabiliten las comunicaciones
de forma permanente y permitir que se retransmitan con éxito desde el origen;
2. Proporcionar "canalización" de host a host para que varios paquetes puedan ir del
origen al destino a discreción de los hosts participantes, si las redes intermedias lo
permiten;
‘La interacción fue muy productiva y la primera versión escrita del enfoque resultante se
distribuyó en una reunión especial del Grupo de Trabajo de la Red Internacional (INWG)
que se había creado en una conferencia en la Universidad de Sussex en septiembre de 1973.
Cerf había sido invitado a presidir este grupo y aprovechó la ocasión para celebrar una
reunión de los miembros del INWG que estaban fuertemente representados en la conferencia
de Sussex. De esta colaboración entre Kahn y Cerf surgieron algunos planteamientos básicos:
26
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
‘El documento original de Cerf/Kahn sobre Internet describía un protocolo, llamado TCP,
que proporcionaba todos los servicios de transporte y reenvío en Internet. Kahn pretendía
que el protocolo TCP soportara una serie de servicios de transporte, desde la entrega
secuenciada de datos totalmente fiable (modelo de circuito virtual) hasta un servicio de
datagramas en el que la aplicación hiciera un uso directo del servicio de red subyacente, lo
que podría implicar la pérdida ocasional de paquetes, corruptos o reordenados. Sin embargo,
el esfuerzo inicial para implementar TCP resultó en una versión que sólo permitía circuitos
virtuales. Este modelo funcionaba bien para la transferencia de archivos y las aplicaciones
de inicio de sesión remoto, pero algunos de los primeros trabajos sobre aplicaciones de red
avanzadas, en particular la voz por paquetes en la década de 1970, dejaron claro que en
algunos casos las pérdidas de paquetes no debían ser corregidas por TCP, sino que debían
dejarse en manos de la aplicación. Esto condujo a una reorganización del TCP original en
dos protocolos, el simple IP, que sólo proporcionaba el direccionamiento y el reenvío de
paquetes individuales, y el TCP separado, que se ocupaba de características de servicio como
el control de flujo y la recuperación de paquetes perdidos. Para aquellas aplicaciones que no
querían los servicios de TCP, se añadió una alternativa llamada Protocolo de Datagramas de
Usuario (UDP) para proporcionar acceso directo al servicio básico de IP.
27
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
‘Una de las principales motivaciones iniciales tanto de ARPANET como de Internet fue
la compartición de recursos: por ejemplo, permitir a los usuarios de las redes de
radiocomunicación por paquetes acceder a los sistemas de tiempo compartido conectados a
ARPANET. Conectar ambas redes resultaba mucho más económico que duplicar estos
costosos ordenadores. Sin embargo, aunque la transferencia de archivos y el inicio de sesión
remoto (Telnet) fueron aplicaciones muy importantes, el correo electrónico ha tenido
probablemente el impacto más significativo de las innovaciones de esa época. El correo
electrónico proporcionó un nuevo modelo de cómo la gente podía comunicarse entre sí, y
cambió la naturaleza de la colaboración, primero en la construcción de la propia Internet
(como se discute más adelante) y más tarde para gran parte de la sociedad. Hubo otras
aplicaciones propuestas en los primeros días de Internet, incluyendo la comunicación de voz
basada en paquetes (el precursor de la telefonía de Internet), varios modelos de intercambio
de archivos y discos, y los primeros programas de "gusanos" que mostraron el concepto de
agentes (y, por supuesto, los virus). Un concepto clave de Internet es que no se diseñó para
una sola aplicación, sino como una infraestructura general sobre la que podían concebirse
nuevas aplicaciones, como se ilustró posteriormente con la aparición de la World Wide Web.
Es la naturaleza de propósito general del servicio proporcionado por TCP e IP lo que hace
esto posible.
de HEPNet. Los físicos espaciales de la NASA siguieron con SPAN, y Rick Adrion, David
Farber y Larry Landweber crearon CSNET para la comunidad (académica e industrial) de las
ciencias de la computación con una subvención inicial de la Fundación Nacional de la
Ciencia (NSF) de Estados Unidos. La difusión libre del sistema operativo UNIX por parte de
AT&T dio lugar a USENET, basada en los protocolos de comunicación UUCP incorporados
en UNIX, y en 1981 Ira Fuchs y Greydon Freeman idearon BITNET, que conectaba las
computadoras centrales académicas en un paradigma de "correo electrónico como imágenes
de tarjetas".
‘En 1985, Dennis Jennings vino de Irlanda para pasar un año en la NSF dirigiendo el
programa NSFNET. Trabajó con la comunidad para ayudar a la NSF a tomar una decisión
crítica: que TCP/IP fuera obligatorio para el programa NSFNET. Cuando Steve Wolff se hizo
cargo del programa NSFNET en 1986, reconoció la necesidad de una infraestructura de red
de área amplia para apoyar a la comunidad académica y de investigación en general, junto
con la necesidad de desarrollar una estrategia para establecer dicha infraestructura sobre una
base en última instancia independiente de la financiación federal directa. Se adoptaron
políticas y estrategias (véase más adelante) para lograr ese fin.
‘La NSF también optó por apoyar la infraestructura organizativa de Internet existente en
DARPA, organizada jerárquicamente bajo la (entonces) Junta de Actividades de Internet
29
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
(IAB). La declaración pública de esta elección fue la autoría conjunta de los Grupos de
Trabajo de Ingeniería y Arquitectura de Internet del IAB y del Grupo de Asesoramiento
Técnico de Redes de la NSF de la RFC 985 (Requirements for Internet Gateways), que
aseguraba formalmente la interoperabilidad de las partes de Internet de DARPA y NSF.
2. Para coordinar este intercambio, se creó el Consejo Federal de Redes. La FNC también
cooperó con otras organizaciones internacionales, como RARE en Europa, a través
del Comité de Coordinación de Redes de Investigación Intercontinentales, CCIRN,
para coordinar el apoyo de Internet a la comunidad investigadora en todo el mundo.
30
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
‘El backbone había hecho la transición de una red construida con routers de la comunidad
investigadora (los routers "Fuzzball" de David Mills) a equipos comerciales. En sus 8 años y
medio de vida, la red troncal había pasado de seis nodos con enlaces de 56 kbps a 21 nodos
con múltiples enlaces de 45 Mbps. Había visto crecer Internet hasta alcanzar más de 50.000
31
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
redes en los siete continentes y el espacio exterior, con aproximadamente 29.000 redes en
Estados Unidos.
‘Tal fue el peso del ecumenismo y la financiación del programa NSFNET (200 millones
de dólares de 1986 a 1995) - y la calidad de los propios protocolos - que, en 1990, cuando la
propia ARPANET fue finalmente desmantelada, el TCP/IP había suplantado o marginado a
la mayoría de los demás protocolos de redes informáticas de área amplia en todo el mundo,
y el IP iba camino de convertirse en el servicio portador de la Infraestructura Global de la
Información.
32
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
(y lo que aún no funcionaba) y los inventores se alegraron de escuchar nuevos problemas que
no habían considerado, pero que estaban siendo descubiertos por los vendedores en el campo.
33
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
‘A medida que la red crecía, se hizo evidente que los procedimientos ad hoc utilizados en
algún momento para gestionar la red no podrían ampliarse. La configuración manual de las
tablas se sustituyó por algoritmos automatizados distribuidos, y se idearon mejores
herramientas para aislar los fallos. En 1987 quedó claro que se necesitaba un protocolo que
permitiera gestionar a distancia los elementos de la red, como los routers, de manera
uniforme. Se propusieron varios protocolos para este fin, entre ellos el Simple Network
Management Protocol o SNMP (diseñado, como su nombre indica, para la simplicidad, y
derivado de una propuesta anterior llamada SGMP), HEMS (un diseño más complejo de la
comunidad de investigadores) y CMIP (de la comunidad OSI). En una serie de reuniones se
decidió que HEMS se retiraría como candidato a la normalización, para ayudar a resolver el
conflicto, pero que se seguiría trabajando tanto en SNMP como en CMIP, con la idea de que
el SNMP podría ser un sistema más solución a corto plazo y el CMIP un enfoque a más largo
plazo. El mercado podría elegir la que le pareciera más adecuado. En la actualidad, SNMP
se utiliza de forma casi universal para la gestión basada en la red.
‘En los últimos años hemos asistido a una nueva fase de comercialización. Al principio,
los esfuerzos comerciales comprendían principalmente a los vendedores que proporcionaban
los productos básicos de red, y a los proveedores de servicios que ofrecían la conectividad y
los servicios básicos de Internet. Ahora Internet se ha convertido casi en un servicio "básico",
y gran parte de la atención más reciente se ha centrado en el uso de esta infraestructura global
de información para apoyar otros servicios comerciales. Esto se ha visto tremendamente
acelerado por la adopción generalizada y rápida de los navegadores y la tecnología de la
World Wide Web, que permite a los usuarios acceder fácilmente a la información conectada
en todo el mundo. Existen productos que facilitan el suministro de esa información y muchos
de los últimos desarrollos tecnológicos se han orientado a proporcionar servicios de
información cada vez más sofisticados, además de las comunicaciones básicas de datos por
Internet’. (Leiner, y otros, 1997, págs. 3-11,15-16).
34
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
Un desarrollador debe seguir sólo tres simples pasos para obtener una aplicación web /
sitio de trabajo: (Plitnichenko, 2019)
Con el desarrollo de la web, los requisitos de una plataforma web eran cada vez más
complejos. Codificar cada cosa manualmente llevaba mucho tiempo. Los desarrolladores de
JavaScript necesitaban literalmente reinventar la rueda en cada nuevo proyecto.
Ember 2011 Framework Diseñado para crear un SPA escalable con las mejores
prácticas.
En 2020, cada reto importante al que se enfrenta un desarrollador web implica una
herramienta personalizada para resolver el problema, es decir:
¿Qué tecnologías parecen ser la tendencia para 2020? El informe basado en los datos de
Stack Overflow ha definido a los ganadores:
1. React;
2. Angular;
3. jQuery.
Como se puede ver, Angular y React son dos de los más utilizados en la actualidad, lo que
ha desencadenado múltiples discusiones para saber cuál es el mejor.
Por supuesto, estos lenguajes no pueden hacer mucho sin un lenguaje de scripting del lado
del servidor que los acompañe.
Un servidor de páginas web proporciona archivos de texto con etiquetas HTML que
interpreta un navegador. Si se requería hacer algo más que proporcionar archivos, se tenía
que escribir el propio servidor web. Naturalmente, era tremendamente incómodo, los
principales proveedores de servidores web idearon APIs para hacer sus productos más
extensibles. Sin embargo, desarrollar sitios web dinámicos con ellas habría sido casi igual de
lento: programar en C o C++, recompilar, parar y reiniciar el servidor y, por supuesto, depurar
en memoria era extremadamente tedioso, más si hablamos de programas multihilo para
mejorar el rendimiento.
En algún momento, algunas personas consideraron que esta situación exigía demasiado
esfuerzo para objetivos triviales, y crearon una forma para que lo que eventualmente se
37
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
A medida que los sitios web se hacían más sofisticados, la gente se daba cuenta de que
copiaba y pegaba muchos de los mismos contenidos. El mantenimiento de estos contenidos
habría sido una pesadilla, al tener que buscar constantemente enlaces rotos, errores
tipográficos y pequeñas incongruencias. La solución llegó con la idea de los server-side
includes, que permitían a los autores llamar a otros archivos del servidor web. De esta forma,
se podían guardar trozos de contenido en un único lugar y mandarlos a traer. Además, se
podía hacer referencia a los programas CGI y entrelazar su salida directamente en el HTML.
Esto era una ventaja especial, como puede decir cualquiera que haya hecho aplicaciones CGI
a mano.
38
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
5. En 2005, Ruby es otro lenguaje del lado del servidor con muchas funcionalidades,
específicamente con el marco de trabajo Ruby On Rails (RoR).
7. En 2009, Ryan Dahl creó algo que crearía un efecto dominó de nuevos desarrolladores.
Creó una forma de escribir JavaScript que lo ejecutara como un lenguaje del lado del
servidor. Este lenguaje de programación se conoce como NodeJS, y rápidamente se
hizo popular y muy utilizado. (technotoken, 2021)
8. En 2011, Taylor Otwell lanzó un nuevo marco de trabajo llamado Laravel, que se
disparó en popularidad durante el siguiente par de años y sigue siendo muy popular
hoy en día, PHP comenzó un rápido regreso en la comunidad de desarrollo web.
Aunque la llegada del CGI permitió una enorme innovación a un coste insignificante,
no fue la única parte de la infraestructura conceptual de la Web que evolucionó. Para los
que insistían en gastar grandes sumas de dinero en proyectos informáticos, había
soluciones empresariales a la altura. Al mismo tiempo que evolucionaba el paradigma de
la incrustación de código en HTML, lo hacía el de la API del servidor, en forma de
servidor de aplicaciones.
En esta configuración, era inconcebible andar dando vueltas con archivos individuales
e intentando mantenerlos sincronizados en varios servidores de aplicaciones. Lo que
exigía era meter toda una aplicación web en un paquete monolítico para que pudiera ser
empujado al clúster en una sola pieza. Al mismo tiempo, los archivos del paquete no se
correspondían necesariamente con las páginas del sitio web, sino que se generaban sobre
la marcha, al igual que las API del servidor. El ejemplo más destacado de estos paquetes
es probablemente el servlet Java, para el que casi todas las grandes empresas de software,
clubes y otros tienen su propia marca de servidor de aplicaciones. Excepto Microsoft, por
supuesto, que tiene [Link], que es su versión propietaria de básicamente lo mismo.
Ahora nos encontramos flotando en un mar de productos, en todos los puntos de lo que
se conoce como pila (stack). La pila comienza con el sistema operativo y/o la máquina
virtual, luego pasa por el servidor web, el almacén de datos, el lenguaje de programación
de aplicaciones, el marco de trabajo de las aplicaciones y, por último, el sistema de gestión
de contenidos, en el que se puede incluir las plataformas de blogs, wikis y redes sociales.
Si se elige un producto en cualquier lugar de esta pila, se observa que se solapa en gran
40
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
medida con casi todos los demás productos de su categoría, y que los pocos
comportamientos únicos que ofrece, los hace de forma sorprendentemente incompatible.
Mezclar y combinar pequeños trozos de funcionalidad no es económico, así que se escribe
lo propio; todavía no existe el Lego Web. Esta incompatibilidad ha tenido un respiro con
la llegada de los servicios web y los objetos de JavaScript que se aventuran a superar la
sofisticación de los bloggers, aunque crean su propia colección de problemas.
Ah, ¿y qué hay de las docenas de cuentas que todo el mundo acaba registrando para
interactuar con todos estos productos, como usuarios, propietarios de sitios y
desarrolladores? ¿Gestión de identidades federadas? Se está acercando, pero aún falta mucho.
Lo interesante de todo este desarrollo reciente en la Web es que realmente enreda las
relaciones comerciales con las tecnológicas. Luego toma ese desorden y lo expone para que
todo el mundo lo vea. Esto significa que tu relación con tus clientes puede verse afectada con
demasiada facilidad por la relación de otra persona con uno de tus proveedores. Posiblemente
siempre ha sido así, pero no hasta el punto de depender de dos docenas de empresas diferentes
para que tu sitio funcione como es debido, cada vez que alguien carga una página. Es posible
que la interdependencia sea algo bueno, pero lo que tenemos actualmente es sólo
dependencia. Lo que se busca es que los sistemas sean un poco más robustos que estar sujetos
al capricho de un proveedor en particular, o del proveedor de un proveedor. Además, si hay
un problema con alguno de ellos, el dueño del sitio debería enterarse primero.
41
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
En su forma más cruda, la web no tiene estado, es anónima y está muy poco acoplada.
Esto significa que cualquier cosa que pueda entender HTTP y HTML también puede mover
información de un lado a otro y navegar entre recursos. La encarnación actual del protocolo
se diseñó explícitamente para aprovechar al máximo la negociación de contenidos, el
almacenamiento en caché y los proxies. El contenido fue concebido para ser transformado,
filtrado, cortado y demás. Parece que nos hemos olvidado de gran parte de esta funcionalidad,
y sólo nos aventuramos en ella cuando la situación lo exige de forma incontestable. Hoy en
día, muchos sitios simplemente no funcionan fuera de un navegador convencional con
cookies y JavaScript activados.
Muchas API, incluso las que dicen ser RESTful, hacen poco más que proporcionar la
misma información que la que hay en las páginas, o la misma funcionalidad que el envío de
ciertos formularios en un sitio determinado. Lo hacen dentro de una caja de arena de claves
de API, apretones de manos criptográficos dudosos y limitación de velocidad. Luego exigen
la creación de envoltorios para traducir sus barrocas entrañas en bibliotecas de software
utilizables, una para cada lenguaje de programación. Se supone que el beneficio de esto es el
acceso a un conducto de datos fiables y legibles por la máquina.
La cuestión es que los datos, sean los que sean, ya están en la página. Puedes ir a buscarlos
visitando su URI. Luego puedes extraerlos con las herramientas que consideres oportunas.
¿No te gusta la sobrecarga del HTML superfluo, o temes que un cambio en el diseño torpedee
tu canal de datos? Pues bien, se puede proporcionar una variante de los mismos datos que sea
más fácil de procesar y colocarla más o menos en la misma dirección. Algunas empresas lo
hacen, pero sólo unas pocas. Twitter es uno de ellos. Además de abrirse a los desarrolladores
de terceros, parece que utilizan su API para impulsar su propio sitio. También proporcionan
una opción para utilizar la autenticación HTTP sin estado, sin cookies, secretos compartidos
o criptografía falsa.
El problema es que las representaciones de los objetos de datos que hacen las máquinas
son sus representaciones. Tienen su propia comprensión idiosincrática de lo que es un objeto
de usuario, por ejemplo. Aunque suministren los datos en una sintaxis neutral para el
proveedor, como XML o JSON, se tiene que traducir la semántica de lo que significa cada
42
Introducción a las aplicaciones web
1.1. Evolución de las aplicaciones web
campo a la representación interna que use el desarrollador. Esto significa que no se puede
simplemente transportar los datos desde Twitter, o cualquier otro proveedor de API, con una
interfaz de datos genérica. Se tiene que escribir una capa adicional de código, específica para
ellos. Esta es la diferencia entre escribir un adaptador para todos los sitios web, y escribir uno
para cada sitio que sea necesario para la aplicación.
Un sitio no es como una carpeta llena de archivos en un servidor, ni como una aplicación
monolítica en la nube, sino como una colección de recursos potencialmente dispares bajo la
gestión de una entidad empresarial concreta. Cualquier recurso en la web puede apuntar y
utilizar cualquier otro recurso en cualquier otro lugar con el mismo esfuerzo. Incluso puede
hacerlo a través de los límites de la organización, a menos que la organización de destino se
niegue a cooperar, que sería extraño, ya que la organización en cuestión suele salir ganando
en conjunto con lo que se ha convertido en una forma de referencia perfectamente natural
que llamamos enlace.
Lo que se busca es un sistema que es, en cierto modo, un conducto de información tanto
como un origen, que interactúa en gran medida con otros sistemas basados en la web, pero
no confía completamente en ninguno de ellos. Funciona con todos los clientes, no sólo con
los últimos navegadores, donde funciona como "puede consumir contenidos, seguir enlaces
y enviar datos". No depende de mecanismos de estado o código del lado del cliente, como
cookies o JavaScript, aunque puede utilizarlos para aumentar la experiencia. Es amigable y
próxima a los robots y motores de búsqueda, aunque resistente al abuso. Transmite datos
hacia y desde terceros, pero mantiene su posición entre sus usuarios y otras entidades para
garantizar que puede cumplir sus promesas. Registra cada clic para un análisis estadístico
más completo. Cada dato se representa en una estructura semántica para cada representación
capaz de hacerlo, y cada URI se duplica efectivamente como un punto final de la API. Una
parte podría residir en la nube, mientras que otra podría vivir fácilmente en su oficina o en o
en un centro de datos.
43
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
1. Mantenibilidad
2. Reutilización
3. Escalabilidad
4. Robustez
5. Seguridad
Esta sección contiene una serie de temas que ayudarán a comprender los fundamentos de
la arquitectura y el diseño. Comienza describiendo qué es la arquitectura de software y por
qué es importante. Discute los temas generales que debes considerar, como los requisitos y
las restricciones y la intersección entre el usuario, el negocio y el sistema en el que se
ejecutará la aplicación. A continuación, se describen principios clave de diseño y los patrones
44
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
y estilos arquitectónicos que se utilizan hoy en día. Por último, se ofrece una visión del
enfoque que debe seguir al diseñar su arquitectura.
Philippe Kruchten, Grady Booch, Kurt Bittner y Rich Reitman derivaron y refinaron una
definición de arquitectura basada en el trabajo de Mary Shaw y David Garlan (Shaw y Garlan
1996). Su definición es:
El desarrollo de un sistema basado en la web supone mucho más trabajo para un ingeniero
de software que el desarrollo de software tradicional. El ciclo de vida de un sistema web, el
proceso de desarrollo, el seguimiento y el mantenimiento son algunos conceptos que difieren
significativamente en la ingeniería de software clásica. Es comprensible que los métodos de
desarrollo tradicionales no sean adecuados para los sistemas basados en la web, y por qué
suelen necesitar correcciones y extensiones para hacerlos utilizables para el desarrollo web.
46
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
2. Acceso centralizado a los datos. Como los datos se almacenan sólo en el servidor, el
acceso y las actualizaciones a los datos son mucho más fáciles de administrar que en
otros estilos arquitectónicos.
47
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
48
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
Gracias a este sencillo mecanismo, las páginas web, que hasta el momento de la aparición
de CGI tenían unos contenidos estáticos e inmutables, son generadas dinámicamente en
respuesta a peticiones concretas. Se abre así un nuevo mundo a los programadores de
aplicaciones web. Estudiaremos a continuación el API de CGI, el cual ha quedado relegado
en muchos casos a un papel secundario, pues adolece de muchos problemas, siendo la falta
de rendimiento el más destacado de todos.
1. Método GET. El método GET pasa toda la información (excepto archivos) al CGI en
la línea de dirección de la petición HTTP.
Una vez recibe una petición que debe dirigir a un archivo CGI, el servidor ejecuta este
programa, el CGI, y recibe la información a través de variables de entorno (o a través de la
entrada estándar, si fuese pertinente). Algunas de las variables de entorno definidas por el
estándar CGI son:
49
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
2. Se separan los parámetros (que siempre van en pares nombre, valor) mediante el
caracter &. En algunos casos se acepta el carácter; como sustituto para la separación.
Los caracteres no alfanuméricos y los caracteres especiales, como los usados para
codificación (+, etc.), se representan de la forma %HH, donde HH representa el
valor hexadecimal del código ASCII del carácter.
Algunos servidores web añaden datos extra al entorno. La mayoría de estas variables
adicionales empiezan con HTTP_ para evitar conflictos con versiones posteriores del
estándar.
50
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
Los CGI deben responder a las peticiones construyendo ellos mismos parte de la respuesta
HTTP que recibirá el cliente. Es decir, deben indicar, en primer lugar, el tipo MIME del
contenido que sirven. Pueden añadir posteriormente algunos campos adicionales (los
especificados en el estándar HTTP). Después de una línea en blanco separadora, debe
aparecer el contenido.
Actualmente este método casi no se utiliza, pero el estándar se sigue respetando. Por
ejemplo, PHP que significa PHP: Hypertext Preprocessor. Es rápido, interpretado, orientado
a objetos y multiplataforma y tiene disponibles una gran cantidad de librerías y se utiliza para
aprender a programar o para desarrollar aplicaciones web complejas. Además de que todo su
entorno es de código libre. Se usa conjuntamente con Linux, Apache y MySQL o Postgres
SQL dando lugar al acrónimo LAMP. Comúnmente al servidor Apache se le integra un
módulo propio que permite a las aplicaciones escritas en PHP resulten mucho más rápidas
que las aplicaciones CGI. (Mateu, 2004)
Una versión revisada del mismo fue implementada en Smalltalk-80, con su nuevo nombre,
MVC.
51
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
El patrón de diseño MVC asigna uno de los tres papeles diferentes a un objeto en una
aplicación. Estos roles son: modelo, vista y controlador. Esta asignación define no sólo el
papel de un objeto, sino también la forma en que puede comunicarse con otros objetos. Un
grupo de objetos MVC similares suele llamarse capa; por ejemplo, un grupo de modelos se
llama capa de modelos.
El MVC tiene muchas ventajas para el desarrollo web. Los objetos de las aplicaciones
basadas en MVC son más reutilizables; sus interfaces se definen con mayor precisión, y la
aplicación es mucho más ampliable que otras aplicaciones.
Modelo. El modelo encapsula los datos específicos de una aplicación y define la lógica y
el proceso computacional que modifica, manipula o procesa estos datos.
Un objeto modelo puede, obviamente, conectarse a otro modelo, con relaciones uno-uno
o uno-muchos. Los objetos modelo representan conocimientos y la experiencia relacionados
con un dominio específico, por lo que pueden volver a utilizarse en el futuro si hay que
resolver problemas similares.
Por lo general, un objeto modelo no tiene una conexión directa con los objetos de la vista.
Este es un requisito importante, ya que los datos y la vista suelen estar en estrecha relación.
Los objetos de vista presentan datos, aunque un objeto de vista permite actualizar o modificar
estos datos en una interfaz de usuario. Sin embargo, el proceso correcto es que las
operaciones en la capa de vista, que crean o modifican datos, se comunican a través de un
objeto controlador y dan lugar a la creación o actualización de un objeto modelo. En el
sentido inverso, la situación es la misma, cuando un objeto modelo cambia (es decir, los datos
llegan a través de la conexión de red), éste notifica a un objeto controlador, que actualiza el
objeto vista correspondiente.
Vista. Un objeto vista es un objeto que los usuarios pueden ver en su aplicación. La vista
sabe cómo reaccionar con las acciones del usuario y cómo dibujarse a sí mismo. El principal
propósito de los objetos vista es mostrar los datos de los objetos modelo y hacer que sea
posible editar esos datos. A pesar de esto, el objeto vista no está en relación directa con
objetos modelo en la aplicación MVC.
52
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
Los objetos de vista reciben información sobre los cambios en los datos del modelo a
través de los objetos controlador y comunican las acciones iniciadas por el usuario (por
ejemplo, una dirección de correo electrónico introducida en un campo de texto) a través del
controlador a los objetos modelo.
La solicitud llega a nuestro balanceador de carga, que elige por algún algoritmo como
Round-Robin, uno de los n servidores web que tiene el sitio en ese momento para procesar
la solicitud. El servidor web busca alguna información sobre la imagen en nuestro servicio
de caché y obtiene el resto de los datos de la base de datos.
El servidor ahora renderiza la vista como HTML y la envía de vuelta al navegador del
usuario, pasando primero por el balanceador de carga. La página contiene activos JavaScript
y CSS que se cargan del sistema de almacenamiento en la nube, que está conectado a nuestra
CDN, por lo que el navegador del usuario se pone en contacto con la CDN para recuperar el
contenido. Por último, el navegador muestra la página para que el usuario la vea.
[Link] DNS
‘DNS son las siglas de "Domain Name System" (Sistema de Nombres de Dominio) y es
una tecnología troncal que hace posible la World Wide Web. En el nivel más básico, el DNS
proporciona una búsqueda clave/valor de un nombre de dominio (por ejemplo, [Link])
a una dirección IP (por ejemplo, [Link]), que es necesaria para que la computadora
dirija una solicitud al servidor apropiado. Haciendo una analogía con los números de
teléfono, la diferencia entre un nombre de dominio y una dirección IP es la diferencia entre
"llamar a Juan Pérez" y "llamar al 201-867-5309". Al igual que antes se necesitaba una guía
telefónica para buscar el número de Juan, se necesita el DNS para buscar la dirección IP de
un dominio. Así que se puede pensar en el DNS como la guía telefónica de Internet.
‘Antes de entrar en detalles sobre el balanceo de carga, tenemos que dar un paso atrás para
discutir el escalado de aplicaciones horizontal vs. vertical. ¿Qué son y cuál es la diferencia?
Dicho de forma muy sencilla en este post de StackOverflow, el escalado horizontal significa
que se escala añadiendo más máquinas al conjunto de recursos, mientras que el escalado
"vertical" significa que se escala añadiendo más potencia (por ejemplo, CPU, RAM) a una
máquina existente.
54
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
‘En el desarrollo web, (casi) siempre se quiere escalar horizontalmente porque, para
simplificar, las cosas se rompen, los servidores se caen al azar. Las redes se degradan. Centros
de datos enteros se desconectan ocasionalmente. Tener más de un servidor permite planificar
las interrupciones para que la aplicación siga funcionando. En otras palabras, la aplicación
es "tolerante a fallos". En segundo lugar, el escalado horizontal permite acoplar mínimamente
diferentes partes del backend de su aplicación (servidor web, base de datos, servicio X, etc.)
haciendo que cada una de ellas se ejecute en diferentes servidores. Por último, se puede llegar
a una escala en la que ya no sea posible escalar verticalmente. No hay ninguna computadora
en el mundo lo suficientemente grande como para realizar todos los cálculos de la aplicación.
En la plataforma de búsqueda de Google como ejemplo por excelencia, aunque esto se aplica
a empresas a escalas mucho más pequeñas. Algunas empresas, por ejemplo, ejecutan entre
150 y 400 instancias AWS EC2 en un momento dado. Sería un reto proporcionar toda esa
potencia de cálculo a través del escalado vertical.
‘Los balanceadores de carga hacen posible el escalado horizontal. Dirigen las solicitudes
entrantes a uno de los muchos servidores de aplicaciones que suelen ser clones / imágenes en
espejo de cada uno y envían la respuesta del servidor de aplicaciones de vuelta al cliente.
Cualquiera de ellos debería procesar la solicitud de la misma manera, así que sólo es cuestión
de distribuir las solicitudes entre el conjunto de servidores para que ninguno de ellos esté
sobrecargado.
‘A alto nivel, los servidores de aplicaciones web son relativamente sencillos de describir.
Ejecutan la lógica de negocio principal que maneja la solicitud de un usuario y devuelve el
HTML al navegador del usuario. Para hacer su trabajo, normalmente se comunican con una
variedad de infraestructura de backend como bases de datos, capas de caché, colas de trabajo,
servicios de búsqueda, otros microservicios, colas de datos/registro, y más. Como se ha
55
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
‘Toda aplicación web moderna aprovecha una o más bases de datos para almacenar
información. Las bases de datos proporcionan formas de definir sus estructuras de datos,
insertar nuevos datos, encontrar datos existentes, actualizar o eliminar datos existentes,
realizar cálculos a través de los datos, y más. En la mayoría de los casos, los servidores de la
aplicación web se comunican directamente con una, al igual que los servidores de trabajo.
Además, cada servicio backend puede tener su propia base de datos aislada del resto de la
aplicación.
‘En general, la industria se está alineando en SQL como una interfaz incluso para las bases
de datos NoSQL, por lo que realmente se debe aprender SQL.
56
Introducción a las aplicaciones web
1.2. Arquitectura de las aplicaciones web
[Link]. Servicios
‘Una vez que una aplicación alcanza una cierta escala, es probable que haya ciertos
"servicios" que se ejecuten como aplicaciones separadas. No están expuestos al mundo
exterior, pero la app y otros servicios interactúan con ellos:
1. Servicio de cuentas. almacena los datos de los usuarios en todos nuestros sitios, lo
que nos permite ofrecer fácilmente oportunidades de venta cruzada y crear una
experiencia de usuario más unificada.
2. Servicio de pago. proporciona una interfaz para facturar las tarjetas de crédito de los
clientes.
57
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
[Link]. CDN
‘CDN son las siglas de "Content Delivery Network" (Red de Entrega de Contenidos) y la
tecnología proporciona una forma de servir activos como HTML estático, CSS, Javascript e
imágenes a través del web mucho más rápido que servirlos desde un único servidor de origen.
Funciona distribuyendo el contenido a través de muchos servidores "de borde" en todo el
mundo, de modo que los usuarios acaban descargando los activos desde los servidores "de
borde" en lugar del servidor de origen. Por ejemplo, en la imagen siguiente, un usuario de
España solicita una página web de un sitio con servidores de origen en Nueva York, pero los
activos estáticos de la página se cargan desde un servidor de "borde" de la CDN en Inglaterra,
lo que evita muchas peticiones HTTP lentas a través del Atlántico’ (Fulton, 2017).
El esquema de funcionamiento de los CGI tenía un punto débil: cada vez que recibíamos
una petición, el servidor web lanzaba un proceso que ejecutaba el programa CGI. Como, por
otro lado, la mayoría de CGI estaban escritos en algún lenguaje interpretado (Perl, Python,
etc.) o en algún lenguaje que requería run-time environment (VisualBasic, Java, etc.), esto
implicaba una gran carga para la máquina del servidor.
Además, si la web tenía muchos accesos al CGI, esto suponía problemas graves. Por ello
se empiezan a desarrollar alternativas a los CGI para solucionar este grave problema de
58
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
rendimiento. Las soluciones vienen principalmente por dos vías. Por un lado, se diseñan
sistemas de ejecución de módulos más integrados con el servidor, que evitan que éste tenga
que instanciar y ejecutar multitud de programas. La otra vía consiste en dotar al servidor de
un intérprete de algún lenguaje de programación (RXML, PHP, VBScript, etc.) que nos
permita incluir las páginas en el código de manera que el servidor sea quien lo ejecute,
reduciendo así el tiempo de respuesta.
A partir de este momento, se vive una explosión del número de arquitecturas y lenguajes
de programación que nos permiten desarrollar aplicaciones web. Todas ellas siguen alguna
de las dos vías ya mencionadas. De ellas, las más útiles y las que más se utilizan son aquellas
que permiten mezclar los dos sistemas, es decir, un lenguaje de programación integrado que
permita al servidor interpretar comandos que “incrustemos” en las páginas HTML y un
sistema de ejecución de programas más enlazado con el servidor que no presente los
problemas de rendimiento de los CGI.
Una de las tecnologías que más éxito ha obtenido y una de las que más se utiliza en Internet
es el lenguaje de programación interpretado por el servidor PHP. Se trata de un lenguaje que
permite incrustar HTML en los programas, con una sintaxis que proviene de C y Perl.
Además, habida cuenta de su facilidad de aprendizaje, su sencillez y potencia, se está
convirtiendo en una herramienta muy utilizada para algunos desarrollos.
59
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
1.3.1. Prototipo
El prototipo o bosquejo de la aplicación incluye la elaboración de diagramas de flujo y
pantallas que permiten dar una idea del sistema que cumpla con los requerimientos del
cliente.
Se busca que el prototipo tenga el suficiente detalle a nivel de pantallas como para dar una
idea precisa sobre las interfaces del sistema y posibles reportes que genere.
Los bosquejos son un puente entre el diseñador web y el desarrollador, por lo tanto, hay
que estar conscientes que es posible que un diseño de alguna interfaz no sea posible
transformarlo en código tal y como lo presenta el diseñador.
En esta fase, es posible que el cliente solicite que la aplicación se ajuste a diferentes
dispositivos como computadoras, tabletas o teléfonos inteligentes. A este comportamiento se
conoce como diseño web responsivo.
1.3.2. Diseño
Cuando el prototipo es aprobado se pasa ahora al diseño del sistema. Es hora de pasar los
elementos establecidos en el prototipo a código real. Es importante considerar el diseño de
los logos, los íconos, los banners y el contenido audiovisual de la aplicación.
60
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
4. Tener presente los diferentes estados de interacción como menús abiertos, cerrados
botones habilitados o deshabilitados.
5. Considerar que, a mayor tamaño de las imágenes, más pesada será la página para
cargar, pero gráficos con una resolución pequeña escalarán mal y se verán
cuadriculadas dando mala imagen a la página.
1.3.2. Infraestructura
El sistema operativo es la interfaz con la computadora y comúnmente se escoge uno
basado en Unix/Linux, aunque también se puede instalar alguno comercial, por ejemplo,
Windows Server 2016 o basado en Unix como el sistema operativo de IBM AIX Unix.
Esta es una pequeña guía de los pasos que se siguen durante el proceso de instalación:
61
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
3. Localizar y/o descargar el programa del instalador, así como los archivos de
cualquier controlador especializado que su máquina necesite.
4. Configurar un dispositivo de arranque como CD/DVD/dispositivo USB, o
proporcionar una infraestructura de arranque por red desde el que arrancar el
instalador.
5. Arrancar el sistema de instalación.
6. Elegir el idioma para la instalación.
7. Activar la conexión de red, si está disponible.
8. Si es necesario, redimensionar las particiones existentes en el disco duro de destino
para liberar espacio para la instalación.
9. Crear y montar las particiones en las que instalará Debian.
10. Esperar a la descarga/instalación/configuración automática del sistema base.
11. Seleccionar e instalar software adicional.
12. Instalar un gestor de arranque que pueda iniciar Debian GNU/Linux y/o los
sistemas existentes.
13. Iniciar por primera vez el sistema que acaba de instalar.
Se puede usar una versión del sistema de instalación gráfico en 64-bit PC. (debian, 2021)
Hay que instalar primeramente WSL y luego WSL2. Para instalar WSL ejecutar Power
Shell en modo administrador.
62
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
Ejecutar msinfo32
Para instalar la última versión del Linux Debian kernel de WSL2 solo tenemos que dar clic
aquí, y descargar Debian o Ubuntu o descargarlo de Windows Store.
63
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
cd .\Users\nalonzo\Downloads\
e instalarlo:
Add-AppxPackage .\TheDebianProject.DebianGNULinux_1.[Link]
Esperar a que termine la instalación. Agregar el usuario normal cuando se instale y éste
tendrá privilegios de sudo.
Para ejecutar el sistema operativo, aparecerá como un ícono en el menú de Windows 10.
Hay que tener en cuenta que el núcleo de Linux para WSL y WSL2 no soporta todas las
características y tampoco soporta niveles de ejecución que son básicos para algunas
aplicaciones. Con esto, implica que no se puede correr aplicaciones que usen iptables, como
fail2ban o dockers.
64
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
Básicamente implica sobre escribir el archivo /usr/bin/policy-rc.d por un script que regresa
el valor 101 y poner permisos de ejecución al mismo. Se renombra el paquete initctl y se
pone una liga para que cuando se mande a traer /sbin/initctl siempre regrese true. (github,
2018)
Habilitarlo
# /etc/init.d/mariadb start
# /etc/init.d/apache2 restart
Seguir las instrucciones. Seleccionar apache2, para ello utilizar las flechas de arriba/abajo
y presione la barra espaciadora y presione la tecla de tabulación y dar enter, en caso de
solicitar el servidor web.
66
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
# mysql –u root -p
Database changed
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost'
WITH GRANT OPTION;
Query OK, 1 row affected (0.001 sec)
/etc/dbconfig-common/[Link]
67
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
La siguiente herramienta que se instala es el cliente de git para poder administrar las
versiones en desarrollo de la aplicación. Como administrador ejecute la siguiente instrucción
#apt-get install git
#a2enmod rewrite
#/etc/init.d/apache2 restart
Instalar curl:
Instalar composer:
Instalar laravel
Para crear nuevos proyectos de laravel agrega lo siguiente al PATH de tu usuario de Linux:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games$HOME/.con
fig/composer/vendor/bin
Acceder a localhost/proyectoNuevo/public/
[Link]. Modelado.
69
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
y se expresa a través de otra tabla que tiene tantas claves primarias como entidades participen
en ella.
Las herramientas usadas para modelar bases de datos se dividen en dos grandes grupos
software libre y comerciales.
Una vez que se ha modelado la base de datos a utilizar es necesario contar con software
que permita administrar la información contenida en esta. Este software hace uso de las
órdenes propias del manejador para realizar las tareas más comunes denominadas CRUD
(Creación, lectura, actualización y eliminación –Create, Read, Update, Delete-).
70
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
71
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
Las tareas más comunes que se puede realizar con un VCS son:
Deshacer o revertir los cambios en el código fuente. Cada vez que se integran los
cambios de los desarrolladores se lleva un registro de todos los cambios con los que ha
contribuido cada uno. Así, existe la posibilidad de deshacer o regresar a un punto anterior
conocido, desde donde empezar nuevamente el desarrollo, si es que se detecta un fallo en el
código que está en producción.
Respaldo externo del código fuente. Cada programador puede llevar un respaldo sobre
el trabajo que está realizando que es independiente de la rama principal que se conoce como
master o primaria. En caso de que el programador sufra una pérdida o falla del equipo donde
está trabajando, se puede recuperar la mayor parte del trabajo, si es que no todo, dependiendo
de la última vez que se actualizó su rama.
Herramientas para trabajo en equipo. El VCS tiene herramientas que ayudan a los
desarrolladores a tener una mayor comunicación que permiten tener una línea clara durante
el desarrollo. Las herramientas de comunicación soportan varios hilos de comunicación lo
que ayuda a mejorar el debate entre equipos con respecto a la mejora del código fuente.
72
Introducción a las aplicaciones web
1.3. Tecnologías para el desarrollo de aplicaciones web
GitLab y SVN, pueden ser instalados en un servidor empresarial. Bitbucket ofrece cuenta
gratuita ilimitada para máximo cinco colaboradores, GitHub y GitLab también ofrecen
cuentas gratuitas y proyectos ilimitados para proyectos de software libre, pero para proyectos
privados se requiere pagar una cuota mensual o anual.
Para el trabajo cotidiano, es necesario instalar git o mercurial para utilizarlos como
clientes. Tanto mercurial como git son software libre. Para las prácticas se utilizará git como
cliente.
Para este tema, es importante crear al menos dos cuentas: una en bitbucker y otra en
github.
Editor Descripción
73
Introducción a las aplicaciones web
1.4. Planificación de aplicaciones web
1. Requerimientos. Como etapa inicial, se obtiene del cliente qué es lo que desea que
haga el sistema.
74
Introducción a las aplicaciones web
1.4. Planificación de aplicaciones web
1.4.1. Requerimientos
Los requerimientos del usuario son declaraciones en un lenguaje natural acompañado de
diagramas de los servicios que se espera que el sistema brinde a los usuarios del sistema y
las restricciones bajo las cuales debe operar. Se presentan como una descripción general del
problema o la necesidad que se requiere resolver, así como los flujos y la estructura de la
información (Alonso Amo, Martínez Normand, & Segovia Pérez, 2005).
Desde el punto de vista del producto se debe contar con descripciones de: las interfaces
del sistema; el hardware; el software, la comunicación; las restricciones de memoria; las
operaciones, y los requisitos de adaptación. Además, se describe las funciones del producto,
las características del usuario, las restricciones, los supuestos y las dependencias.
Eficiencia. Especificación del nivel de desempeño del software con respecto al tiempo y a la
utilización de recursos.
Arquitectónica:
Detallada:
1.4.2. Construcción
Es el conjunto de actividades para producir los componentes de software que
correspondan al análisis y diseño, así como la realización de pruebas unitarias. Como
resultado se obtienen los componentes de software probados.
Se distribuye las tareas a los miembros del equipo de trabajo según su rol.
76
Introducción a las aplicaciones web
1.4. Planificación de aplicaciones web
Se construyen y modifican los componentes de software con base a la parte detallada del
análisis y diseño.
Se corrigen los defectos encontrado hasta lograr pruebas unitarias exitosas. Se actualizan
los registros de rastreo incorporando los componentes construidos o modificados.
Se distribuyen las tareas a los miembros del equipo de trabajo según su rol.
77
Introducción a las aplicaciones web
1.4. Planificación de aplicaciones web
1.4.4. Cierre
Es la integración final de la configuración de software generada en las fases para su
entrega. Se identifican y documentan las lecciones aprendidas y se genera el reporte de
mediciones y sugerencias de mejora.
78
Introducción a las aplicaciones web
Competencias específicas y genéricas
Competencias genéricas
2.1. Introducción.
2.4. Formularios.
2.6. Selectores.
80
HTML, XML, CSS
2.1. Introducción
2.1. Introducción
El lenguaje HTML que significa Lenguaje de Marcas de Hipertexto (Hypertext Markup
Language) permite diseñar documentos basados en una estructura de hipertexto. Un
documento de este tipo contiene información cruzada con otros documentos ya sea del mismo
sitio o sitios externos, llamados documentos referenciados. A estas referencias se les llama
ligas o links. HTML permite, además incrustar archivos multimedia tales como imágenes,
video, sonido, plugins o pequeños programas para mejorar la interactividad con el usuario.
Los documentos HTML son de texto plano que no contienen ningún tipo de formateo. Lo
que significa que no se pueden usar editores de texto formateados como procesadores de
texto como Microsoft Word u otros, aunque es posible expórtalos a formato HTML.
En los archivos de texto plano el formato de texto se especifica mediante marcas de texto
llamados etiquetas o tags que delimitan el contenido a los que afecta la etiqueta. Las etiquetas
o tags empiezan por el carácter <, seguido del nombre de la etiqueta, seguido de los atributos
que permite la propia etiqueta y terminan con el carácter >, estas son las etiquetas de inicio.
A las etiquetas del final se le añade la barra invertida al principio del nombre de la etiqueta
encerrada en < y >. Ejemplo <Etiqueta></Etiqueta>. Es importante mantener
correctamente pareadas las etiquetas de apertura y cierre, aunque el navegador hace un gran
esfuerzo por mantener la coherencia de cierre de etiquetas, es buena costumbre. Las etiquetas
no son sensibles a mayúsculas y minúsculas.
Los atributos de las etiquetas siempre van separados por espacios en blanco, ejemplo:
Los atributos pueden ser solamente el nombre del atributo o puede incluir un valor, para
este caso se agrega un igual y generalmente va entrecomillado, ejemplo:
81
HTML, XML, CSS
2.2. Estructura global de un documento web
Cabe mencionar que HTML permite omitir en algunos casos omitir la etiqueta del final si
la etiqueta no debe envolver ningún texto que la afecte, por ejemplo, la etiqueta IMG. Otra
cosa a remarcar es que, si un navegador no entiende una etiqueta o atributo, la ignorará y
hará lo mismo con todo el texto afectado por la misma.
HTML5 es un nuevo concepto que logra integrar Javascript HTML y CSS de tal forma
que proporciona los cimientos, CSS se encarga que esos cimientos sean utilizables y
atractivos a la vista, permitiendo cambiar de estilo cualquier elemento en toda la estructura
del sitio y javascript provee la potencia para construir aplicaciones web completamente
dinámicas y funcionales.
<!doctype html>
<HTML lang=”es”>
<HEAD>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,
initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description"
content="Mi página trata de esto">
<meta name="keywords"
content="HTML5, CSS3, Javascript, palabra clave">
<TITLE>Título del documento</TITLE>
</HEAD>
<BODY>
Texto del documento
</BODY>
</HTML>
82
HTML, XML, CSS
2.2. Estructura global de un documento web
En HTML, los comentarios se utilizan para clarificar algún texto, pero son ignorados por
el navegador y no las ve el usuario, no obstante, se pueden ver en el código fuente. Se utilizan
las etiquetas
<!-- Mi comentario -->
83
HTML, XML, CSS
2.2. Estructura global de un documento web
Centrados
Etiqueta Descripción
<CITE></CITE> Cita literal de texto o documento
<ADDRESS></ADDRESS> Dirección
│ │ ├── controlador
│ │ ├── modelo
│ │ └── vistas
│ │ ├── html
│ │ ├── imágenes
│ │ └── js
│ └── Slider
│ ├── controlador
│ ├── modelo
│ └── vistas
└── Login
├── Login
│ ├── controlador
│ ├── modelo
│ └── vistas
│ ├── css
│ ├── imagenes
│ └── js
└── LoginCaptcha
├── controlador
└── vistas
├── css
└── js
Se tiene un directorio llamado clases que contiene las clases base del sistema y clases
generales que se ocupan en todo el sistema, una carpeta llamada conexiones para mantener
ahí todas las clases usadas para conectarse a las bases de datos correspondientes al proyecto.
El punto de entrada del sistema que es [Link]. Las siguientes carpetas Inicio y Login, son
submódulos que tienen subcarpetas que implementan la funcionalidad del sistema. Una
subcarpeta de Login que cuenta con dos funcionalidades: Login y LoginCaptcha, -en caso de
que el usuario se equivoque al escribir su contraseña- que debe tener todo sistema para la
validación de usuarios. Una carpeta de inicio que muestra un slider de noticias cuando el
usuario accede por primera vez. De acuerdo a esta estructura, se irá agregando más módulos
y funcionalidades con sus respectivos controladores, modelos y vistas.
85
HTML, XML, CSS
2.2. Estructura global de un documento web
│ ├── captcha
│ │ └── [Link]
│ ├── css
│ │ ├── [Link]
│ │ ├── [Link]
│ │ ├── [Link]
│ │ ├── fontawesome-free-5.6.3-web
│ │ └── [Link]
│ ├── fpdf
│ ├── html
│ │ ├── [Link]
│ │ └── [Link]
│ ├── iconos
│ │ ├── [Link]
│ │ ├── [Link]
│ ├── images
│ │ ├── [Link]
│ │ └── [Link]
│ ├── js
│ │ ├── [Link]
│ │ │ ├── [Link]
│ │ ├── sweetalert2
│ │ │ └── [Link]
│ │ └── [Link]
│ ├── [Link]
│ ├── [Link]
│ ├── seguridad
│ │ ├── [Link]
│ │ ├── [Link]
│ │ └── [Link]
│ └── [Link]
├── conexiones
│ └── [Link]
├── [Link]
├── Inicio
│ ├── Inicio
│ │ ├── controlador
│ │ │ └── [Link]
│ │ ├── modelo
│ │ │ └── [Link]
│ │ └── vistas
│ │ ├── html
│ │ │ ├── [Link]
86
HTML, XML, CSS
2.2. Estructura global de un documento web
│ │ │ └── [Link]
│ │ ├── imagenes
│ │ │ ├── error_slider.jpg
│ │ │ └── [Link]
│ │ └── [Link]
│ └── Slider
│ ├── controlador
│ │ └── [Link]
│ ├── modelo
│ │ └── [Link]
│ └── vistas
│ ├── [Link]
│ ├── [Link]
│ ├── [Link]
│ ├── [Link]
│ ├── html
│ │ ├── [Link]
│ │ └── [Link]
│ ├── js
│ │ └── [Link]
│ ├── [Link]
│ ├── [Link]
│ └── [Link]
└── Login
├── Acceso
│ └── modelo
│ ├── [Link]
│ └── [Link]
├── Login
│ ├── controlador
│ │ └── [Link]
│ ├── modelo
│ │ └── [Link]
│ └── vistas
│ ├── css
│ │ └── [Link]
│ ├── imagenes
│ │ ├── [Link]
│ │ └── [Link]
│ ├── js
│ │ ├── [Link]
│ │ └── [Link]
│ ├── [Link]
87
HTML, XML, CSS
2.3. Elementos básicos
│ └── [Link]
└── LoginCaptcha
├── controlador
│ └── [Link]
└── vistas
├── css
│ ├── [Link]
│ └── [Link]
├── js
│ ├── [Link]
│ ├── [Link]
│ └── [Link]
└── [Link]
En esta versión ampliada, se observa que tenemos un archivo php en cada carpeta
correspondiente a controlador, modelo y vista.
88
HTML, XML, CSS
2.3. Elementos básicos
tienen la misma
anchura fija. Crean un
Courier New
aspecto mecánico. Monospace
Lucida
Console
Las fuentes cursive
imitan la escritura
Monaco
humana. Brush Script MT
Las fuentes de fantasy Cursive Lucida
son fuentes decorativas
o lúdicas.
Handwriting
Copperplate
Fantasy
Papyrus
<B></B> Negrita
<I></I> Itálica
<U></U> Subrayado
<STRIKE></STRIKE> tachado
<SUP></SUP> Superíndice
<SUB></SUB> Subíndice
<BLINK></BLINK> Parpadeo
<TT></TT> Teletipo
<BIG></BIG> Grande
<SMALL></SMALL> Pequeño
<EM></EM> Enfatizado
<STRONG></STRONG> Destacado
cliente. Se recomienda empezar entonces con la fuente deseada, e incluir fuentes de una
familia genérica (para permitir que el navegador elija una fuente similar en la familia
genérica, si no hay otras fuentes disponibles). Los nombres de las fuentes deben estar
separados por comas. Si el nombre de la fuente incluye más de una palabra entonces debe ir
entrecomillada. Ejemplo:
.p1 {
font-family: "Times New Roman", Times, serif;
}
.p2 {
font-family: Arial, Helvetica, sans-serif;
}
.p3 {
font-family: "Lucida Console", "Courier New", monospace;
}
2.3.2. Vínculos
Las ligas se encuentran en cualquier documento web y permiten navegar dentro de la
misma página o de página a página. También es posible enviar a un nuevo sitio a una página
especifica.
La característica principal es que cuando se pasa el apuntador del ratón encima de una
liga, éste cambia por una manita. Las ligas no tienen por qué ser texto, también pueden ser
imágenes u otro elemento HTML. Una etiqueta de liga HTML se define como una hiperliga
y tiene la siguiente sintaxis:
<a href="url">Texto de la liga</a>
El atributo más importante de la etiqueta <a>, es el atributo href, que indica el destino
de la liga. El texto de la liga es la parte que será visible al lector.
Ejemplo:
<a href="[Link] TecNM campus Apizaco!</a>
Por omisión, las ligas aparecerán como sigue en los navegadores:
90
HTML, XML, CSS
2.3. Elementos básicos
Valor Descripción
Ejemplo:
<a href="[Link] target="_blank">Visita TecNM Campus
Apizaco!</a>
Los ejemplos anteriores hicieron uso de ligas absolutas o direcciones web completas en el
atributo href.
Una liga local es una liga a una página dentro del mismo sitio web y se denomina URL
relativa y no lleva la parte [Link]
Ejemplos:
<h2>URLs Absolutas</h2>
<p><a href="[Link] Nacional de México</a></p>
<p><a href="[Link]
<h2>URLs Relativas</h2>
<p><a href="Imágenes">Imágenes HTML</a></p>
<p><a href="/css/[Link]">Mi estilo CSS</a></p>
91
HTML, XML, CSS
2.3. Elementos básicos
Para usar una imagen como una liga simplemente introduce un elemento <img> dentro de
la etiqueta <a>. Por ejemplo:
<a href="[Link]">
<img src="[Link]" alt="Una sonrisa" style="width:42px;height:42px;">
</a>
Descargar la imagen con el atributo download
<a href="/images/[Link]" download="Logo">
Para poner una liga a un correo electrónico se usa la etiqueta mailto: en el atributo href.
Cuando el usuario da click en la liga, se abre el programa de correo electrónico del usuario
para que éste pueda mandar un correo electrónico a la dirección dada. Por ejemplo:
<a href="[Link] un correo</a>.
Actualmente hay bots que coleccionan los correos referenciados con mailto: lo que ha
ocasionado un grave problema de spam. Se recomienda utilizar alguna técnica de ofuscación
o javascript para evitar que el correo caiga en manos equivocadas.
Para usar los botones como ligas es necesario añadir código javascript para poder
especificar algunos eventos como el hacer clic en un botón. Por ejemplo:
<button onclick="[Link]=[Link]'">Página HTML</button>
92
HTML, XML, CSS
2.3. Elementos básicos
2.3.3. Listas
Las listas permiten a los desarrolladores web agrupar un conjunto de datos relacionados.
Se tienen dos tipos de listas:
Una lista desordenada usa viñetas para indicar los elementos. La etiqueta usada es
<ul></ul> y cada elemento de la lista empieza con la etiqueta <li></li>. Los elementos de la
lista se marcarán con viñetas (pequeños círculos negros) por defecto. Por ejemplo:
<ul>
<li>Café</li>
<li>Té</li>
<li>Leche</li>
</ul>
Una lista ordenada usa números para los elementos de la lista. Una lista ordenada
comienza con la etiqueta <ol></ol>. Cada elemento de la lista comienza con la etiqueta
<li></li>. Por ejemplo:
<ol>
<li>Café</li>
<li>Té</li>
<li>Leche</li>
</ol>
Los elementos de la lista se marcarán con números por defecto.
Una lista de descripción es una lista de términos, con una descripción de cada término.
<dt>Leche</dt>
<dd>- Bebida blanca de leche de vaca</dd>
</dl>
2.3.4. Tablas
Las tablas HTML permiten a los desarrolladores web arreglar datos en filas y columnas.
Una tabla en HTML consiste de celdas dentro de filas y columnas. Una tabla se define con
las etiquetas <table></table> Las celdas están definidas con las etiquetas <td></td> td
significa Table Data. Cada fila comienza con una etiqueta <tr></tr>. TR significa Table Row.
Se puede tener tantas filas como sea necesario, sólo hay que asegurarse que haya las mismas
celdas en cada fila. Si se necesita un encabezado en la tabla, podemos substituir los primeros
td por th (Table Header) Otra etiqueta útil es <caption> </caption> que se usa para poner un
nombre a la tabla. Por ejemplo:
<!DOCTYPE html>
<html>
<style>
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
</style>
<body>
<table style="width:100%">
94
HTML, XML, CSS
2.3. Elementos básicos
Se puede agregar la etiqueta <tbody></tbody> pera definir el cuerpo de una tabla. Con
ello, también se puede incluir elementos con las etiquetas <thead></thead> y
<tfoot></tfoot>. La etiqueta <tbody> se utiliza para agrupar el contenido del cuerpo en una
tabla HTML.
El elemento <tbody> se utiliza junto con los elementos <thead> y <tfoot> para especificar
cada parte de una tabla (cuerpo, cabecera, pie de página).
Los navegadores pueden utilizar estos elementos para permitir el desplazamiento del
cuerpo de la tabla independientemente de la cabecera y el pie de página. Además, cuando se
imprime una tabla grande que abarca varias páginas, estos elementos pueden permitir que la
cabecera y el pie de la tabla se impriman en la parte superior e inferior de cada página.
Nota: El elemento <tbody> debe tener una o más etiquetas <tr> en su interior.
95
HTML, XML, CSS
2.3. Elementos básicos
Consejo: Los elementos <thead>, <tbody> y <tfoot> no afectarán al diseño de la tabla por
defecto. Sin embargo, puede utilizar CSS para dar estilo a estos elementos (véase el ejemplo
siguiente).
<html>
<head>
<style>
thead {color: green;}
tbody {color: blue;}
tfoot {color: red;}
table, th, td {
border: 1px solid black;
}
tr:nth-child(even) {
background-color: #dddddd;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>Mes</th>
<th>Gastos</th>
</tr>
</thead>
<tbody>
<tr>
<td>Enero</td>
<td>$50</td>
</tr>
<tr>
<td>Febrero</td>
<td>$70</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>Total</td>
<td>$120</td>
</tr>
96
HTML, XML, CSS
2.3. Elementos básicos
</tfoot>
</table>
[Link]. Rejillas
CSS tiene un módulo de diseño para rejillas. El módulo CSS de diseño de rejillas ofrece un sistema de
maquetación basado en cuadrículas, con filas y columnas, que facilita el diseño de páginas web sin
tener que utilizar flotadores ni posicionamiento. Todos los hijos directos del contenedor de la rejilla
se convierten automáticamente en elementos de la rejilla. Los espacios entre cada columna/fila se
llaman huecos (gaps). Se usan las propiedades grid-row-gap y grid-column-gap. Se pueden
establecer a un valor en conjunto utilizando la propiedad grid-gap.
Un diseño de cuadrícula consiste en un elemento padre, con uno o más elementos hijos.
Para que un contenedor de tipo <div> se convierta en cuadrícula, se utiliza la propiedad
display y se establece al valor de grid o inline-grid. La propiedad grid distribuye el contenido
completamente en el contenedor, inline-grid, ajusta la rejilla al texto. Por ejemplo:
<!DOCTYPE html>
<html>
<head>
<style>
.contenedor-rejilla {
display: grid;
grid-row-gap: 50px;
grid-column-gap: 50px;
/* O utilizar la siguiente instrucción para establecer ambos valores*/
grid-gap: 50px 70px;
grid-template-columns: auto auto auto;
background-color: #2196F3;
padding: 10px;
}
.dato-rejilla {
background-color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(0, 0, 0, 0.8);
padding: 20px;
font-size: 30px;
97
HTML, XML, CSS
2.3. Elementos básicos
text-align: center;
}
</style>
</head>
<body>
<div class="contenedor-rejilla">
<div class="dato-rejilla">A</div>
<div class="dato-rejilla">B</div>
<div class="dato-rejilla">C</div>
<div class="dato-rejilla">D</div>
<div class="dato-rejilla">E</div>
<div class="dato-rejilla">F</div>
<div class="dato-rejilla">G</div>
<div class="dato-rejilla">H</div>
<div class="dato-rejilla">I</div>
</div>
</body>
</html>
Propiedad Valor
98
HTML, XML, CSS
2.3. Elementos básicos
Justify-content Se usa para justificar el contenido. Los valores que puede adoptar
son: space-evenly, space-around, space-betwen , center, start, end
2.3.5. Objetos
La etiqueta <object></object> permite incrustar objetos embebido en la página. Por
ejemplo
<object data="[Link]" width="300" height="200"></object>
O este otro ejemplo:
<object data="[Link]" width="500" height="200"></object>
Muestra una página html embebida en el recuadro.
2.3.6. Imágenes
Las imágenes pueden mejorar el diseño y la apariencia de una página web. La etiqueta
HTML <img> se utiliza para incrustar una imagen en una página web.
Técnicamente, las imágenes no se insertan en una página web; las imágenes están
vinculadas a páginas web. La etiqueta <img> crea un espacio de retención para la imagen
referenciada.
La etiqueta <img> está vacía, sólo contiene atributos y no tiene etiqueta de cierre. La
etiqueta <img> tiene dos atributos obligatorios:
100
HTML, XML, CSS
2.3. Elementos básicos
Ejemplo:
<img src="imagen_ciudad.jpg" alt="Imagen de una ciudad" style="width:500px;
height:600px;">
Nota: Cuando se carga una página web, es el navegador, en ese momento, el que obtiene
la imagen de un servidor web y la inserta en la página. Por lo tanto, asegúrese de que la
imagen permanece realmente en el mismo lugar en relación con la página web, de lo contrario
sus visitantes obtendrán un icono de enlace roto. El icono de enlace roto y el texto alternativo
se muestran si el navegador no puede encontrar la imagen.
El atributo alt requerido proporciona un texto alternativo para una imagen, si el usuario
por alguna razón no puede verla (debido a una conexión lenta, un error en el atributo src, o
si el usuario utiliza un lector de pantalla).
Puede utilizar el atributo de estilo para especificar la anchura y la altura de una imagen.
También puede utilizar los atributos de anchura y altura.
Sin embargo, le sugerimos que utilice el atributo style. Éste evita que las hojas de estilo
cambien el tamaño de las imágenes.
<!DOCTYPE html>
<html>
<head>
<style>
img {
width: 100%;
}
</style>
</head>
101
HTML, XML, CSS
2.3. Elementos básicos
<body>
</body>
</html>
Si tiene sus imágenes en una subcarpeta, debe incluir el nombre de la carpeta en el atributo
src. Algunos sitios web apuntan a una imagen en otro servidor.
<img src="/imagenes/[Link]" alt="Ícono HTML5" style="width:128px; height:128px;">
Para apuntar a una imagen en otro servidor, debe especificar una URL absoluta (completa)
en el atributo src.
<img src=" [Link]
alt="Logo Tecnm">
Notas sobre las imágenes externas: Las imágenes externas pueden estar sujetas a derechos
de autor. Si no obtienes permiso para usarlas, puedes estar violando las leyes de derechos de
autor. Además, no puede controlar las imágenes externas; pueden ser eliminadas o
modificadas repentinamente.
Para usar una imagen como liga, se coloca la etiqueta <img> dentro de una etiqueta <a>.
<a href="[Link]">
<img src="[Link]" alt="Aprende más" style="width:42px;height:42px;">
</a>
Aquí están los tipos de archivos de imagen más comunes, que son compatibles con todos los
navegadores (Chrome, Edge, Firefox, Safari, Opera):
102
HTML, XML, CSS
2.3. Elementos básicos
JPEG Imagen del Grupo Mixto de .jpg, .jpeg, .jfif, .pjpeg, .pjp
Expertos en Fotografía
2.3.7. Aplicaciones
El diseño web responsivo consiste en crear páginas web que se vean bien en todos los
dispositivos.
El diseño web responsivo consiste en utilizar HTML y CSS para redimensionar, ocultar,
reducir o ampliar automáticamente un sitio web, para que se vea bien en todos los
dispositivos (ordenadores de sobremesa, tabletas y teléfonos).
Para crear un sitio web responsivo, añada la siguiente etiqueta <meta> a todas sus páginas
web:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
103
HTML, XML, CSS
2.3. Elementos básicos
Las imágenes responsivas son imágenes que se adaptan bien a cualquier tamaño de
navegador.
Cambia el tamaño de la ventana del navegador para ver cómo cambia la imagen en función
de la anchura:
<picture>
<source srcset="[Link]" media="(max-width: 600px)">
<source srcset="[Link]" media="(max-width: 1500px)">
<source srcset="[Link]">
<img src="[Link]" alt="mi imagen">
</picture>
Para hacer el tamaño del texto responsivo, puede establecerse con una unidad "vw", que
significa el "ancho de la ventana gráfica".
De este modo, el tamaño del texto seguirá el tamaño de la ventana del navegador:
<h1 style="font-size:10vw">Hola mundo!!!</h1>
Viewport es el tamaño de la ventana del navegador. 1vw = 1% del ancho de la ventana.
Si la ventana gráfica tiene 50 cm de ancho, 1vw es 0,5 cm.
104
HTML, XML, CSS
2.3. Elementos básicos
Con las consultas de medios se pueden definir estilos completamente diferentes para
distintos tamaños de navegador.
Ejemplo: cambiar el tamaño de la ventana del navegador para ver que los tres elementos
div de abajo se mostrarán horizontalmente en pantallas grandes y apilados verticalmente en
pantallas pequeñas:
<style>
.left, .right {
float: left;
width: 30%; /* El ancho es 30%, por omisión */
}
.main {
float: left;
width: 50%; /* El ancho es 50%, por omisión */
}
Todos los Frameworks CSS populares ofrecen diseño responsivo. Son gratuitos y fáciles
de usar. [Link]. [Link] es un moderno framework CSS con soporte para diseño de
escritorio, tableta y móvil por defecto. [Link] es más pequeño y más rápido que otros
frameworks CSS similares. [Link] está diseñado para ser una alternativa de alta calidad a
Bootstrap. [Link] está diseñado para ser independiente de jQuery o cualquier otra
biblioteca de JavaScript.
Otro marco CSS muy popular es Bootstrap. Bootstrap utiliza HTML, CSS y jQuery para
hacer páginas web responsivas.
105
HTML, XML, CSS
2.3. Elementos básicos
[Link]. Geolocalización
function muestraPosicion(posicion) {
[Link] = "Latitud: " + [Link] +
"<br>Longitud: " + [Link];
}
function muestraMapa(posicion) {
var latlon = [Link] + "," + [Link];
function muestraError(error) {
switch([Link]) {
case error.PERMISSION_DENIED:
[Link] = "El Usuario negó la petición para la geolocalización."
break;
case error.POSITION_UNAVAILABLE:
[Link] = "No está disponible la información para localización."
break;
case [Link]:
106
HTML, XML, CSS
2.3. Elementos básicos
Con el almacenamiento web, las aplicaciones web pueden guardar los datos localmente
en el navegador del usuario.
Antes de HTML5, los datos de las aplicaciones tenían que almacenarse en cookies,
incluidas en cada solicitud del servidor. El almacenamiento web es más seguro, y se pueden
guardar grandes cantidades de datos localmente, sin afectar al rendimiento del sitio web.
El almacenamiento en la web es por origen (por dominio y protocolo). Todas las páginas,
desde un mismo origen, pueden almacenar y acceder a los mismos datos.
[Link] - almacena datos para una sesión (los datos se pierden cuando
se cierra la pestaña del navegador).
107
HTML, XML, CSS
2.3. Elementos básicos
[Link]("Apellido");
Nota: Los pares nombre/valor se almacenan siempre como cadenas. Recuerde convertirlos
a otro formato cuando sea necesario.
El objeto sessionStorage es igual al objeto localStorage, salvo que almacena los datos de
una sola sesión. Los datos se eliminan cuando el usuario cierra la pestaña específica del
navegador.
<!DOCTYPE html>
<html>
<head>
<script>
108
HTML, XML, CSS
2.3. Elementos básicos
function contador() {
if (typeof(Storage) !== "undefined") {
if ([Link]) {
[Link] = Number([Link])+1;
} else {
[Link] = 1;
}
[Link]("resultado").innerHTML = "Haz presionado el botón " +
[Link] + " veces en esta sesión.";
} else {
[Link]("resultado").innerHTML = " Lo siento tu navegador no soporta
almacenamiento Web...";
}
}
</script>
</head>
<body>
<p><button onclick="contador()" type="button">Haz clic aquí!!</button></p>
<div id="resultado"></div>
<p>Haz clic para incrementar el contador.</p>
<p>Cierra la pestaña (o ventana) del navegador, e inténtalo de nuevo, y el contador se
reiniciará.</p>
</body>
</html>
Cuando se ejecutan scripts en una página HTML, la página deja de responder hasta que el
script finaliza.
Se puede seguir haciendo lo que quiera: hacer clic, seleccionar cosas, etc., mientras el web
worker se ejecuta en segundo plano.
var i = 0;
function contador() {
i = i + 1;
postMessage(i);
setTimeout("contador()",500);
}
contador();
La parte importante del código anterior es el método postMessage(), que se utiliza para
enviar un mensaje a la página HTML.
<!DOCTYPE html>
<html>
<body>
<script>
var w;
function comienzaTrabajador() {
if (typeof(Worker) !== "undefined") {
if (typeof(w) == "undefined") {
w = new Worker("trabajador_demo.js");
}
110
HTML, XML, CSS
2.3. Elementos básicos
[Link] = function(event) {
[Link]("resultado").innerHTML = [Link];
};
} else {
[Link]("resultado").innerHTML = "Lo siento: No hay soporte para
trabajadores web.";
}
}
function detenTrabajador() {
[Link]();
w = undefined;
}
</script>
</body>
</html>
Los eventos enviados por el servidor (SSE) permiten que una página web reciba
actualizaciones de un servidor.
Un evento enviado por el servidor es cuando una página web recibe automáticamente
actualizaciones de un servidor.
Esto también era posible antes, pero la página web tenía que preguntar si había
actualizaciones disponibles. Con los eventos enviados por el servidor, las actualizaciones
llegan automáticamente.
111
HTML, XML, CSS
2.3. Elementos básicos
} else {
// Lo sentimos. No hay soporte para eventos enviados por el servidor!!.
}
La sintaxis del flujo de eventos del lado del servidor es sencilla. Se establece la cabecera
"Content-Type" como "text/event-stream". Ahora se puede empezar a enviar flujos de
eventos.
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
?>
112
HTML, XML, CSS
2.4. Formularios
2.4. Formularios
2.4.1. Definiciones
Un formulario HTML se utiliza para recoger la información del usuario. La entrada del
usuario suele enviarse a un servidor para su procesamiento.
El elemento HTML <form> se utiliza para crear un formulario HTML para la entrada del
usuario
<form>
.
Elementos de formulario
.
</form>
113
HTML, XML, CSS
2.4. Formularios
El atributo target especifica dónde mostrar la respuesta que se recibe después de enviar el
formulario. El atributo target puede tener uno de los siguientes valores:
Valor Descripción
114
HTML, XML, CSS
2.4. Formularios
El atributo method especifica el método HTTP que se utilizará al enviar los datos del
formulario.
Los datos del formulario pueden enviarse como variables URL (con method="get") o
como transacción HTTP post (con method="post").
El método HTTP por defecto al enviar los datos del formulario es GET.
Notas sobre GET. Añade los datos del formulario a la URL, en pares nombre/valor
¡Nunca use GET para enviar datos sensibles! (los datos del formulario enviado son visibles
en la URL) La longitud de una URL está limitada (2048 caracteres) Es útil para los envíos
de formularios en los que el usuario quiere marcar el resultado GET es bueno para datos no
seguros, como las cadenas de consulta en Google
Notas sobre POST. Añade los datos del formulario dentro del cuerpo de la petición HTTP
(los datos del formulario enviado no se muestran en la URL) POST no tiene limitaciones de
tamaño, y puede utilizarse para enviar grandes cantidades de datos. Los envíos de formularios
con POST no pueden marcarse como favoritos.
Consejo. Utilice siempre POST si los datos del formulario contienen información sensible
o personal.
115
HTML, XML, CSS
2.4. Formularios
El atributo novalidate es un atributo booleano. Cuando está presente, especifica que los
datos del formulario (entrada) no deben ser validados cuando se envían.
Atributo Descripción
action Especifica dónde enviar los datos del formulario cuando se envía un
formulario
enctype Especifica cómo deben codificarse los datos del formulario al enviarlo al
servidor (sólo para method="post")
method Especifica el método HTTP a utilizar cuando se envían los datos del
formulario
116
HTML, XML, CSS
2.4. Formularios
El elemento <input> puede mostrarse de varias maneras, dependiendo del atributo type.
Ejemplo:
<label for="nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre">
Todos los diferentes valores del atributo type se tratan en el siguiente subtema.
El elemento <label> define una etiqueta para varios elementos del formulario.
El elemento <label> es útil para los usuarios de lectores de pantalla, porque el lector de
pantalla leerá en voz alta la etiqueta cuando el usuario se centre en el elemento de entrada.
El elemento <label> también ayuda a los usuarios que tienen dificultades para hacer clic
en regiones muy pequeñas (como botones de radio o casillas de verificación), porque cuando
el usuario hace clic en el texto dentro del elemento <label>, se activa el botón de radio/casilla
de verificación.
El atributo for de la etiqueta <label> debe ser igual al atributo id del elemento <input>
para unirlos.
Ejemplo
<label for="auto">Selecciona un auto car:</label>
<select id="auto" name="auto">
<option value="vocho">Volkswagen</option>
<option value="focus">Focus</option>
<option value="fiat">Fiat</option>
<option value="audi">Audi</option>
</select>
117
HTML, XML, CSS
2.4. Formularios
Los elementos <option> definen una opción que puede ser seleccionada. Por defecto, se
selecciona el primer elemento de la lista desplegable. Para definir una opción
preseleccionada, añada el atributo selected a la opción:
<option value="fiat" selected>Fiat</option>
Utilice el atributo size para especificar el número de valores visibles:
<label for="auto">Selecciona un auto:</label>
<select id="auto" name="auto" size="3">
<option value="vocho">Volkswagen</option>
<option value="focus">Focus</option>
<option value="fiat">Fiat</option>
<option value="audi">Audi</option>
</select>
Para Permitir selecciones múltiples:
Utilice el atributo múltiple para permitir que el usuario seleccione más de un valor:
<label for="auto">Selecciona un auto:</label>
<select id="auto" name="auto" size="4" multiple>
<option value="vocho">Volkswagen</option>
<option value="focus">Focus</option>
<option value="fiat">Fiat</option>
<option value="audi">Audi</option>
</select>
El elemento <textarea> define un campo de entrada de varias líneas (un área de texto):
Ejemplo
<textarea name="message" rows="10" cols="30">
Hay algo importante aquí.
</textarea>
El atributo rows especifica el número de líneas visibles en un área de texto. El atributo
cols especifica el ancho visible de un área de texto.
Ejemplo
<form action="/[Link]">
<fieldset>
<legend>Datos de la persona:</legend>
<label for="nombre">Nombre:</label><br>
<input type="text" id="nombre" name="nombre" value="Juan"><br>
<label for="apellidoPaterno">Apellido paterno:</label><br>
<input type="text" id="apellidoPaterno" name="apellidoPaterno"
value="Sánchez"><br><br>
<label for="apellidoMaterno">Apellido materno:</label><br>
<input type="text" id="apellidoMaterno" name="apellidoMaterno"
value="Pérez"><br><br>
<input type="submit" value="Submit">
</fieldset>
</form>
Los usuarios verán una lista desplegable de las opciones predefinidas cuando introduzcan
los datos.
119
HTML, XML, CSS
2.4. Formularios
El atributo list del elemento <input> debe hacer referencia al atributo id del elemento
<datalist>.
<form action="/[Link]">
<input list="navegadores">
<datalist id="navegadores">
<option value="Internet Explorer">
<option value="Firefox">
<option value="Chrome">
<option value="Opera">
<option value="Safari">
</datalist>
</form>
Ejemplo:
Etiqueta Descripción
120
HTML, XML, CSS
2.4. Formularios
<datalist> Especifica una lista de opciones predefinidas para los controles de entrada.
<label for="clave">Clave:</label><br>
<input type="password" id="clave" name="clave">
</form>
<input type="submit"> define un botón para enviar los datos del formulario a un
manejador de formularios.
El manejador de formularios suele ser una página del servidor con un script para procesar
los datos de entrada.
Ejemplo:
<form action="/[Link]">
<label for="nombre"> Nombre:</label><br>
<input type="text" id="nombre" name="nombre"><br>
<label for="apellidoPaterno"> Apellido Paterno:</label><br>
<input type="text" id=" apellidoPaterno " name=" apellidoPaterno ">
<label for="apellidoMaterno"> Apellido Materno:</label><br>
<input type="text" id=" apellidoMaterno " name=" apellidoMaterno ">
<input type="submit" value="Enviar">
</form>
Si omite el atributo de valor del botón de envío, el botón obtendrá un texto por defecto:
<form action="/[Link]">
<label for="nombre"> Nombre:</label><br>
<input type="text" id="nombre" name="nombre"><br>
<label for="apellidoPaterno"> Apellido Paterno:</label><br>
<input type="text" id=" apellidoPaterno " name=" apellidoPaterno ">
<label for="apellidoMaterno"> Apellido Materno:</label><br>
<input type="text" id=" apellidoMaterno " name=" apellidoMaterno ">
<input type="submit">
</form>
<input type="reset"> define un botón de reinicio que restablecerá todos los valores del
formulario a sus valores por defecto:
<form action="/[Link]">
<label for="nombre"> Nombre:</label><br>
122
HTML, XML, CSS
2.4. Formularios
Los botones de radio permiten al usuario seleccionar sólo una de un número limitado de
opciones:
<p> Elija su lenguaje web favorito:</p>
<form>
<input type="radio" id="html" name="lenguajeFavorito" value="HTML">
<label for="html">HTML</label><br>
<input type="radio" id="css" name=" lenguajeFavorito " value="CSS">
<label for="css">CSS</label><br>
<input type="radio" id="javascript" name=" lenguajeFavorito " value="JavaScript">
<label for="php">PHP</label><br>
<input type="radio" id="php" name=" lenguajeFavorito " value="PHP">
<label for="php">PHP</label>
</form>
Ejemplo
<input type="button" onclick="alert(Hola a todos!')" value="="¡Hazme clic!">
El <input type="color"> se utiliza para los campos de entrada que deben contener un
color.
Dependiendo del soporte del navegador, un selector de color puede aparecer en el campo
de entrada.
<form>
<label for="color">Selecciona tu color favorito:</label>
<input type="color" id="color" name="favcolor">
</form>
El <input type="date"> se utiliza para los campos de entrada que deben contener una
fecha.
Dependiendo del soporte del navegador, un selector de fecha puede aparecer en el campo
de entrada.
Ejemplo
<form>
<label for="fechaNacimiento"> Cumpleaños:</label>
<input type="date" id=" fechaNacimiento " name=" fechaNacimiento ">
</form>
También puedes utilizar los atributos min y max para añadir restricciones a las fechas:
Ejemplo
124
HTML, XML, CSS
2.4. Formularios
<form>
<label for="fechaMax"> Ingrese una fecha anterior a 1980-01-01:</label>
<input type="date" id=" fechaMax " name=" fechaMax " max="1979-12-31"><br><br>
<label for=" fechaMin "> Ingrese una fecha posterior al 2000-01-01:</label>
<input type="date" id=" fechaMin " name=" fechaMin " min="2000-01-02">
</form>
Dependiendo del soporte del navegador, un selector de fecha puede aparecer en el campo
de entrada.
Ejemplo:
<form>
<label for=" fechaNacimientoHora "> Cumpleaños (fecha y hora):</label>
<input type="datetime-local" id=" fechaNacimientoHora " name=" fechaNacimientoHora
">
</form>
El <input type="email"> se utiliza para los campos de entrada que deben contener una
dirección de correo electrónico.
Dependiendo del soporte del navegador, la dirección de correo electrónico puede ser
validada automáticamente cuando se envía.
Ejemplo
<form>
<label for="correo"> Ingrese su correo electrónico:</label>
<input type="email" id=" correo " name=" correo ">
</form>
125
HTML, XML, CSS
2.4. Formularios
Ejemplo
<form>
<label for="miArchivo"> Seleccione un archivo:</label>
<input type="file" id=" miArchivo " name=" miArchivo ">
</form>
El <input type="hidden"> define un campo de entrada oculto (no visible para un usuario).
Un campo oculto permite a los desarrolladores web incluir datos que no pueden ser vistos
o modificados por los usuarios cuando se envía un formulario.
Un campo oculto a menudo almacena el registro de la base de datos que necesita ser
actualizado cuando se envía el formulario.
Ejemplo
<form action="/[Link]">
<input type="hidden" id="identificadorUsuario" name=" identificadorUsuario "
value="8313">
<label for="nombre"> Nombre:</label><br>
<input type="text" id="nombre" name="nombre" value="Juan"><br>
<label for="apellidoPaterno"> Apellido Paterno:</label><br>
<input type="text" id=" apellidoPaterno " name=" apellidoPaterno" value="Pérez">
<label for="apellidoMaterno"> Apellido Materno:</label><br>
<input type="text" id=" apellidoMaterno " name=" apellidoMaterno " value="García">
<input type="submit">
<input type="reset" value="Restaurar">
</form>
126
HTML, XML, CSS
2.4. Formularios
Dependiendo del soporte del navegador, un selector de fecha puede aparecer en el campo
de entrada.
Ejemplo
<form>
<label for="MesAnio"> Cumpleaños (mes y año):</label>
<input type="month" id=" MesAnio " name=" MesAnio ">
</form>
Ejemplo
<form>
<label for=" cantidad "> Cantidad (entre 1 y 10):</label>
<input type="number" id=" cantidad " name=" cantidad " min="1" max="10">
</form>
En la tabla Tabla 2.11 hay una lista de algunas restricciones de entrada comunes:
Atributo Descripción
readonly Especifica que un campo de entrada es de sólo lectura (no puede ser
modificado)
Ejemplo
<form>
<label for="cantidad">Cantidad:</label>
<input type="number" id="cantidad" name="cantidad " min="0" max="100" step="10"
value="30">
</form>
Rango del tipo de entrada
El <input type="range"> define un control para introducir un número cuyo valor exacto
no es importante (como un control deslizante). El rango por defecto es de 0 a 100. Sin
embargo, puede establecer restricciones sobre los números que se aceptan con los atributos
min, max y step:
Ejemplo
<form>
<label for="volumen">Volumen (between 0 and 30):</label>
<input type="range" id=" volumen " name=" volumen " min="0" max="30">
</form>
128
HTML, XML, CSS
2.4. Formularios
El <input type="search"> se utiliza para los campos de búsqueda (un campo de búsqueda
se comporta como un campo de texto normal).
Ejemplo:
<form>
<label for="buscaGoogle"> Buscar en Google:</label>
<input type="search" id="buscaGoogle" name="buscaGoogle">
</form>
El <input type="tel"> se utiliza para los campos de entrada que deben contener un número
de teléfono.
Ejemplo
<form>
<label for="telefono"> Ingrese su número de teléfono:</label>
<input type="tel" id="telefono" name="telefono" pattern="[0-9]{3}-[0-9]{2}-[0-9]{3}">
</form>
El <input type="time"> permite al usuario seleccionar una hora (sin zona horaria).
Dependiendo del soporte del navegador, puede aparecer un selector de hora en el campo
de entrada.
Ejemplo
<form>
<label for="appt"> Seleccione una hora:</label>
<input type="time" id="hora" name="hora">
</form>
129
HTML, XML, CSS
2.4. Formularios
El <input type="url"> se utiliza para los campos de entrada que deben contener una
dirección URL.
Dependiendo del soporte del navegador, el campo url puede ser validado automáticamente
cuando se envía.
Algunos smartphones reconocen el tipo url y añaden ".com" al teclado para que coincida
con la entrada url.
Ejemplo
<form>
<label for=" paginaInicio "> Añade tu página de inicio:</label>
<input type="url" id="paginaInicio" name=" paginaInicio ">
</form>
Dependiendo del soporte del navegador, un selector de fecha puede aparecer en el campo
de entrada.
Ejemplo
<form>
<label for="semana">Select a week:</label>
<input type="week" id="semana" name="semana">
</form>
Ejemplo
130
HTML, XML, CSS
2.4. Formularios
Un campo de entrada de sólo lectura no puede ser modificado (sin embargo, un usuario
puede tabular hasta él, resaltarlo y copiar el texto de él).
Ejemplo:
El atributo input disabled especifica que un campo de entrada debe estar deshabilitado.
131
HTML, XML, CSS
2.4. Formularios
Ejemplo:
</form>
Nota: El atributo size funciona con los siguientes tipos de entrada: text, search, tel, url,
email y password.
Ejemplo
</form>
132
HTML, XML, CSS
2.4. Formularios
Nota: Cuando se establece una longitud máxima, el campo de entrada no aceptará más
que el número de caracteres especificado. Sin embargo, este atributo no proporciona ninguna
información. Por lo tanto, si quiere alertar al usuario, debe escribir código JavaScript.
Ejemplo
</form>
Los atributos min y max de entrada especifican los valores mínimos y máximos de un
campo de entrada.
Los atributos min y max funcionan con los siguientes tipos de entrada: number, range,
date, datetime-local, month, time y week.
Consejo: Utilice los atributos máx. y mín. juntos para crear un rango de valores legales.
Ejemplo:
Establezca una fecha máxima, una fecha mínima y un rango de valores legales:
133
HTML, XML, CSS
2.4. Formularios
<form>
<label for="fechamax"> Ingrese una fecha anterior a 1980-01-01:</label>
<input type="date" id="fechamax " name="fechamax" max="1979-12-31"><br><br>
El atributo multiple en input especifica que el usuario puede introducir más de un valor
en un campo de entrada.
El atributo múltiple funciona con los siguientes tipos de entrada: email y file.
Ejemplo:
El atributo de patrón de entrada especifica una expresión regular con la que se comprueba
el valor del campo de entrada, cuando se envía el formulario.
El atributo pattern funciona con los siguientes tipos de entrada: text, date, search, url, tel,
email y password.
Consejo: Utilice el atributo global title para describir el patrón para ayudar al usuario.
Ejemplo
Un campo de entrada que sólo puede contener tres letras (sin números ni caracteres
especiales):
<form>
<label for="codigoPais"> Código de país:</label>
134
HTML, XML, CSS
2.4. Formularios
El atributo placeholder de input especifica una breve pista que describe el valor esperado
de un campo de entrada (un valor de muestra o una breve descripción del formato esperado).
El atributo placeholder funciona con los siguientes tipos de entrada: text, search, url, tel,
email y password.
Ejemplo:
El atributo required de input especifica que un campo de entrada debe ser rellenado antes
de enviar el formulario.
El atributo required funciona con los siguientes tipos de entrada: text, search, url, tel,
email, password, date, number, checkbox, radio y file.
Ejemplo:
135
HTML, XML, CSS
2.4. Formularios
El atributo step de input especifica los intervalos de números legales para un campo de
entrada.
Consejo: Este atributo puede utilizarse junto con los atributos max y min para crear un
rango de valores legales.
El atributo step funciona con los siguientes tipos de entrada: number, range, date,
datetime-local, month, time y week.
Ejemplo:
Ejemplo:
136
HTML, XML, CSS
2.4. Formularios
</form>
Consejo: Especifique siempre los atributos de altura y anchura para las imágenes. Si se
establecen la altura y la anchura, el espacio necesario para la imagen se reserva cuando se
carga la página. Sin estos atributos, el navegador no conoce el tamaño de la imagen y no
puede reservarle el espacio adecuado. El efecto será que el diseño de la página cambiará
durante la carga (mientras se cargan las imágenes).
Ejemplo
Definir una imagen como botón de envío, con atributos de altura y anchura:
<form action="/[Link]">
<label for="nombre"> Nombre:</label><br>
<input type="text" id="nombre" name="nombre" value="Juan" autofocus ><br>
<label for="apellidoPaterno"> Apellido Paterno:</label><br>
<input type="text" id=" apellidoPaterno " name=" apellidoPaterno" value="Pérez">
<label for="apellidoMaterno"> Apellido Materno:</label><br>
<input type="text" id=" apellidoMaterno " name=" apellidoMaterno " value="García">
<label for="pin">PIN:</label><br>
<input type="text" id="pin" name="pin" maxlength="4" size="4">
<input type="image" src="[Link]" alt="Enviar" width="48" height="48">
<input type="submit" value="Enviar">
<input type="reset" value="Restaurar">
</form>
137
HTML, XML, CSS
2.4. Formularios
Ejemplo:
El atributo de autocompletar funciona con <form> y los siguientes tipos de <input>: text,
search, url, tel, email, password, datepickers, range y color.
Ejemplo:
138
HTML, XML, CSS
2.4. Formularios
</form>
El valor de este atributo debe ser igual al atributo id del elemento <form> al que pertenece.
Un campo de entrada situado fuera del formulario HTML (pero que sigue siendo parte del
formulario):
El atributo formaction de la entrada especifica la URL del archivo que procesará la entrada
cuando se envíe el formulario.
139
HTML, XML, CSS
2.4. Formularios
El atributo formaction funciona con los siguientes tipos de entrada: submit e image.
Ejemplo
El tributo formenctype especifica cómo deben codificarse los datos del formulario cuando
se envían (sólo para formularios con method="post").
El atributo formenctype funciona con los siguientes tipos de entrada: submit e image.
Ejemplo:
Un formulario con dos botones de envío. El primero envía los datos del formulario con la
codificación por defecto, el segundo envía los datos del formulario codificados como
"multipart/form-data":
<form action="/acció[Link]" method="post">
<label for="Nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre"><br><br>
<label for="apellidoPaterno">Apellido paterno:</label>
<input type="text" id="apellidoPaterno" name="apellidoPaterno"><br><br>
<input type="submit" value="Enviar">
<input type="submit" formenctype="multipart/form-data"
value="Enviar como Multipart/form-data">
</form>
140
HTML, XML, CSS
2.4. Formularios
El atributo formmethod de la entrada define el método HTTP para enviar los datos del
formulario a la URL de la acción.
El atributo formmethod funciona con los siguientes tipos de entrada: submit e image.
Los datos del formulario pueden enviarse como variables de la URL (method="get") o
como una transacción HTTP post (method="post").
Este método añade los datos del formulario a la URL en pares nombre/valor
Este método es útil para los envíos de formularios en los que el usuario quiere marcar el
resultado.
Hay un límite en la cantidad de datos que puede colocar en una URL (varía entre los
navegadores), por lo tanto, no puede estar seguro de que todos los datos del formulario
serán transferidos correctamente.
Nunca utilice el método "get" para pasar información sensible. (la contraseña u otra
información sensible será visible en la barra de direcciones del navegador).
Este método envía los datos del formulario como una transacción HTTP post.
Los envíos de formularios con el método "post" no se pueden marcar como favoritos.
El método "post" es más robusto y seguro que "get", y "post" no tiene limitaciones de
tamaño.
Ejemplo
Un formulario con dos botones de envío. El primero envía los datos del formulario con
method="get". El segundo envía los datos del formulario con method="post":
141
HTML, XML, CSS
2.4. Formularios
El atributo formtarget especifica un nombre o una palabra clave que indica dónde mostrar
la respuesta que se recibe después de enviar el formulario.
El atributo formtarget funciona con los siguientes tipos de entrada: submit e image.
Ejemplo:
<form action="/[Link]">
<label for="Nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre"><br><br>
<label for="apellidoPaterno">Apellido paterno:</label>
<input type="text" id="apellidoPaterno" name="apellidoPaterno"><br><br>
<input type="submit" value="Enviar">
<input type="submit" formmethod="post" value="Enviar usando POST"
142
HTML, XML, CSS
2.4. Formularios
Ejemplo:
<form action="/[Link]">
<label for="Nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre"><br><br>
<label for="apellidoPaterno">Apellido paterno:</label>
<input type="text" id="apellidoPaterno" name="apellidoPaterno"><br><br>
Cuando está presente, novalidate especifica que todos los datos del formulario no deben
ser validados cuando se envían.
Ejemplo:
143
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
2.5.1. Metadatos
Un metadato permite describir otros datos. El estándar ISO/IEC 11179 proporciona el
concepto de metadato.
En la web hay un conjunto de formatos estándar. El objetivo es describir las opciones para
codificar los tipos de información existentes y qué ventajas e inconvenientes tienen cada uno.
‘La codificación de caracteres no tuvo una solución universal desde sus inicios. Hubo
diferentes representaciones parciales que tuvieron que ir cambiando para incluir un conjunto
mayor de caracteres dependiendo del lenguaje natural a representar.
ASCII. Se creó en 1963, evolucionó de los códigos de telegrafía. Usa siete bits para
representar un caracter, más un bit de paridad. El bit de paridad se usa para la
verificación de errores durante la transmisión. Con siete bits es posible representar 27
posibles símbolos. Actualmente tiene 32 para códigos de control no imprimibles (y
que ya no se ocupan actualmente) y 95 imprimibles. Los códigos de control se usaban
como instrucciones o metadatos para otros dispositivos como impresoras o cintas
magnéticas. Los símbolos están ordenados alfabéticamente de menor a mayor. Las
minúsculas y mayúsculas se diferencian por un bit. Los caracteres que representan
dígitos empiezan en la posición 48, o que facilita la conversión a BCD tomando sólo
los últimos cuatro bits de los caracteres cuyos bits empiecen con 0011. Su problema
principal es que fue diseñado para representar al idioma inglés y codifica pocos
símbolos.
ampliación fue posible cubrir la mayor parte de idiomas cubran su alfabeto con sus
propios símbolos con la ventaja de ser compatibles hacia atrás, esto es, con los códigos
imprimibles del ASCII de siete bits. El problema es la incompatibilidad entre
diferentes codepages para los caracteres extra (del 128 hasta el 255). Un código
representa diferentes caracteres y si no se sabe el codepage correcto, no es posible
obtener el símbolo adecuado. Otro problema es que no es posible representar con
codepages los lenguajes asiáticos.
UTF (Unicode Transformation Format). Hasta la fecha sus diferentes versiones son el
sistema más universal, permiten dar soporte a los idiomas mayoritarios
o UTF 32: Tiene una longitud fija de 32 bits y permite representar 232 símbolos,
lo que es más que suficiente. El único problema de UTF-32 es su baja
eficiencia por la memoria que ocupa. Tampoco es compatible con ASCII.
o UTF 8: En este sistema la longitud varía de entre uno a seis bytes. Los códigos
de un byte permiten compatibilidad con ASCII para los otros símbolos se
siguen varios criterios, por ejemplo, se intenta usar la menor longitud posible
para codificar los símbolos más comunes o juntar los símbolos de un idioma
146
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
tanto como se pueda. Ocupa un poco más de espacio que los codepages porque
los símbolos específicos se codifican con más de un byte, y también ocupa un
poco más que DBCS, pero la diferencia, en promedio, es pequeña. Permite
recorrer una cadena hacia adelante y atrás sin generar ambigüedad de límites,
y puede soportar todos los lenguajes con todos sus símbolos. Un pequeño
problema es que, al ser un código de longitud variable, para acceder al símbolo
n-ésimo de una cadena se necesita recorrerla desde el principio, pasando una
operación de complejidad O(1) a una de complejidad O(n). Esta codificación
es el estándar de Linux. La mayoría de los editores soportan esta codificación.
2.5.3. XML
‘XML son las siglas de eXtensible Markup Language, lenguaje extensible de marcas. Se
trata de un estándar del Word Wide Web Consortium ([Link] es una referencia
básica de XML), cuyo objetivo original consistía en permitir afrontar los retos de la
publicación electrónica de documentos a gran escala.
La característica importante de XML es que está diseñado para describir datos, separando
el contenido de la presentación, a diferencia de HTML. Un archivo XML se almacena como
texto plano legible por cualquier editor. El XML es el formato base de la mayor parte de las
tecnologías usadas por las aplicaciones web.
XML deriva del lenguaje de marcas SGML (un estándar ISO, concretamente el ISO-
8879). Concretamente, es un subconjunto de SGML que pretende que éste pueda ser servido,
recibido y procesado en la web de la misma forma que el HTML. XML ha sido diseñado
buscando la simplicidad de implementación y la interoperabilidad con SGML y HTML y
tratando, por otra parte, de que sea usado para diseñar aplicaciones centradas en los datos.
XML nace en 1996, desarrollado por un grupo auspiciado por el W3C y al que
inicialmente se conocía como grupo de trabajo de SGML, con los siguientes objetivos, tal
como se enumeran en el documento de definición del estándar.
147
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
Una etiqueta sigue el formato mostrado en la Ilustración 2.1 Formato de etiqueta en XML.
148
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
Las mayúsculas y minúsculas son distintas, lo que significa que los identificadores
nombre y Nombre son distintos, lo que no sucede con HTML.
No puede empezar con número o símbolo especial, excepto ‘_’, los caracteres
siguientes sí pueden ser signos de puntuación.
Los caracteres <, > y " siempre representados por entidades de carácter: para representar
estos caracteres (en el texto, no como marcas de etiqueta) debemos usar siempre las entidades
de carácter especiales: <, > y ". Estos caracteres son especiales para XML.
<elemento atributo = “valor del atributo”/>. Tanto la cadena este es el contenido como valor
del atributo son CDATA.
Para saber si un documento está bien formado o no se utilizan un parser que libera al
programador de esta tarea. Pero el parser sólo revisa si el documento es válido sintéticamente.
¿Qué sucede si el documento es sintácticamente correcto, pero no tiene sentido? Para ello,
XML nos proporciona un par de lenguajes de especificación de estructura del documento,
XML Schema y DTD.
150
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
Para ello, el W3C ha desarrollado algunos estándares de XML que permiten validar un
documento a partir de una especificación formal de cómo debe ser éste. Dichos estándares
son DTD y XSchema.
‘El DTD define un conjunto de metadatos sobre archivos XML que indican al parser la
estructura del documento y una lista de elementos o ramas y atributos u hojas, esto es, definen
una gramática para ese archivo XML. Los DTD son opcionales y no hay necesidad de
referenciar a algún documento. Es posible (y común) incluir el DTD en el propio archivo
XML. A esto se le conoce como referencia privada. La contraparte –colocar el DTD en
archivos separados– se conoce como referencia pública. La referencia al DTD empieza con
la sintaxis <!DOCTYPE raíz …> en donde raíz es el nombre del primer elemento del árbol.
151
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
La mayoría de los parsers de XML permiten de validar documentos con DTD al leer el
documento y el DTD asociado. Si el documento XML no cumple los requerimientos que le
impone el DTD, advertirán del error y el documento no será validado.
El DTD es el medio para definir cómo será el dialecto de XML personalizado (nosotros
definimos qué etiquetas usar en nuestros documentos, el significado que les asociamos, etc.).
Aunque DTD es un estándar que en un futuro será sustituido por XML Schema, sea usa
mucho debido a que es más simple que XML Schema. También es más compacto. Las
mejoras adicionales que proporciona XML Schema no se requieren para la mayoría de los
casos. Con DTD se han definido multitud de dialectos de XML que son usados ampliamente
en Internet.
152
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
‘Para entender las convenciones hay que conocer las definiciones y usos de los diferentes
símbolos usados, que podemos ver en la tabla siguiente:
Símbolo Descripción
? Elemento opcional
Opcional?
[Link]. Element
‘Definen una etiqueta del dialecto que estamos construyendo. Por ejemplo:
<!ELEMENT Trabajador (Nombre, DireccionCasa?,
DireccionTrabajo?, DescripcionTrabajo?)>
Define la etiqueta Trabajador, e indica que contiene las subetiqueta Nombre,
DireccionCasa, DireccionTrabajo y DescripcionTrabajo. Las tres últimas son opcionales
como lo indica el símbolo ?.
Los hijos que se declaran como una secuencia de elementos separados por comas deben
aparecer en el mismo orden en el documento. Los elementos hijo también deben declararse
en el documento DTD. Estos elementos hijo pueden, a su vez, tener elementoshijo. La
declaración completa de coche sería entonces:
<!ELEMENT coche (marca, matricula, color)>
<!ELEMENT marca (#PCDATA)>
<!ELEMENT matricula (#PCDATA))>
<!ELEMENT color (#PCDATA)>
• Cardinalidad de las ocurrencias de elementos. La siguiente declaración nos indica
que el elemento hijo sólo puede ocurrir una vez dentro del elemento padre:
<!ELEMENT nombre (hijo)>
Si deseamos que el elemento hijo aparezca más de una vez y como mínimo una vez:
<!ELEMENT nombre (hijo+)>
154
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
[Link]. ATTLIST
‘Como ya hemos visto, los elementos en XML pueden tener atributos. Evidentemente, en
DTD disponemos de un mecanismo para indicar qué atributos puede tener un ELEMENT,
de qué tipo, si son o no obligatorios, etc. Para ello disponemos del elemento ATTLIST, cuya
sintaxis es:
<!ATTLIST elemento atributo tipo-atributo valor-defecto>
Un ejemplo de uso sería:
<!ATTLIST pago metodo CDATA "contra-reembolso">
Y su uso en XML:
<pago metodo=“contra-reembolso” />
El tipo de atributo debe ser uno de los de la lista:
Valor Descripción
155
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
Valor Descripción
En este caso, donde no especificamos valor para método, éste contendrá el valor por
defecto de contra-reembolso.
• Sintaxis de #IMPLIED
En el siguiente ejemplo:
<!ELEMENT pago EMPTY>
<!ATTLIST pago metodo CDATA #IMPLIED >
Validará correctamente el siguiente XML:
<pago metodo="tarjeta" />
<pago />
156
HTML, XML, CSS
2.5. Lenguajes de presentación en documentos web
Usaremos, pues, #IMPLIED en aquellos casos en los que no queremos forzar al usuario a
usar atributos, pero no podemos poner valores por defecto.
• Sintaxis de #REQUIRED
En el siguiente ejemplo:
<!ELEMENT pago EMPTY>
<!ATTLIST pago metodo CDATA #REQUIRED >
Validará correctamente el siguiente XML:
<pago metodo=“tarjeta” />
pero no validará:
<pago />
Usaremos #REQUIRED en aquellos casos en los que no podemos proporcionar un valor
por defecto, pero deseamos que el atributo aparezca y se le asigne algún valor.
‘Para que un documento XML quede vinculado a un DTD determinado, tenemos dos
opciones: incluir el DTD en el documento XML o usar una referencia externa al DTD.
La primera opción es la más fácil de usar, pero la que presenta más inconvenientes, ya que
aumenta el tamaño de los documentos XML y complica su mantenimiento, puesto que un
cambio en el DTD implica revisar todos los documentos en los que lo hemos incluido.
157
HTML, XML, CSS
2.6. Selectores
2.6. Selectores
Con CSS y su integración con el DOM, puedes cambiar el estilo de cualquier elemento de
forma rápida y sencilla. Por ejemplo, si no te gusta el aspecto por defecto de las etiquetas
<h1>, <h2> y otras etiquetas de encabezado, puede asignar nuevos estilos para anular la
configuración predeterminada de la familia de fuentes y el tamaño utilizado, o si se debe
establecer la negrita o la cursiva, y muchas más propiedades también.
158
HTML, XML, CSS
2.6. Selectores
Una forma de añadir estilos a una página web es insertando las declaraciones necesarias
en la cabecera de una página web entre las etiquetas <head> y </head>. Así, para cambiar el
estilo de la etiqueta <h1>, podrías usar el siguiente código:
<style>
h1 { color:red; font-size:3em; font-family:Arial; }
</style>
Hay un par de maneras diferentes de lograr esto, la primera de las cuales es mediante el
uso de la directiva @import de CSS de la siguiente manera:
<style>
@import url('[Link]');
</style>
Esta declaración le dice al navegador que busque una hoja de estilo con el nombre
[Link]. El comando El comando @import es bastante flexible ya que puede crear hojas de
estilo que a su vez, traen otras hojas de estilo, y así sucesivamente. Sólo tiene que asegurarse
de que no hay etiquetas <style> o </style> en ninguna de sus hojas de estilo externas, o no
funcionarán.
También puede incluir una hoja de estilo con la etiqueta HTML <link> de la siguiente
manera:
<link rel='stylesheet' type='text/css' href='[Link]'>
Esto tiene exactamente el mismo efecto que la directiva @import, excepto que <link>
es una etiqueta sólo HTML y no es una directiva de estilo válida, por lo que no se puede
utilizar desde dentro de una hoja de estilo para tirar de otra, y tampoco se puede colocar
dentro de un par de etiquetas <style> .... </ style>.
159
HTML, XML, CSS
2.6. Selectores
2.6.3. Identificadores
Una mejor solución para establecer el estilo de un elemento es asignarle un ID en el
HTML, así:
<div id=bienvenido>Hola</div>
Esto establece que el contenido del <div> con el ID bienvenido debe tener aplicado a ellos
el estilo definido en la configuración de estilo de bienvenida. La declaración CSS
correspondiente para esto podría ser como la siguiente
#bienvenido { font-style:italic; color:blue; }
Observe el uso del símbolo #, que especifica que sólo el ID con el nombre bienvenido
debe ser estilizado con esta declaración.
2.6.4. Clases
Si desea aplicar el mismo estilo a muchos elementos, no tiene que dar a cada uno un ID
diferente porque puedes especificar una clase para manejarlos todos, así:
<div class='bienvenido'>Hola</div>
Esto establece que el contenido de este elemento (y cualquier otro que utilice la clase)
debe tener aplicado el estilo definido en la clase bienvenido. Una vez aplicada la clase se
puede utilizar la siguiente regla, ya sea en la cabecera de la página o dentro de una hoja de
estilo externa para establecer los estilos de la clase:
.bienvenido { font-style:italic; color:blue; }
En lugar del símbolo #, que está reservado para las identificaciones, las declaraciones de
clase van precedidas de un . (punto).
En CSS, el punto y coma se utiliza para separar varias sentencias CSS en la misma línea.
Pero si sólo hay una declaración en una regla (o en una configuración de estilo en línea dentro
de una etiqueta HTML), puede omitir el punto y coma, al igual que para la última sentencia
de un grupo.
160
HTML, XML, CSS
2.6. Selectores
Sin embargo, para evitar errores de CSS difíciles de encontrar, es posible que prefieras
utilizar siempre un punto y coma después de cada ajuste CSS. A continuación, puede copiar,
pegar y modificar las propiedades, sin preocuparse de quitar puntos y comas donde no son
estrictamente necesarios o de tener que añadirlos donde son necesarios.
Por último viene un ; (punto y coma) para terminar la declaración. En este caso, como
font-size es la última propiedad de la regla, el punto y coma no es necesario (pero sí lo sería
si siguiera otra asignación).
161
HTML, XML, CSS
2.6. Selectores
O puede espaciar un poco más las asignaciones, de modo que se alineen unas debajo de
otras en una columna en los dos puntos, así:
h1 { font-size:240%;
color:blue;
}
De esta manera, puede ver fácilmente dónde comienza cada nuevo conjunto de reglas,
porque el selector está siempre en la primera columna, y las asignaciones que siguen están
perfectamente alineadas con todos valores de la propiedad comenzando en el mismo
desplazamiento horizontal. En los ejemplos anteriores, el punto y coma final es innecesario,
pero si alguna vez quiere concatenar alguno de estos grupos de sentencias en una sola línea,
es muy rápido hacerlo con todos los puntos y comas ya colocados.
Puede especificar el mismo selector tantas veces como quiera, y CSS combina todas las
propiedades. Así que el ejemplo anterior también podría especificarse como
h1 { font-size: 240%; }
h1 { color : blue; }
No hay una forma correcta o incorrecta de diseñar su CSS, pero se recomienda que al
menos intente mantener cada bloque de CSS consistente con mismo, para que otras personas
puedan entenderlo de un vistazo.
Es una buena idea comentar sus reglas CSS, incluso si describe sólo los principales grupos
162
HTML, XML, CSS
2.6. Selectores
En primer lugar, puedes colocar un comentario dentro de un par de etiquetas /* ... */, de
la siguiente manera:
/* Esto es un comentario CSS */
O puedes extender un comentario a lo largo de varias líneas, como esto:
/*
Un comentario de varias
líneas
comentario
*/
Cuando utilice comentarios multilínea, tenga en cuenta que no puede anidar comentarios
de una línea (o cualquier otro) dentro de ellos. Si lo hace, puede provocar errores
imprevisibles.
El nivel más bajo de precedencia de estilo es el estilo por defecto aplicado por un
navegador web. Estos estilos de estilos se crean como un recurso para cuando una página
web no tiene ningún estilo, y están pretenden ser un conjunto genérico de estilos que se
muestren razonablemente bien en la mayoría de los casos.
Antes de que existiera el CSS, estos eran los únicos estilos que se aplicaban a un
documento, y sólo un puñado de ellos podían ser cambiados por una página web (como la
cara de la fuente, el color y el tamaño, y unos pocos argumentos de tamaño de los elementos).
de los elementos).
163
HTML, XML, CSS
2.6. Selectores
Estos son los siguientes estilos de mayor precedencia, y son soportados por la mayoría de
los navegadores modernos, pero se implementan de forma diferente en cada uno de ellos. Si
quiere aprender a crear sus propios estilos por defecto para la navegación, utilice un motor
de búsqueda para introducir el nombre de su navegador nombre de su navegador seguido de
"estilos de usuario" (por ejemplo, "estilos de usuario de Firefox" o "estilos de usuario de
Opera") para averiguar cómo hacerlo.
164
HTML, XML, CSS
2.6. Selectores
Cuando se utiliza este tipo de estilo, se rompe la separación entre el diseño y el contenido;
por lo tanto, se recomienda que, por lo tanto, se recomienda que lo haga sólo cuando tenga
una buena razón.
El selector de tipo funciona en tipos de elementos HTML como <p> o <i>. Por ejemplo,
la siguiente regla garantizará que todo el texto dentro de las etiquetas <p> ... </p> está
totalmente justificado:
p { text-align:justify; }
Los selectores descendientes le permiten aplicar estilos a elementos que están contenidos
dentro de otros elementos. Por ejemplo, la siguiente regla establece todo el texto dentro de
las etiquetas
<b> ... </b>
165
HTML, XML, CSS
2.6. Selectores
de color rojo, pero sólo si se encuentran dentro de las etiquetas <p> ... </p> (así:
<p><b>Hola</b></p>):
p b { color:red; }
Los selectores descendientes pueden continuar anidando indefinidamente, por lo que la
siguiente es una regla perfectamente regla válida para hacer que el texto sea azul dentro de
un texto en negrita, dentro de un elemento de lista de una lista desordenada lista:
ul li b { color:blue; }
Como ejemplo práctico, suponga que quiere utilizar un sistema de numeración diferente
para una lista ordenada que está anidada dentro de otra lista ordenada. Puede conseguirlo de
la siguiente manera, que sustituirá la numeración numérica por defecto (empezando por el 1)
por letras minúsculas (empezando por la a):
<!DOCTYPE html>
<html>
<head>
<style>
ol ol {
list-style-type: lower-alpha;
}
</style>
</head>
<body>
<ol>
<li>1</li>
<li>2</li>
<li>3
<ol>
<li>1</li>
<li>2</li>
<li>3</li>
</ol>
</li>
</ol>
</body>
</html>
El resultado de cargar este HTML en un navegador web está en la Ilustración 2.4, en el
que se puede ver que los segundos elementos de la lista se muestran de forma diferente:
166
HTML, XML, CSS
2.6. Selectores
El selector child es similar al selector descendiente, pero es más restrictivo en cuanto a cuando se
aplicará el estilo, seleccionando sólo aquellos elementos que son hijos directos de otro elemento.
Por ejemplo, el siguiente código utiliza un selector descendiente que cambiará cualquier texto en
negrita dentro de un párrafo a rojo, incluso si el texto en negrita está en cursiva (como este
<p><i><b>Hola</b> allí</i></p>):
p b { color:red; }
En este caso, la palabra Hola se muestra en rojo. Sin embargo, cuando este tipo de
comportamiento más general de comportamiento no es necesario, se puede utilizar un
selector children para restringir el alcance del selector. Por ejemplo, el siguiente selector hijo
pondrá el texto en negrita en rojo sólo si el elemento es hijo directo de un párrafo y no está
contenido en otro elemento:
p > b { color:red;}
Ahora la palabra Hola no cambiará de color porque no es hija directa del párrafo. Para un
ejemplo práctico, suponga que desea poner en negrita sólo los elementos <li> que son hijos
directos de los elementos <ol>. Puede conseguirlo de la siguiente manera, donde los
elementos <li> que son hijos directos de elementos <ul> no se ponen en negrita:
<!DOCTYPE html>
<html>
<head>
<style>
ol>li {
font-weight: bold;
}
</style>
167
HTML, XML, CSS
2.6. Selectores
</head>
<body>
<ol>
<li>1</li>
<li>2</li>
<li>3</li>
</ol>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
</html>
El resultado de cargar este HTML en un navegador será el siguiente:
[Link]. El selector ID
168
HTML, XML, CSS
2.6. Selectores
siempre que se encuentren dentro de diferentes tipos de elementos tipos de elementos, como
este:
<div id='miid'>Hola</div> <span id='miid'>Hola</span>
Como los IDs normalmente se aplican sólo a elementos únicos, la siguiente regla aplicará
un subrayado sólo a la primera ocurrencia de myid:
#miid { text-decoration:underline; }
Sin embargo, puedes asegurarte de que CSS aplique la regla a ambas apariciones de la
siguiente manera
span#miid { text-decoration:underline; }
div#miid { text-decoration:underline; }
O, más sucintamente, así
span#miid, div#miid { text-decoration:underline; }
No se recomienda usar esta forma de selección porque cualquier JavaScript que también
deba acceder a estos elementos no puede hacerlo fácilmente porque la función
getElementByID() comúnmente utilizada devolverá sólo la primera ocurrencia. Para referirse
a cualquier otra instancia, un programa tendría que buscar en toda la lista de elementos del
documento, una tarea más complicada. Por lo tanto, generalmente es mejor utilizar siempre
nombres de identificación únicos.
Cuando hay un número de elementos en una página que desea compartir el mismo estilo,
se puede asignar a todo el mismo nombre de clase (así: <span class='miclase'>); entonces
crear una única regla para modificar todos esos elementos a la vez, como en la siguiente
regla, que crea un desplazamiento del margen izquierdo de 10 píxeles para todos los
elementos que utilizan la clase:
.miclase { margin-left:10px; }
En los navegadores modernos, puede hacer que los elementos HTML utilicen más de una
clase separando los nombres de las clases con espacios, así: <span class='clase1 clase2
clase3'>. Recuerde, sin embargo, que algunos navegadores muy antiguos sólo permiten un
único nombre de clase en un argumento de clase.
169
HTML, XML, CSS
2.6. Selectores
Puede limitar el ámbito de acción de una clase especificando los tipos de elementos a los
que debe aplicarse. Por ejemplo, la siguiente regla aplica la configuración sólo a los párrafos
que utilizan la clase main:
[Link] { text-indent:30px; }
En este ejemplo, sólo los párrafos que utilizan la clase main (como este: <p
class="main">) recibirán el nuevo valor de la propiedad. Cualquier otro tipo de elemento que
intente utilizar la clase (como <div class="main">) no se verá afectado por esta regla.
Muchas etiquetas HTML admiten atributos, y el uso de este tipo de selector puede
ahorrarle tener que usar IDs y clases para referirse a ellos. Por ejemplo, puede referirse
directamente a los atributos de la siguiente manera, que establece todos los elementos con el
atributo type="submit" a un ancho de 100 píxeles:
[type="submit"] { width:100px; }
Si desea limitar el alcance del selector a, por ejemplo, sólo los elementos de entrada del
formulario con ese tipo de atributo, puede utilizar la siguiente regla:
form input[type="submit"] { width:100px; }
Los selectores de atributos también funcionan con los ID y las clases, de modo que, por
ejemplo, [class~="nombreClase"] funciona exactamente igual que el selector de clase
.nombreClase (salvo que este último tiene una mayor precedencia). Del mismo modo,
[id="nombreid"] equivale a utilizar el selector de ID #nombreid.
Por lo tanto, los selectores de clase e ID precedidos por # y . pueden considerarse como
una abreviatura de los selectores de atributos, pero con una mayor precedencia. El operador
~= coincide con un atributo incluso si es uno de un grupo de atributos separados por espacios
de atributos separados por espacios.
El comodín * o selector universal coincide con cualquier elemento, por lo que la siguiente
regla hará un completo desastre de un documento dando un borde verde a todos sus
elementos:
170
HTML, XML, CSS
2.6. Selectores
3. Encuentre todos los p subelementos de los objetos devueltos en el paso 2 y, como éste
es el último selector en el grupo, encontrar también todos los p sub- y sub-sub-elementos (y
así sucesivamente) de los objetos devueltos en el paso 2.
4. Aplicar los estilos dentro de los caracteres { y } a los objetos devueltos en el paso 3.
El resultado neto de esto es que el borde verde se aplica sólo a los párrafos que son nietos
(o bisnietos, etc.) del elemento principal.
Con CSS puede aplicar una regla a más de un elemento, clase o cualquier otro tipo de
selector al mismo tiempo separando los selectores con comas. Así, por ejemplo, la regla
siguiente regla colocará una línea punteada naranja debajo de todos los párrafos, el elemento
con el ID de idname, y todos los elementos que utilicen la clase classname:
171
HTML, XML, CSS
2.7. Modelo de caja
Una vez que sepas cómo funciona el modelo de caja, estarás en camino de crear páginas
con un diseño profesional, ya que estas propiedades por sí solas conformarán gran parte del
estilo de tu página.
Sin embargo, CSS supera este posible problema: cuando dos elementos con bordes se
colocan directamente uno encima del otro, sólo se utiliza el mayor de los dos márgenes para
separarlos. Si ambos márgenes tienen la misma anchura, sólo se utiliza una de las anchuras.
De este modo, es mucho más probable que obtenga el resultado que desea. Pero debe tener
en cuenta que los márgenes de los elementos absolutamente posicionados o en línea no se
contraen.
172
HTML, XML, CSS
2.7. Modelo de caja
Cuando se establece la propiedad margin, se pueden proporcionar uno, dos, tres o cuatro
argumentos, que tienen los efectos comentados en las siguientes reglas:
/* Establecer todos los márgenes a 1 píxel */
margin: 1px
/* Establecer la parte superior e inferior a 1 píxel, y la izquierda y la
derecha a 2 */
margin: 1px 2px;
/* Establecer la parte superior a 1 píxel, la izquierda y la derecha a 2, y
la parte inferior a 3 */
margin:1px 2px 3px;
<tr>
<td>
<div id='object1'>margin:<br>10px 20px 30px 40px;</div>
</td>
</tr>
</table>
</body>
</html>
La Ilustración 2.6 se muestra un ejemplo con la regla de la propiedad margin (resaltada en
negrita) aplicada a un elemento cuadrado que ha sido colocado dentro de un elemento tabla
que ha sido colocado dentro de un elemento tabla. A la tabla no se le han dado dimensiones,
por lo que simplemente se envolverá tan estrechamente alrededor del elemento <div> interior
como pueda. Como consecuencia, hay un margen de 10 píxeles por encima, 20 píxeles a la
derecha, 30 píxeles por debajo y 40 píxeles a la izquierda.
Es el siguiente nivel a medida que nos adentramos en el modelo de caja. Las principales
propiedades utilizadas para modificar los bordes son border, border-left, border-top, border-
right y borderbottom, y cada una de ellas puede tener otras subpropiedades añadidas como
sufijos, como -color, -estyle y -width.
174
HTML, XML, CSS
2.7. Modelo de caja
Las cuatro formas de acceder a los ajustes de las propiedades individuales utilizadas para
la propiedad margin también se aplican con la propiedad border-width, por lo que todas las
siguientes son reglas válidas:
/* Todos los bordes */
border-width:1px;
/* Superior/inferior izquierda/derecha */
border-width:1px 5px;
/* Arriba izquierda/abajo derecha */
border-width:1px 5px 10px;
/* Arriba derecha abajo izquierda */
border-width:1px 5px 10px 15px;
La Ilustración 2.7 muestra cada una de estas reglas aplicadas sucesivamente a un grupo
de elementos cuadrados.
En la primera, se puede ver claramente que todos los bordes tienen una anchura de 1 píxel.
El segundo elemento, sin embargo, tiene un ancho de borde superior e inferior de 1 píxel,
mientras que sus anchos laterales son de 5 píxeles cada uno.
175
HTML, XML, CSS
2.7. Modelo de caja
Las cuatro formas de acceder a los ajustes de las propiedades individuales utilizadas para
las propiedades margin y border también se aplican con la propiedad padding, por lo que
todas las siguientes son reglas válidas:
/* Todo el padding */
padding:1px;
/* Arriba/abajo e izquierda/derecha */
padding:1px 2px;
/* Arriba, izquierda/derecha y abajo */
padding:1px 2px 3px;
/* Arriba, derecha, abajo e izquierda */
padding:1px 2px 3px 4px;
La Figura 19-15 muestra la regla de relleno (mostrada en negrita) aplicada a algún texto
dentro de una celda de tabla (como se define por la regla display:table-cell;, que hace que el
elemento <div> encapsulado se muestre como una celda de tabla), al que no se le han dado
dimensiones por lo que simplemente envolverá el texto todo lo que pueda. Como
consecuencia, hay un relleno de 10 píxeles por encima del elemento interior, 20 píxeles a su
derecha, 30 píxeles por debajo y 40 píxeles a su izquierda.
176
HTML, XML, CSS
2.7. Modelo de caja
177
HTML, XML, CSS
2.7. Modelo de caja
En el nivel más profundo del modelo de caja, tenemos un elemento que puede ser
estilizado en todas las formas vistas hasta ahora, y que puede (y normalmente lo hará)
contener más subelementos, que a su vez pueden contener sub-sub-elementos, y así
sucesivamente, cada uno con su propio estilo y configuración del modelo de caja.
178
HTML, XML, CSS
Competencias específicas y genéricas
Competencias genéricas
Solución a problemas.
Capacidad de aprender.
179
Programación del lado del cliente
3.1. Introducción al lenguaje
JavaScript fue inventado por Brendan Eich en 1995 y más tarde, en 1997, se convirtió en
el estándar de la Asociación Europea de Fabricantes de Computadoras (ECMA), por lo que
su nombre oficial es ECMA Script, pero se conoce comúnmente como JavaScript. Suele
utilizarse para hacer páginas web interactivas. Puede utilizarse para comprobar o validar el
contenido de los formularios, cambiar las imágenes, abrir nuevas ventanas emergentes y
escribir contenidos dinámicos en la página. También puede utilizarse con CSS para convertir
el HTML estático en un lenguaje de marcado de hipertexto dinámico (DHTML). Esto permite
dividir la página web en diferentes partes que aparecen, desaparecen o se mueven. El
programa JavaScript es un script del lado del cliente, por lo que sólo se ejecuta cuando un
usuario o cliente carga una página web en cualquier navegador.
3.1.2. Sintaxis
Las sentencias JavaScript se colocan dentro de las etiquetas HTML <script>... </script>
en una página web. Las etiquetas <script> pueden colocarse en cualquier lugar de la página
web. Sin embargo, se recomienda que se mantenga dentro de la etiqueta <head> para una
ejecución más rápida. La etiqueta <script> avisa al programa del navegador para que ejecute
todo el texto entre estas etiquetas línea por línea. A continuación, se ofrece una sintaxis
sencilla de su JavaScript:
Un ejemplo básico:
<!DOCTYPE html>
<html>
<head>
<title>Ejemplo JavaScript</title>
180
Programación del lado del cliente
3.1. Introducción al lenguaje
</head>
<body>
<p id="Parrafo1">
</p>
<p id="Parrafo2">
</p>
<p id="Parrafo3">
</p>
<script>
[Link]("Parrafo1").innerHTML = "En un lugar de
la mancha";
[Link]("Parrafo2").innerHTML = "De cuyo lugar";
[Link]("Parrafo3").innerHTML = "no quiero
acordarme";
</script>
</body>
</html>
La salida correspondiente la tenemos en la Ilustración 3.1 Salida del script de
3.1.3. Variables
Las variables de JavaScript se utilizan para almacenar información que puede ser referida
posteriormente en el script. Una variable se inicializa almacenando un valor en ella. Podemos
inicializar una variable en el momento de declararla o posteriormente cuando necesitemos
esa variable. También podemos asignar un nuevo valor a una variable en cualquier momento,
pero éste será reemplazado por el valor almacenado anteriormente.
181
Programación del lado del cliente
3.1. Introducción al lenguaje
<!DOCTYPE html>
<html>
<head>
<title>Uso de variables JavaScript</title>
<meta charset="utf-8">
</head>
<body>
<p id="miVariable"> </p>
<script>
var a = 16; // Declaración de variables
var b = 13;
var c = a + b;
[Link]("miVariable").innerHTML =
"La suma en la variable c es: " + c;
</script>
</body>
</html>
3.1.3. Operadores
Los operadores de JavaScript son los símbolos especiales utilizados para realizar una
operación matemática o lógica, etc. Como ejemplo, en A + B, el símbolo "+" representa el
operador y se utiliza para sumar números o valores almacenados en las variables. En la tabla
4.1 se enumeran algunos operadores utilizados en JavaScript.
182
Programación del lado del cliente
3.1. Introducción al lenguaje
Operador Descripción
- Resta
* Multiplicación
/ División
% Módulo
++ Incremento en uno
-- Decremento en 1
|| OR lógico
Precedencia de operadores.
183
Programación del lado del cliente
3.1. Introducción al lenguaje
Operadores Tipo
() [] . Paréntesis, llamada a método de objeto
++ −− Incremento/Decremento
+ − ~ ! Unario, bitwise desplazamiento de bits, negación
* / % Aritméticos
+ − Aritméticos y cadena
<< >> >>> Bitwise Desplazamiento de bits
< > <= >= Comparación
== != === !== Comparación
& ^ | Bitwise de bit
&& Lógico
|| Lógico
? : Operador ternario
= += −= *= /= %= Asignación
<<= >>= >>>= &= Asignación
^= |=
, Separador
<p id="multiplicacion"></p>
<p id="division"> </p>
<script>
var a = 15; // Se asignan las constantes a las variables.
var b = 13;
var c = a + b; // Se suman los dos valores.
[Link]("suma").innerHTML
= "La suma de <b>a</b> y <b>b</b> es: " + c;
var c = a - b; // // Se suman los dos valores.
[Link]("resta").innerHTML
= "La resta de <b>a</b> y <b>b</b> es: " + c;
var c = a * b; // // Se multiplican los dos valores.
[Link]("multiplicacion").innerHTML
= " Multiplicación de <b>a</b> y <b>b</b> es: " + c;
var c = a / b; // // Se divide a entre b.
[Link]("division").innerHTML
= " La División de <b> a</b> y <b>b</b> es: " + c;
</script>
</body>
</html>
La salida es:
3.1.4. Funciones
Las funciones son bloques "autocontenidos" de códigos organizados que se utilizan para
realizar una tarea específica.
A veces escribimos un código que se va a utilizar una y otra vez, entonces es mejor poner
este código dentro de una "función" y "llamar" a esa función siempre que sea necesario. Esto
ayuda a escribir el código de forma modular ya que cada función puede tener el conjunto de
declaraciones que hacen una tarea separada y específica. Las funciones también se utilizan
para dividir un programa grande en muchas partes pequeñas de código (o módulos). Las
funciones deben ser definidas antes de utilizarlas o llamarlas. La palabra clave "function" se
utiliza para definir una función cuyo nombre debe ser único y la lista de parámetros es
opcional. Los parámetros son los valores que se envían a la función al llamarla cuando se
186
Programación del lado del cliente
3.1. Introducción al lenguaje
llama a la función desde un código externo. La declaración dentro de una función se escribe
en un par de llaves como se muestra:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Funciones en JavaScript</title>
<script>
function saludos() {
[Link]("resultado")
.innerHTML = "Hola a todos";
}
</script>
</head>
<body>
<button onclick="saludos()">
Haz click aquí!
</button>
<p id="resultado"> </p>
</body>
</html>
La salida del script se muestra en la Ilustración 3.4
187
Programación del lado del cliente
3.1. Introducción al lenguaje
Una variable global es una variable que es visible (accesible) en todo el programa. Todas
las declaraciones de código y funciones de un código pueden acceder a la variable global.
Cuando se inicializa una variable en JavaScript, ésta se convierte automáticamente en una
variable global.
A diferencia de la variable global, una variable local es accesible sólo dentro de una
función donde está definida. Esto se llama también ámbito de la función. Si declaramos una
variable que tiene a la vez un ámbito local y un ámbito global con el mismo nombre, la
variable local tendrá prioridad cuando la utilicemos dentro de una función. Este tipo de
comportamiento se llama shadowing. El siguiente código muestra la diferencia entre ambos
tipos de variables:
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title> Variables Globales and Locales en JavaScript</title>
</head>
<body>
<p>Aquí se explican las diferencias entre variables globales y lcales.
</p>
<h2>Una variable local cuando se accede globalmente</h2>
<p id="variableLocalGlobal"></p>
<h2>Variable Local cuando se accede localmente</h2>
<p id="variableLocalLocal"></p>
<h2>Variable Global cuando se accede localmente</h2>
<p id="variableGloballocal"></p>
<h2>variable Global cuando se accede globalmente</h2>
188
Programación del lado del cliente
3.1. Introducción al lenguaje
<p id="variableGlobalGlobal"></p>
<script>
var animal = "León"; // se declara e inicializa una variable cadena.
unaFuncion();
//Aquí no esta definida la variable fruta
[Link]("variableLocalGlobal").innerHTML
= "Se llama una variable definida en unaFuncion(): El tipo de fruta
es " + typeof fruta;
function unaFuncion() {
var fruta = "Manzana";
//Aquí sí está definida la variable fruta, pero es local
[Link]("variableLocalLocal").innerHTML
= "En la llamada dentro de la función unaFuncion(), el tipo de
fruta es " + fruta;
//La variable animal no está definida aquí pero sí globalmente
[Link]("variableGloballocal").innerHTML
= "En la llamada dentro de la función unaFuncion() , el tipo de
animal es " + animal; }
</script>
</body>
</html>
La salida de programa es:
189
Programación del lado del cliente
3.1. Introducción al lenguaje
3.1.6. Cadenas
Una cadena es una secuencia finita de caracteres que puede contener números, caracteres
y espacios, etc. En JavaScript las cadenas se utilizan habitualmente para manipular y
almacenar texto. Una cadena puede almacenar cualquier tipo de texto dentro de comillas
simples o dobles, por ejemplo, var txt = "Pakistán, Rusia, Canadá, México, China";
La longitud de una cadena almacenada en una variable se puede encontrar con la ayuda
de una propiedad incorporada "length".
190
Programación del lado del cliente
3.1. Introducción al lenguaje
Los caracteres especiales como las comillas dobles (" "), las comillas simples (' ), la barra
invertida ( \ ), etc. también pueden formar parte de una cadena. Sin embargo, tenemos que
utilizar un carácter de escape "\" antes de estos caracteres especiales que los convierten en
una cadena.
Los programadores suelen evitar los códigos más largos en sus programas para que sean
más legibles y comprensibles. Podemos romper fácilmente la línea de código utilizando un
operador de barra negra "\".
[Link]. Arreglos
El índice de una matriz comienza en 0. [0] se utiliza para el primer elemento del arreglo,
[1] es para segundo elemento y así sucesivamente.
191
Programación del lado del cliente
3.1. Introducción al lenguaje
192
Programación del lado del cliente
3.1. Introducción al lenguaje
Se pueden usar las operaciones push() y pop() para agregar y eliminar elementos de un
arreglo:
<! DOCTYPE html>
<html>
<head>
<title>Métodos de arreglos JavaScript</title>
<meta charset="utf-8">
</head>
<body>
<p>EL Método "pop()" de JavaScript elimina el último elemento del
arreglo.</p>
<p>EL Método "push()" de JavaScript añade un elemento del arreglo en
la última posición.</p>
<button onclick="funcionPop()">Haz click para eliminar el último
elemento
</button>
<button onclick="funcionPush()">Haz click para añadir otro elemento
</button>
<p id="datos"></p>
<script>
var animales = ["Perro", "Gato", "Cebra", "Tigre"];
[Link]("datos").innerHTML = animales;
// Función para eliminar un elemento.
function funcionPop() {
[Link](); // Llamar a pop.
[Link]("datos").innerHTML = animales;
}
function funcionPush() {
[Link]("Venado"); //Llamar a push
[Link]("datos").innerHTML = animales;
}
</script>
</body>
</html>
Salida del programa:
193
Programación del lado del cliente
3.1. Introducción al lenguaje
Los eventos son acciones que pueden ser detectadas por JavaScript. Cada elemento de una
página web tiene ciertos eventos que pueden desencadenar funciones de JavaScript. Por
ejemplo, el evento onclick de un elemento de botón se puede configurar para llamar a una
función y hacer que se ejecute cada vez que un usuario haga clic en el botón.
<!DOCTYPE html>
<html>
<head>
<title>Manejo de errores en JavaScript</title>
<meta charset="utf-8">
</head>
<body>
<script>
onerror = errorHandler;
[Link]("Bienvenido al manejo de errores");
//Error deliberado
function errorHandler(message, url, line) {
out = "Lo siento, se encontró un error.\n\n";
out += "Error: " + message + "\n";
out += "URL: " + url + "\n";
out += "Línea: " + line + "\n\n";
194
Programación del lado del cliente
3.2. Manejo de frameworks
195
Programación del lado del cliente
3.2. Manejo de frameworks
‘Ahora, JavaScript es una parte esencial de la web, utilizada en el 95% de los sitios web,
y la web es una parte esencial de la vida moderna. Los usuarios escriben trabajos, gestionan
sus presupuestos, transmiten música, ven películas y se comunican con otros a grandes
distancias de forma instantánea, con texto, audio o videochat. La web nos permite hacer cosas
que antes sólo eran posibles en aplicaciones nativas instaladas en nuestros ordenadores. Estos
sitios web modernos, complejos e interactivos, suelen denominarse aplicaciones web.
‘Los frameworks de JavaScript impulsan gran parte del impresionante software de la web
moderna, incluidos muchos de los sitios web que probablemente utilices a diario. Por
ejemplo, MDN Web Docs, de donde se extrajo esta información, utiliza el framework
React/ReactDOM para potenciar su front-end. (MDN web Docs Moz:illa, 2021).
3.2.2. Angular
‘Angular es un marco de aplicación web de código abierto dirigido por el equipo de
Angular en Google y por una comunidad de personas y empresas. Es una reescritura completa
del mismo equipo que construyó AngularJS. Angular fue lanzado oficialmente el 14 de
septiembre de 2016.
196
Programación del lado del cliente
3.3. Estructuras de control
3.2.3. Vue
‘Evan You lanzó por primera vez Vue en 2014, después de trabajar y aprender del
proyecto original AngularJS. Vue es el más joven de los cuatro grandes, pero ha disfrutado
de un reciente repunte de popularidad.
‘Vue, al igual que AngularJS, extiende el HTML con parte de su propio código. Aparte
de eso, se basa principalmente en JavaScript moderno y estándar.
3.2.4. React
‘Facebook lanzó React en 2013. En ese momento, ya había estado utilizando React para
resolver muchos de sus problemas internamente. React en sí mismo no es técnicamente un
framework; es una biblioteca para renderizar componentes de interfaz de usuario. React se
utiliza en combinación con otras bibliotecas para hacer aplicaciones - React y React Native
permiten a los desarrolladores hacer aplicaciones móviles; React y ReactDOM les permiten
hacer aplicaciones web, etc.
React extiende JavaScript con una sintaxis similar a la de HTML, conocida como JSX.’
(MDN web Docs Moz:illa, 2021).
197
Programación del lado del cliente
3.3. Estructuras de control
198
Programación del lado del cliente
3.3. Estructuras de control
199
Programación del lado del cliente
3.3. Estructuras de control
El resultado se ve en
200
Programación del lado del cliente
3.3. Estructuras de control
3.3.3. Ciclos
A veces necesitamos ejecutar un comando o un grupo de instrucciones repetidamente en
nuestro programa. Así que para escribirlas una y otra vez, podemos escribirlas una vez en un
bloque y ejecutar el bloque repetidamente. Un bucle es un conjunto de sentencias que se
ejecutan hasta que una condición es verdadera. Es un método de flujo de control en un
programa de computadora. La tabla 5.2 tiene una lista de identificadores utilizados para la
implementación de bucles.
Tipo Descripción
201
Programación del lado del cliente
3.3. Estructuras de control
<head>
<meta charset="utf8">
<title>Ciclo while de JavaScript</title>
</head>
<body>
<h3>Lista de animales:</h3>
<p id="listaAnimales">
202
Programación del lado del cliente
3.3. Estructuras de control
</p>
<script>
var ArregloAnimales = ["Caballo", "Gato", "Perro", "Elefante",
"Tigre"];
var texto = "";
var i = 0;
while (i < [Link]) {
texto += ArregloAnimales[i] + "<br>";
i++;
}
[Link]("listaAnimales").innerHTML = texto;
</script>
</body>
</html>
En las sentencias do-while, el bucle se ejecuta una vez antes de comprobar la condición
del mismo. Incluso si las condiciones no son verdaderas, la primera ejecución se hará en
cualquier caso.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>Ciclo do-while de JavaScript</title>
</head>
203
Programación del lado del cliente
3.3. Estructuras de control
<body>
<h3>Lista de animales:</h3>
<p id="listaAnimales">
</p>
<script>
var ArregloAnimales = ["Caballo", "Gato", "Perro", "Elefante",
"Tigre"];
var texto = "";
var i = 0;
do {
texto += ArregloAnimales[i] + "<br>";
i++;
}
while (i < [Link])
[Link]("listaAnimales").innerHTML = texto;
</script>
</body>
</html>
3.3.4. Eventos
Se genera un evento como resultado de la acción del usuario. El usuario tiene la
posibilidad de introducir datos a través de un teclado, introducir su elección a través de un
ratón o cualquier otra interfaz periférica de la computadora. Un evento es una acción que
tiene lugar como resultado de estas tareas de usuario. Los programadores tienen que ocuparse
de estas entradas del usuario. La mayoría de los eventos incluyen los movimientos del ratón,
los clics y la pulsación de teclas, etc.
Cada elemento o etiqueta XHTML tiene su propia lista de eventos a los que puede
responder. Un mismo tipo de evento (por ejemplo, pulsar un botón del ratón) puede estar
definido para varios elementos XHTML diferentes y un mismo elemento XHTML puede
tener asociados varios eventos diferentes.
204
Programación del lado del cliente
3.3. Estructuras de control
El nombre de cada evento se construye mediante el prefijo on, seguido del nombre en
inglés de la acción asociada al evento. Así, el evento de pinchar un elemento con el ratón se
denomina onclick y el evento asociado a la acción de mover el ratón se denomina
onmousemove.
onblur El elemento pierde el Es compatible con todos los elementos HTML EXCEPTO los
foco. El evento elementos HTML : <base>, <bdo>, <br>, <head>, <html>,
opuesto es onfocus <iframe>, <meta>, <param>, <script>, <style> y <title>
205
Programación del lado del cliente
3.3. Estructuras de control
Los eventos más utilizados en las aplicaciones web tradicionales son onload para esperar a
que se cargue la página por completo, los eventos onclick, onmouseover, onmouseout para
controlar el ratón y onsubmit para controlar el envío de los formularios.
206
Programación del lado del cliente
3.3. Estructuras de control
Es el método más sencillo y también el menos recomendado por ser el menos profesional
por incluir el código JavaScript a ejecutar cuando se genera un evento. El código se incluye
en un atributo dentro del elemento XHTML. Considere el ejemplo siguiente, se necesita
mostrar un mensaje cuando el usuario haga clic con el ratón en un botón:
<input type="button" value="Haga clic aquí" onclick="alert('Ha hecho clic en
el botón');" />
Con esta técnica, se definen atributos XHTML con el mismo nombre que los eventos que
se quieren manejar. El ejemplo, se controla un evento del ratón, cuyo nombre es onclick.
Así, el elemento XHTML para el que se quiere definir este evento, debe incluir un atributo
llamado onclick.
El atributo es una cadena de texto que incluye las instrucciones JavaScript que deben ejecutarse
cuando se genera el evento. En este caso, el código JavaScript es muy sencillo: (alert('Ha hecho
clic en el botón');) muestra una ventana modal con un mensaje.
Otro ejemplo, el usuario hace clic en un elemento <div> que muestra un mensaje y cuando
el usuario pasa el ratón por encima del elemento, se muestra otro mensaje:
<div onclick="alert('Ha hecho clic con el ratón');" onmouseover="alert('Pasó
el ratón por encima del elemento');">
Puede hacer clic en este elemento o pasar el ratón por encima.
</div>
El evento onload es uno de los más utilizados porque nos asegura que están disponibles
todos los archivos y funciones que permiten acceder y manipular los nodos del árbol DOM
que se construye dinámicamente al cargar la página.
207
Programación del lado del cliente
3.3. Estructuras de control
JavaScript define una variable especial llamada this que se crea automáticamente y que
se emplea para hacer más legible el código. En los eventos, se puede utilizar la variable this
para referirse al elemento XHTML que ha provocado el evento.
Aunque agregar código javascript en los atributos XHTML es más sencillo. Tiene el
problema de complicar la programación en cuanto se añaden más instrucciones, por lo que
solamente es recomendable para los casos más sencillos. Sus principales desventajas son:
1. Se mezcla código HTML con código Javascript, cuando lo ideal es que estén
separados.
Usar los eventos en los atributos XHTML es la técnica más sencilla para empezar a
entender JavaScript. El problema que se complica en exceso en cuanto se añaden más
eventos, por lo que solamente es recomendable para los casos más sencillos.
}
}
Como puede verse, el manejo de borderColor se complica por la forma en la que
diferentes navegadores guardan el valor de la propiedad borderColor. Firefox almacena (en
caso de que los cuatro bordes coincidan en color) el valor simple black, Internet Explorer lo
almacena como black black black black y Opera almacena su representación
hexadecimal #000000.
Mezclar los atributos XHTML o las funciones externas para añadir manejadores de
eventos tiene un grave inconveniente: "ensucian" el código XHTML de la página.
function miMensaje() {
[Link]('Gracias por hacer clic');
}
[Link]("clicable").onclick = miMensaje;
Hay que notar que, cuando se asigna la función al evento, ésta no lleva paréntesis. Si los
llevara, se estaría asignando el valor de retorno de la función y la referencia a la misma.
210
Programación del lado del cliente
3.3. Estructuras de control
Para poder usar este método, es necesario que el DOM esté completamente construido, lo
que implica que la página debe estar completamente cargada. Para asegurarse de ello, se
puede usar el evento onload:
[Link] = function() {
[Link]("clicable").onclick = miMensaje;
}
Como se ve, se utiliza una función anónima que se asigna al evento onload.
Además de los eventos vistos hasta ahora, los naevegadores incluyen un mecanismo
denominado flujo de eventos o "event flow". Éste permite que varios elementos diferentes
puedan responder a un mismo evento. Con ello es posible asignar a un botón el evento
onClick y su vez asignarlo a otra función que se encuentre en un <div> superior o asignarlo
a otra función que ejecute el <body> de la página. Así un clic de un botón puede ejecutarse
en tres elementos distintos de la página. Se ha establecido un orden de ejecución que se
conoce como flujo de eventos. Hay que tener en cuenta que existen muchas diferencias en el
flujo de eventos entre navegadores.
1. Burbujeo de eventos. Los eventos se ejecutan desde el elemento más interno hasta el
más externo o el elemento más específico hasta el más específico. Este modelo lo
soportan los navegadores basados en la familia Mozilla como Firefox.
211
Programación del lado del cliente
3.3. Estructuras de control
3. Eventos DOM El DOM soporta tanto, event bubbling como event capturing, pero el
event capturing se ejecuta primero y la mayoría de navegadores que cumplen el
standard, continúan el flujo hasta el objeto window. El elemento más específico del
flujo de eventos no es el <div> que desencadena la ejecución de los eventos, sino el
nodo de tipo Button que contiene el <div>. Cuando se combinan los dos flujos de
eventos, se tienen como consecuencia que el nodo más específico pueda ejecutar dos
eventos uno detrás de otro.
En los subtemas anteriores se habló del concepto event handler o manejador de eventos
como la función encargada de administrar los eventos que se producen. Pero ¿Qué sucede si
se desea más de un controlador por evento? La especificación DOM proporciona dos técnicas
similares a las disponibles para Internet Explorer y se llaman addEventListener() y
removeEventListener() para asociar y desasociar manejadores de eventos.
212
Programación del lado del cliente
3.3. Estructuras de control
La principal diferencia entre estos métodos y los anteriores es que en este caso se requieren
tres parámetros: el nombre del "event listener", una referencia a la función encargada de
procesar el evento y el tipo de flujo de eventos al que se aplica.
function suMensaje() {
[Link]("Has hecho clic el ratón y ejecuta otra función");
}
213
Programación del lado del cliente
3.3. Estructuras de control
El estándar DOM establece que el objeto event debe tener un único parámetro que deben
de recibir las funciones para procesar eventos. En caso de que no se vea ningún parámetro en
la función, se puede acceder al objeto event a través del array de los argumentos de la
función, esto sólo en caso que los navegadores sigan el estándar.
[Link] = function() {
var miDivEvento = arguments[0];
}
En los navegadores que siguen los estándares, en caso de que no se pase el parámetro, lo
crean automáticamente y lo pasan entonces a la función asignada para manejar el evento.
En la tabla vemos las propiedades definidas para el objeto event en los navegadores que
siguen el standard:
1. Botón izquierdo.
2. Botón derecho.
214
Programación del lado del cliente
3.3. Estructuras de control
4. Botón central.
charCode Entero El código UNICODE del carácter que corresponde a la tecla presionada
ctrlKey Entero Regresa TRUE se está presionada la tecla CTRL, falso en otro caso
detail Entero El número de veces que se han presionado los botones del ratón
1. Fase capturing
2. En el elemento destino
3. Fase bubbling
metaKey Entero Regresa TRUE si está presionada la tecla meta, FALSE en otro caso
shiftKey Booleano Regresa TRUE si se presionó la tecla shift. FALSE en otro caso
215
Programación del lado del cliente
3.3. Estructuras de control
Todas las propiedades del objeto event son de sólo lectura excepto altKey, button y
keyCode que son de lectura y escritura. La tecla META es una tecla que ya no se usa como tal
actualmente. Se asocia a la tecla alt o a la tecla de Windows y en las computadoras Mac se
asocia a la tecla Command.
3.3.5. Formularios
Los formularios web siempre ha sido una de las tareas fundamentales de JavaScript puesto
que la programación de aplicaciones la mayoría de las veces contienen uno o más. Una de
las principales razones por las que se creó el lenguaje de programación JavaScript fue la
necesidad de validar los datos de los formularios directamente en el navegador del usuario.
De esta forma, se evitaba recargar la página cuando el usuario cometía errores al rellenar los
formularios.
Los formularios y sus elementos, son objetos DOM que tienen propiedades únicas, que
otros objetos no poseen.
Cuando el navegador carga una página web, crea automáticamente un arreglo denominado
forms que contiene la referencia a todos los formularios de la página.
Para tener acceso al arreglo forms se hace a través del objeto document, entonces
[Link] contiene todos los formularios de la página. Para acceder elemento por
elemento se usa la sintaxis de arreglos usando un índice que empieza con el valor cero. Así,
para acceder al primer formulario tenemos:
[Link][0];
216
Programación del lado del cliente
3.3. Estructuras de control
También el navegador crea un arreglo de todos los elementos que pertenecen al formulario
correspondiente llamado elements. Si necesitamos acceder al primer elemento del
formulario se escribe:
[Link][0].elements[0];
Aunque es una forma rápida y sencilla, no se recomienda esta forma para acceder a los
elementos de un formulario, dado que éstos pueden cambiar a través del tiempo. La forma
más común de acceder a los elementos de un formulario es a través del atributo name o id.
Accediendo de esta manera siempre se tiene el acceso a cualquier formulario o elemento.
Dado el siguiente formulario se muestra cómo acceder a sus elementos:
<form name="formularioUno" >
<input type="text" name="elemento" id="elemento"/>
</form>
type <input> text, Indica el tipo de elemento del que se trata. Para text, button,
textarea checkbox, etc coincide. Para select hay dos posibles valores
button, select-one select-multiple que permite diferenciar
checkbox
selección simple o múltiple
<select>
217
Programación del lado del cliente
3.3. Estructuras de control
Cuando se tiene un conjunto de botones de radio se necesita saber cuál de todos ellos ha
sido seleccionado, puesto que son mutuamente excluyentes. Se usa un código parecido al
siguiente:
<input type="radio" value="si" name="pregunta" id="preguntaSi"/> SI
<input type="radio" value="no" name="pregunta" id="preguntaNo"/> NO
<input type="radio" value="nsnc" name="pregunta" id="preguntaNSC"/> NS/NC
var elementos = [Link]("pregunta");
Se parecen a los botones de radio, pero el usuario puede elegir ninguno, uno o más de uno.
Por ejemplo:
<input type="checkbox" value="condiciones" name="condiciones"
id="condiciones"/> He leído y acepto las condiciones
<input type="checkbox" value="privacidad" name="privacidad"
id="privacidad"/> He leído la política de privacidad
218
Programación del lado del cliente
3.3. Estructuras de control
elemento = [Link]("privacidad");
[Link]("Elemento: " + [Link] + "\n Verificado: " +
[Link]);
Se necesita obtener el valor del atributo value de la opción option elegida por el usuario.
Para obtener su valor se utilizan las siguientes propiedades:
1. options. Es un arreglo que se crea automáticamente por el navegador para cada lista
desplegable y contiene las referencias de todas las opciones de esa lista desplegable así que
se usa:
[Link]("idLista").options[0]
2. selectedIndex. Cuando el usuario selecciona una opción, el navegador actualiza el
valor de esta propiedad. Por lo que se usa el siguiente código para acceder al elemento
seleccionado:
[Link]("opciones").options[[Link]("opcione
s").selectedIndex]
Es común acceder a los valores del siguiente modo:
[Link]("opciones").options[[Link]].valu
u obtener el texto que corresponde al valor seleccionado:
[Link]("opciones").options[[Link]].text
No se debe confundir el valor de la propiedad selectedIndex con el valor
correspondiente a la propiedad value de la opción seleccionada. El primero es un índice del
arreglo options y el segundo el valor que tiene la opción elegida por el usuario.
if([Link][0].[Link] > 0) {
[Link][0].elements[0].focus();
}
}
El campo no debe de ser de tipo hidden
<textarea id="texto"
onkeypress="return limitaCaracteres(100);"></textarea>
220
Programación del lado del cliente
3.3. Estructuras de control
// Sólo letras
<input type="text" id="texto" onkeypress="return caracteresPermitidos
(event, 'car')" />
Las ventanas emergentes son pequeñas ventanas de alerta que se muestran en el navegador
para mostrar alguna información. JavaScript tiene tres tipos de cuadros emergentes:
Ventana de alerta. Una ventana de alerta es una ventana de diálogo especial que se muestra
cuando ocurre algo que requiere la atención del usuario. Cuando aparece, el usuario tendrá
que hacer clic en "Aceptar" para seguir adelante.
Cuando aparece un cuadro de confirmación, el usuario tiene dos opciones: puede hacer
clic en el botón "Aceptar" o "Cancelar" para continuar. Si el usuario hace clic en el botón
222
Programación del lado del cliente
3.3. Estructuras de control
Ventana de consulta. Una ventana de consulta se utiliza cuando se desea que el usuario
introduzca un valor. Cuando aparece, el usuario tendrá que hacer clic en "Aceptar" o
"Cancelar" para continuar después de introducir un valor. Si el usuario hace clic en "Aceptar"
el cuadro devolverá el valor introducido. Si el usuario hace clic en "Cancelar", la caja
devolverá un valor nulo (Nada).
223
Programación del lado del cliente
3.3. Estructuras de control
[Link]("pregunta").innerHTML = txt;
}
</script>
</body>
</html>
JavaScript se usa mucho del lado del cliente para la validación de los datos de entrada,
permitiendo al usuario corregirlos si es que hay algún error antes de enviarlos al servidor.
Esto da una mejor experiencia, ya que no necesita esperar la respuesta del servidor para saber
que ha habido un error.
Lo más común es mandar a traer una función de validación cuando el usuario hace clic en
el botón enviar. En esta función se comprueba que cada valor del formulario sea correcto.
Otra forma de validar es cuando el campo del formulario pierde el foco o ha sido
modificado. En ese momento se puede mandar a traer una función que valide un campo en
específico.
Validación
224
Programación del lado del cliente
3.3. Estructuras de control
Campo obligatorio
Expresión regular
225
Programación del lado del cliente
3.3. Estructuras de control
return true;
}
</script>
Se recomienda poner el mensaje al lado o debajo del campo que no cumple la validación
para ayudar al usuario a identificar rápidamente la posición del error.
Validación Código
valor = [Link]("campo").value;
Campo
if( valor == null || [Link] == 0 || /^\s+$/.test(valor)
obligatorio ) {
return false;
}
valor = [Link]("campo").value;
Valores
if( isNaN(valor) ) {
numéricos return false;
}
indice = [Link]("opciones").selectedIndex;
Seleccionar
if( indice == null || indice == 0 ) {
una opción return false;
Con la lista siguiente:
<select id="opciones" name="opciones">
<option value="">- Selecciona un valor -</option>
<option value="1">Primer valor</option>
<option value="2">Segundo valor</option>
<option value="3">Tercer valor</option>
</select>
dato = [Link]("campo").value;
Correo
if( !(/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-
electrónico .]\w+)/.test(dato)) ) {
return false;
var anio = [Link]("anio").value;
Validar fecha
var mes = [Link]("mes").value;
var dia = [Link]("dia").value;
226
Programación del lado del cliente
3.4. Manipulación de objetos
if( !isNaN(fecha) ) {
return false;
}
Los objetos en JavaScript, son sencillamente tablas hash: que constan de un grupo de
propiedades y funciones que se acceden a través de una clave. Las propiedades y métodos
(que son propiedades cuyo valor es una referencia a una función) de un objeto es posible
crearlos dinámicamente en tiempo de ejecución.
var objeto = {
"propiedad" : "bar",
"holaFuncion" : function() { [Link]("Hola a todos!"); }
};
227
Programación del lado del cliente
3.4. Manipulación de objetos
Las comillas dobles alrededor del nombre de la propiedad son opcionales en caso de que
no sea una palabra reservada y sea un identificador legal de JavaScript. Por ejemplo "primer-
nombre", usa guión medio y no sería un identificador válido y son necesarias, pero
primer_nombre sí es un identificador válido y no necesita comillas dobles. También una
propiedad puede contener la definición de otro objeto:
var vuelo = {
aerolinea: "Airlines",
numero: 811,
partida: {
clave: "SID",
fechaHora: "2021-09-22 14:55",
ciudad: "Sidney"
},
llegada: {
clave: "LA",
fechaHora: "2021-09-23 10:42",
ciudad: "Los Angeles"
}
};
Se pueden añadir propiedades en tiempo de ejecución, indicando el nombre y su valor.
var Vuelo = {
aerolinea: "Airlines",
numero: 811,
partida: {
clave: "SID",
fechaHora: "2021-09-22 14:55",
ciudad: "Sidney"
},
llegada: {
clave: "LA",
fechaHora: "2021-09-23 10:42",
ciudad: "Los Angeles"
}
};
228
Programación del lado del cliente
3.4. Manipulación de objetos
[Link]. Acceso
Para acceder a los valores de un objeto se puede indicar el nombre de la propiedad dentro
de unos corchetes ([ ]), como si accediésemos a un elemento de un arreglo. En caso de que
el nombre de la propiedad sea un nombre legal de JavaScript, y no sea una palabra reservada,
se puede utilizar la notación de punto(.). <Se recomienda usar la notación punto(.), porque
es más corta y se usa comúnmente para acceder a métodos y propiedades en otros lenguajes
orientados a objetos:
vuelo["aerolinea"] // "Airlines"
[Link] // "SID"
En caso de que no exista la propiedad de devuelve el valor undefined. Se tienen dos
operadores para manejar undefined. Se usa || para obtener valores por defecto:
var nodefinida = nombre["apellidoMaterno"] || "(none)";
var estado = [Link] || "Desconocido"
El operador && se usa para cuando queremos evitar que se lance una excepción
TypeError:
[Link] // undefined
[Link] // TypeError: Cannot read property 'model' of undefined
[Link] && [Link] // undefined
[Link]. Modificación
[Link]. Eliminación
229
Programación del lado del cliente
3.4. Manipulación de objetos
// a, b, y c hacen referencia a
// diferentes objetos vacíos
var a = {}, b = {}, c = {};
// a, b, y c hacen referencia al
// mismo objeto vacío
a = b = c = {};
var objeto { value = 5 };
[Link]([Link]); // [Link] = 5
function cambia(objeto)
{
[Link] = 6;
}
cambia(objeto);
[Link]([Link]); // [Link] = 6
En JavaScript se crean variables globales de una forma sencilla, Sólo que se desaconseja
su uso porque las variables globales perjudican directamente la calidad de los programas, por
lo que hay que evitarlas en la medida de lo posible. Una forma adecuada de minimizar la
utilización de variables globales, es tener una única variable global para toda la aplicación,
que incluya el resto de variables.
230
Programación del lado del cliente
3.4. Manipulación de objetos
231
Programación del lado del cliente
Competencias específicas y genéricas
Competencias genéricas
Solución a problemas.
Capacidad de aprender.
232
Programación del lado del servidor
4.1. Introducción al lenguaje
[Link]. Java
Java es un programa potente, de código abierto, robusto y seguro basado en la web que
puede ejecutarse como un programa independiente o como un applet incrustado en un sitio
web. Servlets (controlador), JSP (vista), Java (modelo) crea aplicaciones basadas en la web
utilizando MVC (Modelo-Vista-Controlador). Para crear una aplicación web segura Java
tiene muchos marcos como Apache Struts Spring y web_application_frameworks .
[Link]. Perl
Perl fue introducido en 1987 (4 años antes que el propio Linux), cuando su autor, Larry
Wall, lanzó la versión 1.000 del mismo. La razón de su creación fue que Wall estaba
descontento por la funcionalidad que sed, C, awk y el Bourne Shell le ofrecían. Buscó un
lenguaje que combinara todas sus mejores características, y que a la vez tuviera el menor
número de desventajas propias.
233
Programación del lado del servidor
4.1. Introducción al lenguaje
Desde entonces, perl ha tenido varias versiones, cada una de las cuales ha añadido
funciones adicionales, por ejemplo, referencias duras, módulos, objetos y alcance léxico.
Perl se hizo especialmente popular como lenguaje para escribir scripts del lado del
servidor para servidores web. Pero ese no es el único uso de Perl, ya que es comúnmente
utilizado para tareas de administración de sistemas, gestión de datos de bases de datos, así
como para escribir aplicaciones GUI.
[Link]. PHP
PHP está disponible para la mayoría de los sistemas operativos, incluidos Unix y
Windows, y es un excelente lenguaje de programación del lado del servidor para
programación profesional.
[Link]. CGI
Common Gateway Interface (CGI) es un estándar para que los servidores web tengan una
interfaz con programas ejecutables instalados en un servidor que generan páginas web de
forma dinámica. Estos programas se conocen como scripts CGI o o simplemente CGI; suelen
estar escritos en un lenguaje de scripting, pero pueden escrito en cualquier lenguaje de
programación.
234
Programación del lado del servidor
4.1. Introducción al lenguaje
‘Cuando PHP analiza un archivo, busca las etiquetas de apertura y cierre, que son <?php
y ?>, y que indican a PHP dónde empezar y finalizar la interpretación del código. Este
mecanismo permite embeber a PHP en todo tipo de documentos, ya que todo lo que esté
fuera de las etiquetas de apertura y cierre de PHP será ignorado por el analizador.
235
Programación del lado del servidor
4.1. Introducción al lenguaje
‘El texto que esté fuera de un par de etiquetas de apertura y cierre se ignora por el intérprete
de PHP, pero sí lo envía al flujo de salida, lo que permite que los ficheros de PHP tengan
contenido mixto. Esto hace que PHP pueda ser embebido en documentos HTML para, por
ejemplo, crear plantillas.
<p>Esto va a ser ignorado por PHP y mostrado por el navegador.</p>
<?php echo 'Mientras que esto va a ser interpretado.'; ?>
<p>Esto también será ignorado por PHP y mostrado por el navegador.</p>
Este ejemplo funciona como estaba previsto, porque cuando PHP intercepta las etiquetas
de apertura <?php y cierre ?>, e interpreta todo el código que encuentre (a excepción de una
nueva línea inmediatamente después;) hasta que dé con otra etiqueta de apertura a menos que
se encuentre en mitad de una sentencia condicional, en cuyo caso el intérprete determinará
el resultado de la condición antes de tomar una decisión de qué es lo que tiene que saltar.
<?php if ($expresión == true): ?>
<p>Esto se mostrará si la expresión es verdadera.</p>
<?php else: ?>
<p>En caso contrario se mostrará esto.</p>
<?php endif; ?>
En este ejemplo, PHP saltará los bloques donde la condición no se cumpla, incluso si están
fuera de las etiquetas de apertura/cierre de PHP, los saltará según la condición debido a que
el intérprete salta los bloques contenidos dentro de una condición que no se cumpla. La regla
también se aplica para otras estructuras como las repetitivas.
Para imprimir bloques de texto grandes, es más eficiente abandonar el modo intérprete de
PHP que enviar todo el texto a través de echo o print.
‘PHP es un lenguaje que no está orientado a tipos. Sin embargo, en la siguiente tabla se
resumen los tipos más importantes que se manejan dinámicamente en el lenguaje.
Tipo Descripción
236
Programación del lado del servidor
4.1. Introducción al lenguaje
falso
Los enteros. Se especifican usando notación decimal (base 10), hexadecimal (base 16),
octal (base 8) o binaria (base 2), pueden ir precedidos por un signo (- o +).
237
Programación del lado del servidor
4.1. Introducción al lenguaje
Los números de punto flotante (también conocidos como "de coma flotante" en español,
y "floats" en inglés) pueden ser especificados usando cualquiera de las siguientes sintaxis:
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
$d = 1_234.567; // a partir de PHP 7.4.0
?>
El tamaño de un número de punto flotante depende de la plataforma, aunque un valor
común consiste en un máximo de aproximadamente 1.8e308 con una precisión cercana a los
14 dígitos decimales (el formato de 64 bit del IEEE).
‘Los números de punto flotante tienen una precisión limitada. Aunque depende del
sistema, PHP típicamente utiliza el formato de doble precisión IEEE 754, el cual dará un
error relativo máximo por aproximación del orden de 1.11e-16. Las operaciones aritméticas
elementales no podrán generar grandes errores y, por supuesto, se han de considerar los
errores por propagación al componer varias operaciones.
Por tanto, nunca se ha de confiar en resultados de números flotantes hasta el último dígito,
y no comparar la igualdad de números de punto flotante directamente. Si fuera necesaria una
238
Programación del lado del servidor
4.1. Introducción al lenguaje
mayor precisión, están disponibles las funciones matemáticas de precisión arbitraria y las
funciones de gmp.
Un string, o cadena, es una serie de caracteres donde cada carácter es lo mismo que un
byte. Esto significa que PHP solo admite un conjunto de 256 caracteres, y de ahí que no
ofrezca soporte nativo para Unicode.
Para especificar una comilla simple literal, es necesario escapar el carácter con una barra
invertida (\). Para una barra invertida literal, se duplica (\\). Todas las demás instancias de
barras invertidas serán tratadas como una barra invertida literal: esto significa que otras
secuencias de escape que podrían utilizarse, tales como \r o \n, serán mostradas literalmente
tal y como se especifican, en lugar de tener cualquier otro significado especial.
Nota: A diferencia de las sintaxis de entrecomillado doble y heredoc, las variables y las
sentencias de escape para caracteres especiales no se expandirán cuando estén incluidas
dentro de un string entre comillas simples.
<?php
echo 'Esto es una cadena sencilla';
239
Programación del lado del servidor
4.1. Introducción al lenguaje
Entrecomillado doble. Si un string está delimitado con comillas dobles ("), PHP
interpretará las siguientes secuencias de escape como caracteres especiales:
Secuencia Significado
\\ barra invertida
\$ signo de dólar
Existen dos tipos de sintaxis: una simple y otra compleja. La sintaxis simple es la más
empleada y práctica. Proporciona una forma de embeber una variable, un valor de un array o
una propiedad de un object dentro de un string con el mínimo esfuerzo.
La sintaxis compleja puede ser reconocida por las llaves que delimitan la expresión.
Sintaxis compleja (llaves). Esta sintaxis no se llama compleja porque sea compleja, sino
porque permite el empleo de expresiones complejas.
$genial = 'fantástico';
// Funciona
echo "Este cuadrado tiene {$cuadrado->width}00 centímetros de lado.";
// Funciona
echo "Esto funciona: {$arr[4][3]}";
// Funciona.
echo "Esto funciona: " . $arr['foo'][3];
241
Programación del lado del servidor
4.1. Introducción al lenguaje
?>
Funciones y operadores útiles. Los string pueden ser concatenados empleando el
operador '.' (punto). Fíjese que el operador '+' (suma) no servirá para concatenar.
Hay una serie de funciones útiles para la manipulación de string. Finalmente, también
existen las funciones para el tipo carácter.
242
Programación del lado del servidor
4.1. Introducción al lenguaje
una expresión donde sea necesario un string. Esto ocurre cuando se utilizan las funciones
echo o print, o cuando se compara una variable con un string.
El valor true del tipo boolean es convertido al string "1". El valor false del tipo boolean es
convertido al string "" (el string vacío). Esto permite la conversión en ambos sentidos entre
los valores de los tipos boolean y string.
Si el string no contiene ninguno de los caracteres '.', 'e', o 'E', y el valor numérico está entre
los límites del tipo integer (tal como está definido por PHP_INT_MAX), el string será
evaluado como un integer. En todos los demás casos será evaluado como un float.
El valor es dado por la parte inicial del string. Si el string empieza con un dato numérico
válido, éste será el valor empleado. De lo contrario, el valor será 0 (cero). Un dato numérico
válido es un signo opcional, seguido de uno o más dígitos (opcionalmente puede contener un
punto decimal), seguido de un exponente opcional. El exponente es una 'e' o 'E' seguida de
uno o más dígitos.
<?php
$foo = 1 + "10.5"; // $foo es float (11.5)
$foo = 1 + "-1.3e3"; // $foo es float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo es integer (1)
$foo = 1 + "bob3"; // $foo es integer (1)
$foo = 1 + "10 pequeños cerdos"; // $foo es integer (11)
$foo = 4 + "10.2 pequeños cerditos"; // $foo es float (14.2)
243
Programación del lado del servidor
4.1. Introducción al lenguaje
Tipo Descripción
array Un mapa ordenado que asocia valores con claves. Un valor también puede ser
otro array o un objeto. Es la base para lista (vector), tabla asociativa (tabla hash
- una implementación de un mapa -), diccionario, colección, pila, cola y otras.
iterable es un seudotipo que acepta cualquier array u objeto que implemente la interfaz
traversable y se puede recorrer con un foreach. Por lo tanto, acepta variables
tipo array o traversable
Para comprobar el tipo y el valor de una expresión, utilice la función var_dump(). Para
obtener una representación legible por humanos de un tipo con propósitos de depuración, use
la función gettype(). Para comprobar un cierto tipo, no emplee gettype(), si no las funciones
is_tipo. Algunos ejemplos:
<?php
$un_bool = TRUE; // un valor booleano
$un_str = "foo"; // una cadena de caracteres
$un_str2 = 'foo'; // una cadena de caracteres
$un_int = 12; // un número entero
En PHP las variables se representan con un signo de dólar seguido por el nombre de la
variable. El nombre de la variable es sensible a minúsculas y mayúsculas.
Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre
de variable válido tiene que empezar con una letra o un carácter de subrayado (underscore),
seguido de cualquier número de letras, números y caracteres de subrayado. Como expresión
regular se podría expresar como: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
<?php
$var = 'Roberto';
$Var = 'Juan';
echo "$var, $Var"; // imprime "Roberto, Juan"
De forma predeterminada, las variables siempre se asignan por valor. Esto significa que
cuando se asigna una expresión a una variable, el valor completo de la expresión original se
copia en la variable de destino. Esto quiere decir que, por ejemplo, después de asignar el
valor de una variable a otra, los cambios que se efectúen a una de esas variables no afectará
a la otra. Para más información sobre este tipo de asignación, vea Expresiones.
PHP también ofrece otra forma de asignar valores a las variables: asignar por referencia.
Esto significa que la nueva variable simplemente referencia (en otras palabras, "se convierte
245
Programación del lado del servidor
4.1. Introducción al lenguaje
en un alias de" o "apunta a") la variable original. Los cambios a la nueva variable afectan a
la original, y viceversa.
Para asignar por referencia, simplemente se antepone un signo ampersand (&) al comienzo
de la variable cuyo valor se está asignando (la variable fuente). Por ejemplo, el siguiente
segmento de código produce la salida 'Mi nombre es Nico' dos veces:
<?php
$foo = 'Nico'; // Asigna el valor 'Bob' a $foo
$bar = &$foo; // Referenciar $foo vía $bar.
$bar = "Mi nombre es $bar"; // Modifica $bar...
echo $bar;
echo $foo; // $foo también se modifica.
?>
No es necesario inicializar variables en PHP, sin embargo, es una muy buena práctica. Las
variables no inicializadas tienen un valor predeterminado de acuerdo a su tipo dependiendo
del contexto en el que son usadas - las booleanas se asumen como false, los enteros y
flotantes como cero, las cadenas ([Link]. usadas en echo) se establecen como una cadena vacía
y los arrays se convierten en un array vacío.
‘El ámbito de una variable es el contexto dentro del que la variable está definida. La mayor
parte de las variables PHP sólo tienen un ámbito simple. Este ámbito simple también abarca
los ficheros incluídos y los requeridos. Por ejemplo:
<?php
$a = 1;
include '[Link]';
?>
Aquí, la variable $a estará disponible al interior del script incluido [Link]. Sin embargo, al
interior de las funciones definidas por el usuario se introduce un ámbito local a la función.
246
Programación del lado del servidor
4.1. Introducción al lenguaje
Cualquier variable usada dentro de una función está, por omisión, limitada al ámbito local de
la función. Por ejemplo:
<?php
$a = 1; /* ámbito global */
function test()
{
echo $a; /* referencia a una variable del ámbito local */
}
test();
?>
Este script no producirá salida, ya que la sentencia echo utiliza una versión local de la
variable $a, a la que no se ha asignado ningún valor en su ámbito. Puede que usted note que
hay una pequeña diferencia con el lenguaje C, en el que las variables globales están
disponibles automáticamente dentro de la función a menos que sean expresamente
sobreescritas por una definición local. Esto puede causar algunos problemas, ya que la gente
puede cambiar variables globales inadvertidamente. En PHP, las variables globales deben ser
declaradas globales dentro de la función si van a ser utilizadas dentro de dicha función.
function Suma()
{
global $a, $b;
$b = $a + $b;
}
Suma();
echo $b;
?>
El script anterior producirá la salida 3. Al declarar $a y $b globales dentro de la función,
todas las referencias a tales variables se referirán a la versión global. No hay límite al número
de variables globales que se pueden manipular dentro de una función.
Un segundo método para acceder a las variables desde un ámbito global es usando el array
$GLOBALS. El ejemplo anterior se puede reescribir así:
247
Programación del lado del servidor
4.1. Introducción al lenguaje
<?php
$a = 1;
$b = 2;
function Suma()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Suma();
echo $b;
?>
Uso de variables static. Otra característica importante del ámbito de las variables es la
variable estática. Una variable estática existe sólo en el ámbito local de la función, pero no
pierde su valor cuando la ejecución del programa abandona este ámbito. Consideremos el
siguiente ejemplo:
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>
Esta función tiene poca utilidad ya que cada vez que es llamada asigna a $a el valor 0 e
imprime un 0. La sentencia $a++, que incrementa la variable, no sirve para nada, ya que en
cuanto la función finaliza, la variable $a desaparece. Para hacer una función útil para contar,
que no pierda la pista del valor actual del conteo, la variable $a debe declararse como estática:
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>
248
Programación del lado del servidor
4.1. Introducción al lenguaje
‘A veces es conveniente tener nombres de variables variables. Dicho de otro modo, son
nombres de variables que se pueden definir y usar dinámicamente. Una variable normal se
establece con una sentencia como:
<?php
$a = 'hola';
?>
Una variable variable toma el valor de una variable y lo trata como el nombre de una
variable. En el ejemplo anterior, hola, se puede usar como el nombre de una variable
utilizando dos signos de dólar. Es decir:
<?php
$$a = 'mundo';
?>
<?php
echo "$a $hola";
?>
Para usar variables variables con arrays hay que resolver un problema de ambigüedad. Si
se escribe $$a[1], el intérprete necesita saber si nos referimos a utilizar $a[1] como una
variable, o si se pretendía utilizar $$a como variable y el índice [1] como índice de dicha
variable. La sintaxis para resolver esta ambigüedad es: ${$a[1]} para el primer caso y
${$a}[1] para el segundo.
También se puede acceder a las propiedades de una clase usando el nombre de propiedad
variable. Este será resuelto dentro del ámbito del cual se hizo la llamada. Por ejemplo, en la
249
Programación del lado del servidor
4.1. Introducción al lenguaje
expresión $foo->$bar, se buscará $bar en el ámibto local y se empleará su valor será como
el nombre de la propiedad de $foo. Esto también es cierto si $bar es un acceso a un array.
También se pueden usar llaves para delimitar de forma clara el nombre de la propiedad.
Son muy útiles al acceder a valores dentro una propiedad que contiene un array, cuando el
nombre de la propiedad está compuesto de múltiples partes, o cuando el nombre de la
propiedad contiene caracteres que de otro modo no son válidos ([Link]. desde json_decode() o
SimpleXML).
<?php
class foo {
var $bar = 'Soy bar.';
var $arr = array('Soy A.', 'Soy B.', 'Soy C.');
var $r = 'Soy r.';
}
$start = 'b';
$end = 'ar';
echo $foo->{$start . $end} . "\n";
$arr = 'arr';
echo $foo->$arr[1] . "\n";
echo $foo->{$arr[1]} . "\n";
?>
250
Programación del lado del servidor
4.1. Introducción al lenguaje
251
Programación del lado del servidor
4.1. Introducción al lenguaje
Esto creará dos cookies separadas, aunque MiCookie será un array simple en el script. Si
se quiere definir una sola cookie con valores múltiples, considere el uso de la función
serialize() o explode() primero en el valor.
Nótese que una cookie reemplazará a una cookie anterior que tuviese el mismo nombre
en el navegador a menos que la ruta o el dominio fuesen diferentes.
4.1.4. Expresiones
‘Las expresiones son los bloques de construcción más importantes de PHP. En PHP casi
todo lo que se escribe es una expresión.
Las formas más básicas de expresiones son las constantes y las variables. Cuando se
escribe "$a = 5", se está asignando '5' a $a. '5', obviamente, tiene el valor 5, o en otras
palabras, '5' es una expresión con el valor de 5 (en este caso, '5' es una constante entera).
Después de esta asignación, se espera que el valor de $a sea 5 también, por lo que si se
escribe $b = $a, se espera que esto se comporte tal como si se escribiera $b = 5. En otras
palabras, $a es también una expresión con el valor 5. Si todo funciona bien, esto es
exactamente lo que sucederá.
Existe una expresión más que le puede parecer rara si no la ha visto en otros lenguajes, el
operador condicional ternario:
<?php
$primero ? $segundo : $tercero
?>
252
Programación del lado del servidor
4.1. Introducción al lenguaje
4.1.5. Operadores
‘Un operador es algo que toma uno más valores (o expresiones, en la jerga de
programación) y produce otro valor (de modo que la construcción en si misma se convierte
en una expresión).
Los operadores se pueden agrupar de acuerdo con el número de valores que toman. Los
operadores unarios toman sólo un valor, por ejemplo ! (el operador lógico de negación) o ++
(el operador de incremento). Los operadores binarios toman dos valores, como los familiares
operadores aritméticos + (suma) y - (resta), y la mayoría de los operadores de PHP entran en
esta categoría. Finalmente, hay sólo un operador ternario, ? :, el cual toma tres valores;
usualmente a este se le refiere simplemente como "el operador ternario" (aunque podría tal
vez llamarse más correctamente como el operador condicional).
Cuando los operadores tienen igual precedencia su asociatividad decide cómo se agrupan.
Por ejemplo "-" tiene asociatividad a izquierda, así 1 - 2 - 3 se agrupa como (1 - 2) - 3 y se
evalúa a -4. "=", por otra parte, tiene asociatividad a derecha, así $a = $b = $c se agrupa como
$a = ($b = $c).
Los operadores de igual precedencia que no son asociativos no pueden usarse unos junto
a otros, por ejemplo, 1 < 2 > 1 es ilegal en PHP. La expresión 1 <= 1 == 1, por otro lado, es
legal, ya que el operador == tiene menos precedencia que el operador <=.
253
Programación del lado del servidor
4.1. Introducción al lenguaje
La siguiente tabla enumera los operadores en orden de precedencia, con los de más alta
precedencia al inicio. Los operadores en la misma línea tienen igual precedencia, en cuyo
caso la asociatividad decide el agrupamiento.
Izquierda [ array
Izquierda ** aritmética
Derecha ! Lógico
254
Programación del lado del servidor
4.2. Estructuras de control
Izquierda || Lógico
Derecha ?? Comparación
Izquierda ? : Ternario
Izquierda or Lógico
4.2.1 Sentencia IF
‘El constructor if es una de las características más importantes de muchos lenguajes,
incluido PHP. Permite la ejecución condicional de fragmentos de código. la expresión es
evaluada a su valor booleano. Si la expresión se evalúa como true, PHP ejecutará la
sentencia y si se evalúa como false la ignorará.
255
Programación del lado del servidor
4.2. Estructuras de control
<?php
if ($a > $b) {
echo "a es mayor que b";
}
?>
Con frecuencia se desea ejecutar una sentencia si una determinada condición se cumple y
una sentencia diferente si la condición no se cumple. Esto es para lo que sirve else. El else
extiende una sentencia if para ejecutar una sentencia en caso que la expresión en la sentencia
if se evalúe como false. Por ejemplo, el siguiente código deberá mostrar a es mayor que b
si $a es mayor que $b y a NO es mayor que b en el caso contrario:
<?php
if ($a > $b) {
echo "a es mayor que b";
} else {
echo "a NO es mayor que b";
}
?>
La sentencia else sólo es ejecutada si la expresión if es evaluada como false y si hay
algunas expresiones elseif - sólo se ejecuta si también todas son evaluadas como false
<?php
if ($a > $b) {
echo "a es mayor que b";
} elseif ($a == $b) {
echo "a es igual que b";
} else {
echo "a es menor que b";
}
?>
Puede haber varios elseif dentro de la misma sentencia if. La primera expresión elseif
(si hay alguna) que se evalúe como true sería ejecutada. En PHP también se puede escribir
'else if' (en dos palabras) y el comportamiento sería idéntico al de 'elseif' (en una sola palabra).
El significado sintáctico es ligeramente diferente, pero la conclusión es que ambos resultarían
tener exactamente el mismo comportamiento.
PHP ofrece una sintaxis alternativa para algunas de sus estructuras de control, a saber: if,
while, for, foreach, y switch. En cada caso, la forma básica de la sintaxis alternativa es
cambiar la llave de apertura por dos puntos (:) y la llave de cierre por endif;, endwhile;,
endfor;, endforeach;, o endswitch;, respectivamente.
<?php if ($a == 5): ?>
A es igual a 5
<?php endif; ?>
En el ejemplo anterior, el bloque HTML "A es igual a 5" está anidado dentro de una
sentencia if escrita en la sintaxis alternativa. El bloque HTML se mostraría solamente si $a
es igual a 5.
Los dos ejemplos siguientes son dos formas diferentes de escribir lo mismo, uno con una
serie de sentencias if y elseif, y el otro usando la sentencia switch:
<?php
if ($i == 0) {
257
Programación del lado del servidor
4.2. Estructuras de control
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
default:
echo "No hay coincidencia";
break;
}
?>
Es importante entender cómo la sentencia switch es ejecutada con el fin de evitar errores.
La sentencia switch ejecuta línea por línea (en realidad, sentencia por sentencia). Al
principio, ningún código es ejecutado. Solo cuando se encuentra una sentencia case cuya
expresión se evalúa a un valor que coincida con el valor de la con un valor que coincide con
el valor de la expresión switch, PHP comienza a ejecutar la sentencias. PHP continúa
ejecutando las sentencias hasta el final del bloque switch, o hasta la primera vez que vea una
sentencia break. Si no se escribe una sentencia break al final de la lista de sentencias de un
caso, PHP seguirá ejecutando las sentencias del caso siguiente.
while (expr)
sentencia
<?php
/* ejemplo 1 */
$i = 1;
258
Programación del lado del servidor
4.2. Estructuras de control
/* ejemplo 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
El bucle de arriba se ejecutaría exactamente una sola vez, ya que después de la primera
iteración, cuando la expresión verdadera es verificada, se evalúa como false ($i no es mayor
que 0) y termina la ejecución del bucle.
Hay una diferencia importante que debes tener en cuenta al usar el bucle do-while frente
a usar un simple bucle while: Y es cuando se realiza la condición de comprobación.
259
Programación del lado del servidor
4.2. Estructuras de control
Por el contrario, un bucle while simple evalúa la condición de prueba al principio del bucle
antes de que se realice cualquier ejecución en el bloque del bucle. Si por alguna razón su
condición de prueba se evalúa como falsa al principio del bucle, no se ejecutará nada del
código dentro de su bucle.
Cada una de las expresiones puede estar vacía o contener múltiples expresiones separadas
por comas. En expr2, todas las expresiones separadas por una coma son evaluadas, pero el
resultado se toma de la última parte. Que expr2 esté vacía significa que el bucle debería ser
corrido indefinidamente (PHP implícitamente lo considera como true, como en C). Esto
puede no ser tan inútil como se pudiera pensar, ya que muchas veces se debe terminar el
bucle usando una sentencia condicional break en lugar de utilizar la expresión verdadera del
for.
Considere los siguientes ejemplos. Todos ellos muestran los números del 1 al 10:
260
Programación del lado del servidor
4.2. Estructuras de control
<?php
/* ejemplo 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* ejemplo 2 */
PHP también admite la sintaxis alternativa de los dos puntos para bucles for.
sentencias
La primera forma recorre el array dado por expresión_array. En cada iteración, el valor
del elemento actual se asigna a $valor y el puntero interno del array avanza una posición
(así en la próxima iteración se estará observando el siguiente elemento).
La segunda forma además asigna la clave del elemento actual a la variable $clave en cada
iteración.
Para poder modificar directamente los elementos del array dentro de bucle, se ha de
anteponer & a $valor. En este caso el valor será asignado por referencia.
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$valor) {
$valor = $valor * 2;
}
// $array ahora es array(2, 4, 6, 8)
unset($valor); // rompe la referencia con el último elemento
?>
262
Programación del lado del servidor
4.3. Tratamiento de formularios
Solamente existen dos maneras de acceder a datos desde formularios HTML. Los métodos
disponibles actualmente se enumeran a continuación:
Lo primero que hay que recordar es que, independientemente de las restricciones que se
hayan puesto en un formulario HTML para limitar los tipos y tamaños de las entradas, es una
cuestión trivial para un hacker utilizar la función de ver el código fuente del navegador para
extraer el formulario y modificarlo para proporcionar entradas maliciosas a su sitio web.
Por lo tanto, nunca debe confiar en ninguna variable que provenga de $_GET o $_POST
o $_REQUEST, hasta que la haya procesado. Si no lo hace, los usuarios pueden intentar
inyectar JavaScript en los datos para interferir con el funcionamiento de su sitio, o incluso
intentar añadir comandos MySQL o de algún otro manejador para comprometer su base de
datos.
Id Banderas Descripción
264
Programación del lado del servidor
4.3. Tratamiento de formularios
dígitos y !#$%&'*+-
=?^_`{|}~@.[].
265
Programación del lado del servidor
4.3. Tratamiento de formularios
ENT_QUOTES establecido.
Utiliza el conjunto de
caracteres por omisión y
si hay un carácter no
válido regresa una cadena
vacía
_HIGH,
FILTER_FLAG_ENCODE
_AMP
266
Programación del lado del servidor
4.3. Tratamiento de formularios
FILTER_FLAG_ENCODE
_HIGH,
FILTER_FLAG_ENCODE
_AMP
Id Banderas Descripción
267
Programación del lado del servidor
4.3. Tratamiento de formularios
Por lo tanto, en lugar de usar sólo código como el siguiente cuando se lee en la entrada
del usuario:
$variable = $_POST['user_input'];
Se debería de verificar o sanear cada campo que se recibe del formulario:
268
Programación del lado del servidor
4.3. Tratamiento de formularios
<h2>Formulario:</h2>
<form action="[Link]" method="post">
Nombre:
<input type="text" name="nombre" maxlength="50"><br>
Contraseña:
<input type="password" name="password"><br>
Educacion:
<select name="educacion">
<option value="sinEstudios">Sin estudios</option>
<option value="educacionBasica" selected="selected">Educación
básica</option>
<option value="formacionProfesional">Formación profesional</option>
<option value="universidad">Universidad</option>
</select> <br>
Nacionalidad:
<input type="radio" name="nacionalidad"
value="mexicana">Mexicana</input>
<input type="radio" name="nacionalidad" value="otra">Otra</input><br>
Idiomas:
<input type="checkbox" name="idiomas[]" value="español"
checked="checked">Español</input>
<input type="checkbox" name="idiomas[]" value="inglés">Inglés</input>
<input type="checkbox" name="idiomas[]" value="francés">Francés</input>
<input type="checkbox" name="idiomas[]"
value="alemán">Alemán</input><br>
Email:
<input type="text" name="correo"><br>
Sitio Web:
<input type="text" name="sitioWeb"><br>
// Botón de enviar
<input type="submit" name="submit" value="Enviar">
</form>
</body>
</html>
Para empezar, se puede hacer una función general de validación que deberá aplicarse a todos
los campos.
function filtrar($datos){
$datos = trim($datos); // Elimina espacios antes y después de los datos
$datos = stripslashes($datos); // Elimina backslashes \
$datos = htmlspecialchars($datos); // Traduce caracteres especiales en
entidades HTML
return $datos;
269
Programación del lado del servidor
4.3. Tratamiento de formularios
}
Acá tenemos el código que filtra todos los campos:
if(isset($_POST["submit"]) && $_SERVER["REQUEST_METHOD"] == "POST"){
$nombre = filtrar($_POST["nombre"]);
$password = filtrar($_POST["password"]);
$educacion = filtrar($_POST["educacion"]);
$nacionalidad = filtrar($_POST["nacionalidad"]);
// Utilizamos implode para pasar el array a string
$idiomas = filtrar(implode(", ", $_POST["idiomas"]));
$email = filtrar($_POST["correo"]);
$sitioweb = filtrar($_POST["sitioweb"]);
Hay que tomar en cuenta cuando los campos son opcionales y cuando son campos requeridos:
if(isset($_POST["submit"]) && $_SERVER["REQUEST_METHOD"] == "POST"){
// El nombre y contraseña son campos obligatorios
if(empty($_POST["nombre"])){
$errores[] = "El nombre es requerido";
}
if(empty($_POST["password"]) || strlen($_POST["password"]) < 5){
$errores[] = "La contraseña es requerida y ha de ser mayor a 5
caracteres";
}
// El correo es obligatorio y ha de tener formato adecuado
if(!filter_var($_POST["correo"], FILTER_VALIDATE_EMAIL) ||
empty($_POST["correo"])){
$errores[] = "No se ha indicado email o el formato no es correcto";
}
// El sitio web es obligatorio y ha de tener formato adecuado
if(!filter_var($_POST["sitioWeb"], FILTER_VALIDATE_URL) ||
empty($_POST["sitioWeb"])){
$errores[] = "No se ha indicado sitio web o el formato no es
correcto";
}
// Si el array $errores está vacío, se aceptan los datos y se asignan a
variables
if(empty($errores)) {
$nombre = filtrar($_POST["nombre"]);
$password = filtrar($_POST["password"]);
$educacion = filtrar($_POST["educacion"]);
$nacionalidad = filtrar($_POST["nacionalidad"]);
// Utilizamos implode para pasar el array a string
$idiomas = filtrar(implode(", ", $_POST["idiomas"]));
270
Programación del lado del servidor
4.3. Tratamiento de formularios
$email = filtrar($_POST["correo"]);
$sitioweb = filtrar($_POST["sitioWeb"]);
}
}
<ul>
<?php
if(isset($errores)){
foreach ($errores as $error){
echo "<li> $error </li>";
}
}
?>
</ul>
Estos ejemplos son de ([Link] 2021) traducidos al español.
271
Programación del lado del servidor
4.3. Tratamiento de formularios
272
Programación del lado del servidor
4.3. Tratamiento de formularios
especifica por qué no se ha podido subir el archivo, lo que permite especificar un mensaje
de vuelta para cada tipo de error. Devuelve un integer con el número de error:
Para subir múltiples archivos puede hacerse con JavaScript o usando HTML. Si se hace
con HTML se le añade al formulario html el atributo multiple y al nombre en el atributo name
se añaden corchetes para indicar que es un array.
273
Programación del lado del servidor
4.4. Manejo de objetos en el servidor
Una vez que se aprende a condensar trozos de código reutilizables en funciones, no es tan
En PHP estándar, se podrían crear algunas funciones para manejar esto e incrustar algunas
llamadas a la base de datos MySQL para mantener un registro de todos los usuarios.
Se Podría tratar este nuevo objeto como si fuera el usuario real. Por ejemplo, podría pasarle
al objeto al objeto un nombre, una contraseña y una dirección de correo electrónico;
274
Programación del lado del servidor
4.4. Manejo de objetos en el servidor
preguntarle si ese usuario ya existe y, en caso contrario, hacer que cree un nuevo usuario con
esos atributos. Incluso podría tener un objeto de mensajería instantánea o uno para gestionar
si dos usuarios son amigos.
4.4.1 Terminología
Cuando se crea un programa para utilizar objetos, es necesario diseñar una entidad de
datos y código llamado clase. Cada nuevo objeto basado en esta clase se llama instancia (o
aparición) de esa clase.
Los datos asociados a un objeto se llaman propiedades; las funciones que utiliza se llaman
métodos. Al definir una clase, se proporcionan los nombres de sus propiedades y el código
de sus métodos.
Cuando se crean objetos, lo mejor es utilizar la encapsulación, o sea, escribir una clase de
manera que sólo sus métodos puedan ser utilizados para manipular sus propiedades. En otras
palabras, se le niega al código externo el acceso directo a sus datos. Los métodos que se
proporcionan se conocen como interfaz del objeto.
Este enfoque facilita la depuración: sólo hay que arreglar el código defectuoso dentro de
una clase.
Una vez que haya creado una clase, puede encontrar que necesita otra clase que es similar
pero no exactamente igual. Lo más rápido y fácil es definir una nueva clase usando la
herencia. Al hacer esto, tu nueva clase tiene todas las propiedades de la que ha de la que ha
heredado. La clase original se llama ahora superclase, y la nueva es la subclase (o clase
derivada).
275
Programación del lado del servidor
4.5. Creación de clases
Una excelente ventaja de este sistema es que, si se mejora la velocidad o cualquier otro
aspecto de la superclase, sus subclases recibirán el mismo beneficio.
PHP trata los objetos de la misma manera que las referencias o manejadores, lo que
significa que cada variable contiene una referencia a un objeto en lugar de una copia de todo
el objeto.
El nombre de clase puede ser cualquier etiqueta válida, siempre que no sea una palabra
reservada de PHP. Un nombre válido de clase comienza con una letra o un guión bajo,
seguido de una cantidad arbitraria de letras, números o guiones bajos. Como expresión
regular, se expresaría de la siguiente forma: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-
\xff]*$.
Una clase puede tener sus propias constantes, variables (llamadas "propiedades"), y
funciones (llamados "métodos").
<?php
class ClaseSencilla
{
// Declaración de una propiedad
private $var = 'un valor predeterminado';
// Declaración de un método
public function mostrarVar() {
echo $this->var;
}
}
?>
La pseudovariable $this está disponible cuando un método es invocado dentro del contexto
de un objeto. $this es una referencia al objeto invocador.
276
Programación del lado del servidor
4.5. Creación de clases
Si se emplea un string que contenga el nombre de una clase con new, se creará una nueva
instancia de esa clase. Si la clase estuviera en un espacio de nombres, se debe utilizar su
nombre completo al realizar esto.
Si no hay argumentos para pasar al constructor de la clase, se pueden omitir los paréntesis
después del nombre de la clase.
<?php
$instancia = new MiClase();
277
Programación del lado del servidor
4.5. Creación de clases
En el contexto de una clase, es posible crear un nuevo objeto con new self y new parent.
Cuando se asigna una instancia ya creada de una clase a una nueva variable, ésta última
accederá a la misma instancia que el objeto que le fue asignado. Esta conducta es la misma
que cuando se pasan instancias a una función. Se puede realizar una copia de un objeto ya
creado a través de la clonación del mismo.
<?php
$asignada = $instancia;
$referencia =& $instancia;
var_dump($instancia);
var_dump($referencia);
var_dump($asignada);
?>
278
Programación del lado del servidor
4.5. Creación de clases
$extendida->mostrarVar();
?>
4.5.4. Visibilidad
La visibilidad de una propiedad, un método o una constante se puede definir anteponiendo
a su declaración una de las palabras reservadas public, protected o private. A los miembros
de clase declarados como 'public' se puede acceder desde donde sea; a los miembros
declarados como 'protected', solo desde la misma clase, mediante clases heredadas o desde
la clase padre. A los miembros declarados como 'private' únicamente se puede acceder desde
la clase que los definió.
Las propiedades de clases deben ser definidas como 'public', 'private' o 'protected'. Si se
declaran usando var, serán definidas como 'public'.
<?php
/**
* Definición de MiClase
*/
class MiClase
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
/**
279
Programación del lado del servidor
4.5. Creación de clases
* Definición de MiClase2
*/
class MiClase2 extends MiClase
{
// Se pueden redeclarar las propiedades pública y protegida, pero no
la privada
public $public = 'Public2';
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
?>
Los métodos de clases pueden ser definidos como public, private, o protected. Aquellos
declarados sin ninguna palabra clave de visibilidad explícita serán definidos como public.
<?php
/**
* Definición de MiClase
*/
class MiClase
{
// Declaración de un constructor public
public function __construct() { }
// Esto es public
function Foo()
{
$this->MiPublic();
$this->MiProtected();
$this->MiPrivate();
}
}
/**
* Definición de MiClase2
*/
class MiClase2 extends MiClase
{
// Esto es public
function Foo2()
{
$this->MiPublic();
$this->MiProtected();
$this->MiPrivate(); // Error Fatal
}
}
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
281
Programación del lado del servidor
4.5. Creación de clases
}
}
Las constantes de clase se pueden definir como públicas, privadas o protegidas. Las
constantes declaradas sin una visibilidad explítica serán definidas como públicas.
<?php
/**
* Definir MiClase
*/
class MiClase
{
// Declarar una constante pública
public const MI_PUBLIC = 'public';
282
Programación del lado del servidor
4.6. Acceso a datos
/**
* Definir MiClase2
*/
class MiClase2 extends MiClase
{
// Esta es pública
function foo2()
{
echo self::MI_PUBLIC;
echo self::MI_PROTECTED;
echo self::MI_PRIVATE; // Error fatal
}
}
PDO proporciona una capa de abstracción de acceso a datos, lo que significa que,
independientemente de la base de datos que se esté utilizando, se emplean las mismas
funciones para realizar consultas y obtener datos. PDO no proporciona una abstracción de
283
Programación del lado del servidor
4.6. Acceso a datos
bases de datos; no reescribe SQL ni emula características ausentes. Se debería usar una capa
de abstracción totalmente desarrollada si fuera necesaria tal capacidad.
284
Programación del lado del servidor
4.6. Acceso a datos
Una vez realizada con éxito una conexión a la base de datos, será devuelta una instancia
de la clase PDO al script. La conexión permanecerá activa durante el tiempo de vida del
objeto PDO. Para cerrar la conexión, es necesario destruir el objeto asegurándose de que
todas las referencias a él existentes sean eliminadas; esto se puede hacer asignando null a la
variable que contiene el objeto. Si no se realiza explícitamente, PHP cerrará automáticamente
la conexión cuando el script finalice.
Nota: Si aún existen otras referencias a esta instancia de PDO (tales como desde una
instancia de PDOStatement, o desde otras variables que hacen referencia a la misma instancia
de PDO), estas también han de eliminarse (por ejemplo, asignando NULL a la variable que
hace referencia al PDOStatement).
<?php
$mbd = new PDO('mysql:host=localhost;dbname=prueba', $usuario, $contraseñ
a);
// Utilizar la conexión aquí
$sth = $mbd->query('SELECT * FROM foo');
// Ya se ha terminado; se cierra
$sth = null;
$mbd = null;
?>
285
Programación del lado del servidor
4.6. Acceso a datos
Una transacción se implementa normalmente para hacer que el lote de cambios se aplique
a la vez. Esto tiene el buen efecto secundario de mejorar drásticamente la eficiencia de las
actualizaciones. En otras palabras, las transacciones pueden hacer los scripts más rápidos y
potencialmente más robustos (aún así es necesario utilizarlas correctamente para obtener tal
beneficio).
Desafortunadamente, no todas las bases de datos admiten transacciones, por lo que PDO
necesita ejecutarse en lo que es conocido como el modo "auto-commit" cuando se abra por
primera vez la conexión. El modo auto-commit significa que toda consulta que se ejecute
286
Programación del lado del servidor
4.6. Acceso a datos
Un ejemplo podría ser el intento de utilizar transacciones en tablas MyISAM en una base
de datos MySQL.
Cuando el script finaliza o cuando una conexión está a punto de ser cerrada, si existe una
transacción pendiente, PDO la revertirá automáticamente. Esto es una medida de seguridad
que ayuda a evitar inconsistencia en los casos donde el script finaliza inesperadamente (si no
se consignó la transacción, se asume que algo salió mal, con lo cual se realiza la reversión
para la seguridad de los datos).
287
Programación del lado del servidor
4.6. Acceso a datos
La consulta sólo necesita ser analizada (o preparada) una vez, pero puede ser ejecutada
muchas veces con los mismos o diferentes parámetros. Cuando la consulta se prepara, la base
de datos analizará, compilará y optimizará su plan para ejecutarla. Para consultas complejas,
este proceso puede tomar suficiente tiempo como para ralentizar notablemente una aplicación
si fuera necesario repetir la misma consulta muchas veces con los mismos parámetros.
Mediante el empleo de una sentencia preparada, la aplicación evita repetir el ciclo de
análisis/compilación/optimización. Esto significa que las sentencias preparadas utilizan
menos recursos y se ejecutan más rápidamente.
Las sentencias preparadas son tan útiles que son la única característica que PDO emulará
para los controladores que no las soporten. Esto asegura que una aplicación sea capaz de
emplear el mismo paradigma de acceso a datos independientemente de las capacidades de la
base de datos.
Este ejemplo realiza dos consultas INSERT sustituyendo name y value por los marcadores
correspondientes.
<?php
$sentencia=$mbd->prepare("INSERT INTO REGISTRY (name, value)
VALUES (:name, :value)");
$sentencia->bindParam(':name', $nombre);
$sentencia->bindParam(':value', $valor);
288
Programación del lado del servidor
4.6. Acceso a datos
PDO::ERRMODE_SILENT
PDO::ERRMODE_WARNING
289
Programación del lado del servidor
4.6. Acceso a datos
PDO::ERRMODE_EXCEPTION
El modo Exception también es útil porque se puede estructurar el manejo de errores con
más claridad que con el estilo tradicional de advertencias de PHP, y con menos
código/anidación que, con la ejecución en modo silencioso, comprobando así explícitamente
el valor devuelto de cada llamada a la base de datos.
PDO utiliza las cadenas de código de error SQLSTATE del estándar SQL-92; cada
controlador de PDO es responsable de la correspondencia de sus códigos nativos con los
códigos SQLSTATE apropiados. El método PDO::errorCode() devuelve un único código
SQLSTATE. Si fuera necesaria más información específica sobre el error, PDO también
ofrece el método PDO::errorInfo(), que devuelve un array que contiene el código
SQLSTATE, el código de error específico del controlador, y la cadena de error específica.
<?php
$dsn = 'mysql:dbname=prueba;host=[Link]';
$usuario = 'usuario';
$contraseña = 'contraseña';
try {
$mbd = new PDO($dsn, $usuario, $contraseña);
$mbd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Falló la conexión: ' . $e->getMessage();
}
?>
290
Programación del lado del servidor
4.6. Acceso a datos
/*
El empleo de try/catch en el constructor sigue siendo válido aunque
se establezca ERRMODE a WARNING, ya que PDO::__construct siempre lanzará
una PDOException si la conexión falla.
*/
try {
$mbd = new PDO($dsn, $usuario, $contraseña, array(PDO::ATTR_ERRMODE =
> PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Error de conexión: ' . $e->getMessage();
exit;
}
// Esto hará que PDO lance un error de nivel E_WARNING en lugar de una
excepción (cuando la tabla no exista)
$mbd->query("SELECT columna_incorrecta FROM tabla_incorrecta");
?>
291
Programación del lado del servidor
Capítulo 5 Cómputo en la nube y servicios
Competencias genéricas
Solución de problemas.
Toma de decisiones.
292
Cómputo en la nube y servicios
5.1. Conceptos generales
‘Una infraestructura de nube es el conjunto de hardware y software que permite las cinco
características esenciales de la computación en nube.
‘La infraestructura de la nube puede considerarse que contiene una capa física y una capa
de abstracción. La capa física consiste en los recursos de hardware necesarios para soportar
los servicios en la nube que se proporcionan, y normalmente incluye servidores,
almacenamiento y componentes de red. La capa de abstracción consiste en el software
desplegado en la capa física, que manifiesta las características esenciales de la nube.
Conceptualmente, la capa de abstracción se sitúa por encima de la capa física.
‘La computación en nube es un modelo que permite el acceso ubicuo, cómodo y a la carta
a un conjunto de recursos informáticos de recursos informáticos configurables (por ejemplo,
redes, servidores, almacenamiento, aplicaciones y servicios) que pueden ser rápidamente
aprovisionados y liberados con un mínimo esfuerzo de gestión o interacción con el proveedor
de servicios.
Amplio acceso a la red. Las capacidades están disponibles en la red y se accede a ellas a
través de mecanismos estándar que promueven el uso de plataformas heterogéneas de clientes
ligeros o normales (p. ej, teléfonos móviles, tabletas, ordenadores portátiles y estaciones de
trabajo).
293
Cómputo en la nube y servicios
Puesta en común de recursos. Los recursos informáticos del proveedor se ponen en
común para servir a múltiples consumidores utilizando un modelo multi-arrendatario, con
diferentes recursos físicos y virtuales asignados y reasignados dinámicamente en función de
la demanda de los consumidores. Existe una sensación de independencia en el sentido de que
el cliente generalmente no tiene control o conocimiento sobre la ubicación exacta de los
recursos proporcionados, pero puede especificar la ubicación a un nivel superior de
abstracción (por ejemplo, país, estado o centro de datos). Algunos ejemplos de recursos son
el almacenamiento, procesamiento, memoria y ancho de banda de la red.
294
Cómputo en la nube y servicios
Software como servicio (SaaS). La capacidad que se ofrece al consumidor es la de
utilizar las aplicaciones del proveedor que se ejecutan en una infraestructura en la nube. Las
aplicaciones son accesibles desde varios dispositivos cliente a través de una interfaz de
cliente ligero, como un navegador web (por ejemplo, correo electrónico basado en la web),
o una interfaz de programa. El consumidor no gestiona ni controla la infraestructura
subyacente de la nube, incluyendo la red, los servidores, los sistemas operativos, el
almacenamiento o incluso las capacidades individuales de la aplicación, con la posible
excepción de los ajustes de configuración específicos del usuario.
295
Cómputo en la nube y servicios
negocio). Puede ser propiedad, estar gestionada y la organización, un tercero o una
combinación de ellos, y puede existir en las instalaciones o fuera de ellas.
296
Cómputo en la nube y servicios
Servicios en la nube de usos múltiples: algunas organizaciones, locales y
multinacionales, ofrecen un conjunto de servicios en la nube, en la mayoría de los
casos, servicios en la nube públicos para todos. Los servicios pueden ser desde la
disponibilidad de infraestructuras, plataformas de desarrollo, o programas y
aplicaciones.
Algunos de los servicios en la nube están diseñados para el consumo y otros para las
necesidades empresariales (y gubernamentales). En la mayoría de los casos, los
servicios de grado empresarial y los servicios de grado de consumidor se rigen por
diferentes principios, cláusulas contractuales, acuerdos de nivel de servicio (SLA por
sus siglas en inglés), modelos de negocio y reglas de seguridad y privacidad.
Nubes integradas verticalmente: son servicios a gran escala (por ejemplo, redes
sociales o motores de búsqueda), que se proporcionan a los usuarios y que se
ejecutan en la infraestructura de la nube desarrollada e integrada del proveedor.
Servicios innovadores en la nube: se ejecutan en la infraestructura de la nube
multiuso. En esta categoría, las compañías de todos los tamaños, proveedores de
software independientes (ISV por sus siglas en inglés), desarrollan servicios en la nube
para que otros los usen, sin embargo, necesitan infraestructura en la nube para
construir y operar sus propios servicios en lugar de crear los suyos. Esta categoría es
probablemente la más dinámica en el mercado, ya que las organizaciones
pequeñas, medianas y grandes pueden usar la infraestructura de la nube lista para
usar para brindar sus propios servicios a sus clientes, ya sea para consumidores o
para empresas.
5.2.2. Virtualización
El primer concepto para entender cómo trabajan los equipos o servidores que conforman
las unidades básicas de los Data Center que habilitan los servicios en la nube es la
298
Cómputo en la nube y servicios
virtualización. Por ejemplo, un solo disco físico en un servidor dentro de un Data Center
puede contener información para varios inquilinos o clientes; el cifrado de datos y las técnicas
de segregación de datos lógicos que utiliza la virtualización proporcionan más seguridad y
protección contra el acceso a datos no deseados e internos, ya que es difícil apuntar a los
datos de un cliente específico. Mientras que un proveedor de servicios de Cloud Computing
proporcionará el mismo servicio a todos los clientes, un proveedor de servicios digitales o de
TI proporcionará contratos y servicios diferentes y específicos para cada cliente. La
virtualización es un proceso que separa las funciones o aplicaciones o software del hardware,
y las nubes dependen de esa separación. La forma más fácil de explicar la diferencia es
escribirla desde la perspectiva estricta de una infraestructura como servicio (IaaS). La base
del Cloud Computing es un sistema operativo estable. Esta es la capa que proporciona a los
usuarios la independencia en los entornos públicos, privados e híbridos.
El hipervisor, también llamado monitor de máquina virtual (VMM, por sus siglas en
inglés), es el núcleo central de algunas de las tecnologías de virtualización de hardware más
populares y eficaces, entre las cuales se encuentran las de Microsoft: Microsoft Virtual PC,
Windows Virtual PC, Microsoft Windows Server e Hyper-V. El hipervisor es la llave que
habilita la virtualización.([Link]
299
Cómputo en la nube y servicios
La virtualización no implica Cloud Computing. Los recursos virtuales deben asignarse a
grupos centralizados antes de llamarlos nubes, y esas nubes deben coordinarse con software
de gestión y automatización antes de que se les pueda considerar Cloud Computing. Las
nubes proporcionan las ventajas adicionales del acceso de autoservicio, la asignación o
aumento automatizado de la infraestructura y los grupos de recursos dinámicos; esos son los
beneficios que marcan más claramente la diferencia de los servicios de Cloud Computing
con la virtualización tradicional. Algunas características que permiten diferenciar los
conceptos de virtualización y de Cloud Computing se muestran en la siguiente tabla:
300
Cómputo en la nube y servicios
5.3. Patrones de diseño
Christopher Alexander dice: "Cada patrón describe un problema que ocurre por encima y
por debajo de nuestro entorno, y luego describe el curso de la solución a ese problema, de tal
manera que se puede utilizar esta solución un millón de veces más, sin que se haga siempre
lo mismo". Aunque Alexander hablaba de patrones en edificios y ciudades, lo que dice es
cierto en cuanto a los patrones de diseño orientado a objetos. Nuestras soluciones se expresan
en términos de objetos e interfaces en lugar de muros y puertas, pero el núcleo de ambos
tipos de patrones es la solución de un problema en un contexto.
1. El nombre del patrón es un nombre que podemos utilizar para describir un problema
de diseño, sus soluciones y consecuenciasen una o dos palabras. Nombrar un patrón aumenta
inmediatamente nuestro vocabulario de diseño. Nos permite diseñar a un mayor nivel de
abstracción. Tener un vocabulario de patrones nos permite hablar de ellos con nuestros
colegas, en nuestra documentación y hasta con nosotros mismos. Facilita la reflexión sobre
los diseños y la comunicación de los mismos con sus ventajas y desventajas a los demás.
301
Cómputo en la nube y servicios
2. El problema describe cuándo aplicar el patrón. Explica el problema y su contexto.
Puede describir problemas de diseño específicos, como la representación de los algoritmos
como objetos. Puede que describa clases o estructuras de objetos que son sintomáticas de un
diseño inflexible. En ocasiones, el problema incluirá una lista de condiciones que deben
cumplirse antes de que tenga sentido aplicar el patrón.
Los patrones de diseño no son como listas enlazadas y tablas hash que pueden codificarse
en clases y reutilizarse como tales. Tampoco se trata de diseños complejos y específicos para
una aplicación o un subsistema. Los patrones de diseño son descripciones de objetos y clases
que se comunican entre sí y que están optimizadas para solucionar un problema de diseño
general en un ámbito concreto.
302
Cómputo en la nube y servicios
Un patrón de diseño nombra, abstrae e identifica los aspectos clave de un diseño común
que lo hacen útil para crear un diseño orientado a objetos reutilizable. El patrón de diseño
identifica las clases e instancias participantes, sus roles y colaboraciones, y la distribución de
responsabilidades. Cada patrón de diseño se centra en un problema particular de diseño
orientado a objetos. Describe cuándo se aplica, si puede aplicarse en vista de otras
restricciones de diseño, y las consecuencias y compensaciones de su uso.
Abstract Factory. Proporciona una interfaz para crear familias de objetos relacionados o
dependientes sin especificar sus clases concretas.
Se usa el patrón Factory cuando se require construir un objeto, así es, construir y no
crear. Cuando construye el objeto, primero lo crea y luego lo inicializa.
Es común tener que realizar múltiples pasos al momento de construer un objeto e incluir
cierta lógica. Básicamente, ese es el punto del patrón Factory. Es una buena idea definir una
interfaz para su fábrica y que su código dependa de ella y no de una fábrica concreta. Con
eso, puede reemplazar fácilmente una fábrica por otra cuando lo necesite.
303
Cómputo en la nube y servicios
Ilustración 5.1 Tipos de patrones de diseño
<?php
/**
* La interfaz Abstract Factory declara un conjunto de métodos que devuelven
* diferentes productos abstractos. Estos productos se denominan familia y
están
* relacionados por un tema o concepto de alto nivel. Los productos de una
familia suelen ser
* capaces de colaborar entre sí. Una familia de productos puede tener
varias
304
Cómputo en la nube y servicios
* variantes, pero los productos de una variante son incompatibles con los
productos de
* otra.
*/
interface FabricaAbstracta
{
public function creaProductoA(): ProductoAbstractoA;
/**
* Las fábricas concretas producen una familia de productos que pertenecen a
una única
* variante. La fábrica garantiza que los productos resultantes son
compatibles. Obsérvese
* que las firmas de los métodos de la Fábrica Concreta devuelven un
producto abstracto
* mientras que dentro del método se instancia un producto concreto.
*/
/**
* Cada fábrica concreta tiene su correspondiente variante de producto.
*/
class FabricaConcreta2 implements FabricaAbstracta
{
public function creaProductoA(): ProductoAbstractoA
{
return new ProductoConcretoA2();
}
305
Cómputo en la nube y servicios
public function creaProductoB(): ProductoAbstractoB
{
return new ProductoConcretoB2();
}
}
/**
* Cada producto distinto de una familia de productos debe tener una
interfaz base. Todas las
* variantes del producto deben implementar esta interfaz.
*/
interface ProductoAbstractoA
{
public function funcionUtilA(): string;
}
/**
* Los Productos concretos son creados por las correspondientes Fábricas
concretas.
*/
/**
* Aquí está la interfaz base de otro producto. Todos los productos pueden
* interactuar entre sí, pero la interacción adecuada sólo es posible entre
* los productos de la misma variante concreta.
*/
306
Cómputo en la nube y servicios
interface ProductoAbstractoB
{
/**
* El producto B es capaz de hacer sus propias cosas...
*/
public function funcionUtilB(): string;
/**
* ...pero también puede colaborar con el ProductoA.
*
* La Fábrica Abstracta se asegura de que todos los productos que crea
* son de la misma variante y por tanto, compatibles.
*/
public function otraFuncionUtilB(ProductoAbstractoA $colaborador):
string;
}
/**
* Los productos concretos son creados por las correspondientes fábricas
* concretas.
*/
class ProductoConcretoB1 implements ProductoAbstractoB
{
public function funcionUtilB(): string
{
return "El resultado del producto B1.";
}
/**
* La variante, Producto B1, sólo puede funcionar correctamente con la
* variante, Producto A1. Sin embargo, acepta cualquier instancia de
*ProductoAbstractoA como como argumento.
*/
public function otraFuncionUtilB(ProductoAbstractoA $colaborador): string
{
$resultado = $colaborador->funcionUtilA();
307
Cómputo en la nube y servicios
{
return "El resultado del producto B2.";
}
/**
* La variante, Producto B2, sólo puede funcionar correctamente con la
* variante, Producto A2. Sin embargo, acepta cualquier instancia de
* ProductoAbstractoA como como argumento.
*/
/**
* El código del cliente trabaja con fábricas y productos sólo a través de
* tipos abstractos:
* FabricaAbstracta y ProductoAbstracto. Esto permite pasar cualquier
* fábrica o subclase de producto al código cliente sin romperlo.
*/
function codigoCliente(FabricaAbstracta $fabrica)
{
$productoA = $fabrica->creaProductoA();
$productoB = $fabrica->creaProductoB();
/**
* El código del cliente puede trabajar con cualquier clase concreta de
fabrica
*/
echo "Cliente: Probando el código del cliente con el primer tipo de
fábrica:\n";
codigoCliente(new FabricaConcreta1());
echo "\n";
308
Cómputo en la nube y servicios
echo "Cliente: Probando el mismo código de cliente con el segundo tipo de
fábrica:\n";
codigoCliente(new FabricaConcreta2());
Referencia: ([Link], 2014)
Active record. Este patrón permite mapear las filas de una tabla o vista de una base de
datos dada a un objeto. Este objeto se encarga de interactuar con la base de datos y, por tanto,
todas las operaciones de CRUD se hacen a través de éste.
Las desventajas es que los objetos se encuentran fuertemente acoplados a la base de datos,
por lo que un cambio en el esquema se traduce en un cambio en su objeto asociado.
(Fernández, 2019)
Adapter. Convierte la interfaz de una clase en otra interfaz esperada por el cliente. El
adaptador permite que funcionen juntas clases que de otro modo no podrían hacerlo debido
a interfaces incompatibles.
Bridge. Desacopla una abstracción de su implementación para que ambas puedan variar
independientemente.
310
Cómputo en la nube y servicios
que los mismos procesos de construcción pueden crear diferentes representaciones.
Command. Encapsula una solicitud como un objeto, permitiendo así parametrizar a los
clientes con diferentes solicitudes, poniendo en cola o en bitácora las solicitudes, y
soportando operaciones que no se pueden deshacer.
El uso del patrón Composite sólo tiene sentido cuando el modelo central de tu aplicación
puede representarse en forma de árbol.
// La interfaz Graficos establece operaciones comunes para
// objetos simples y complejos.
interface Graficos es
method mueve(x, y)
method dibuja()
method mueve(x, y) es
this.x += x, this.y += y
method dibuja() es
// Dibuja un punto en X e Y.
311
Cómputo en la nube y servicios
// La clase GraficoCompuesto tiene componentes complejos que
// pueden tener hijos.
class GraficoCompuesto implements Graficos es
variables hijos: arreglo de Graficos
// Se puede añadir o eliminar otros
// componentes a o desde su
// lista hija.
method agrega(hijo: Graficos) es
// Añade un hijo al arreglo de hijos.
method elimina(hijo: Graficos) es
// Elimina un hijo del arreglo de hijos.
method mueve(x, y) es
foreach (hijo in hijos) do
[Link](x, y)
method carga() es
todosLosGraficos = new GraficoCompuesto()
[Link](new Punto(1, 2))
[Link](new Circulo(5, 3, 10))
// ...
312
Cómputo en la nube y servicios
method grupoSeleccionado(elementos: arreglo de Graficos) es
grupo = new GraficoCompuesto()
foreach (elemento in elementos) do
[Link](elemento)
[Link](elemento)
[Link](group)
// Se dibujarán todos los componentes.
[Link]()
Referencia: ([Link], 2014)
Facade. Proporciona una interfaz unificada para una serie de interfaces en un subsistema.
Facade define una interfaz superior que facilita el uso del subsistema.
Factory method. Define una interfaz para crear un objeto, pero deja que las subclases
decidan qué clases hay que instanciar. El Factory method permite que una clase difiera la
instanciación a sus subclases.
313
Cómputo en la nube y servicios
class CreadorEspecifico1 extends Creador
{
public function metodoFabrica(): Producto
{
return new ProductoEspecifico1();
}
}
interface Producto
{
public function operacion(): string;
}
314
Cómputo en la nube y servicios
// ...
}
Flyweight. Utiliza compartir para soportar un gran número de objetos de grano fino de
forma eficiente.
Mediator. Define un objeto que encapsula cómo interactúan varios objetos. Mediator
fomenta el acoplamiento libre al evitar que los objetos se refieran unos a otros explícitamente,
y le permite variar su interacción de forma independiente.
Observer. Define una dependencia de uno a muchos entre los objetos para que cuando
uno de ellos cambie de estado, todos sus dependientes son notificados y actualizados
automáticamente.
Prototype. Especifica los tipos de objetos que se crearán utilizando una instancia
prototípica, y crea nuevos objetos copiando este prototipo.
Proxy. Proporciona un sustituto o un lugar para otro objeto para controlar los accesos a
él.
Singleton. Garantiza que una clase sólo tiene una instancia y proporciona un punto global
de acceso a la misma.
315
Cómputo en la nube y servicios
State. Permite que un objeto altere su comportamiento cuando cambia su estado interno.
El objeto indicará que ha cambiado.
Strategy. Define una familia de algoritmos, encapsula cada uno de ellos y los hace
intercambiables. Strategy permite que el algoritmo varíe independientemente de los clientes
que lo utilizan.
Visitor. Representa una operación que debe realizarse en los elementos de una estructura
de objeto. Visitor permite definir una nueva operación sin cambiar las clases de los elementos
sobre los que opera. (Gamma, Helm, Johnson, & Vlissides, 2009)
Para diseñar el sistema de manera que sea robusto a estos cambios, se debe considerar si
el sistema puede necesitar cambios a lo largo de su vida útil. Un diseño que no tenga en
cuenta los cambios se arriesga a un rediseño importante en el futuro. Esos cambios podrían
implicar redefinición y reimplementación de clases, modificación del cliente y nuevas
pruebas. El rediseño afecta a muchas partes del sistema de software, y los cambios
imprevistos son siempre costosos.
Los patrones de diseño ayudan a evitar esto asegurando que un sistema pueda cambiar de
forma específica. Cada patrón de diseño permite que algún aspecto de la estructura del
sistema varíe independientemente de otros aspectos, lo que hace que un sistema sea más
resistente a un tipo de cambio concreto.
Hay algunas causas comunes de rediseño, junto con los patrones de diseño que las
abordan:
316
Cómputo en la nube y servicios
1. Crear un objeto especificando explícitamente una clase. Especificar un nombre de
clase cuando se crea un objeto compromete a una implementación particular en lugar de una
interfaz particular. Este compromiso puede complicar futuros cambios. Para evitarlo, se
pueden crear objetos de forma indirecta.
317
Cómputo en la nube y servicios
6. Acoplamiento débil. Las clases fuertemente acopladas son difíciles de reutilizar de
forma aislada, ya que dependen la una de la otra. El acoplamiento fuerte da lugar a sistemas
monolíticos, en los que no se puede cambiar o eliminar una clase sin entender y cambiar
muchas otras clases. El sistema se convierte en una masa densa que es difícil de aprender,
portar y mantener.
Un acoplamiento débil aumenta la probabilidad de que una clase pueda ser reutilizada por
su propio dueño y que un sistema pueda ser aprendido, portado, modificado y ampliado más
fácilmente. Los patrones de diseño utilizan técnicas como el acoplamiento abstracto y la
superposición de capas para promover sistemas débilmente acoplados.
Y la subclasificación puede dar lugar a una explosión de clases, ya que podría tener que
introducir muchas subclases nuevas incluso para una extensión sencilla.
Por otro lado, el uso intensivo de la comunicación de objetos puede hacer que los diseños
sean más difíciles de entender. Muchos patrones de diseño producen diseños en los que se
puede introducir una funcionalidad personalizada con sólo definir una subclase y
componiendo sus instancias con las existentes.
318
Cómputo en la nube y servicios
Patrones de diseño: Bridge, Chain of Responsibility, Composite, Decorator, Observer,
Strategy.
Debido a que los patrones de diseño y los frameworks tienen algunas similitudes y
diferencias. Son diferentes en tres aspectos principales:
1. Los patrones de diseño son más abstractos que los frameworks. Los frameworks
pueden incorporarse en el código, pero sólo los ejemplos de patrones pueden incorporarse al
código. Un punto fuerte de los frameworks es que pueden escribirse en lenguajes de
programación y no sólo estudiarse, sino también, ejecutarse y reutilizarse directamente. En
cambio, los patrones de diseño tienen que implementarse cada vez que se utilizan. Los
patrones de diseño también explican la intención, las compensaciones y las consecuencias de
un diseño.
2. Los patrones de diseño son elementos arquitectónicos más pequeños que los
frameworks. Un framework de trabajo típico contiene varios patrones de diseño, pero lo
contrario nunca es cierto.
3. Los patrones de diseño son menos especializados que los frameworks. Los
frameworks siempre tienen un dominio de aplicación particular. Un framework de editor
gráfico puede utilizarse en una simulación de factores, pero no se confundirá con un
framework de simulación. En cambio, los patrones de diseño pueden utilizarse en casi todo
tipo de aplicaciones. Aunque es posible que existan patrones de diseño más especializados
que los nuestros (por ejemplo, patrones de diseño para sistemas distribuidos o programación
319
Cómputo en la nube y servicios
concurrente), incluso no dictarían una arquitectura de aplicación como lo haría un
framework.
Los frameworks son cada vez más comunes e importantes. Son la forma en que los
sistemas orientados a objetos consiguen la mayor reutilización. Las grandes aplicaciones
orientadas a objetos se componen de capas de frameworks que cooperan entre sí. La mayor
parte del diseño y el código de la aplicación provendrán de o serán influenciados por los
frameworks que se utiliza en la aplicación. (Gamma, Helm, Johnson, & Vlissides, 2009).
Cada patrón describe el problema al que hace frente, las consideraciones sobre su
aplicación y un ejemplo basado en Microsoft Azure. La mayoría incluye ejemplos de código
o fragmentos de código que muestran cómo implementar el patrón en Azure. Sin embargo,
la mayoría de los patrones es importante para todos los sistemas distribuidos, tanto si están
hospedados en Azure como en otras plataformas en la nube.
Patrón Resumen
320
Cómputo en la nube y servicios
CQRS Segrega las operaciones de lectura de datos de las de actualización
de datos mediante interfaces independientes.
Event Sourcing Usa un almacén de solo anexar para registrar la serie completa de
eventos que describen las acciones realizadas en los datos de un
dominio.
Index Table Crea índices en los campos de los almacenes de datos a los que
suelen hacer referencia las consultas.
Materialized View Genera vistas rellenadas previamente de los datos en uno o más
almacenes de datos cuando los datos no tienen el formato idóneo
para las operaciones de consulta requeridas.
Valet Key Usa un token o clave que proporciona a los clientes acceso directo
restringido a un recurso o servicio específico.
Patrón Resumen
321
Cómputo en la nube y servicios
Ambassador Crea servicios auxiliares que envían solicitudes de red en
nombre de una aplicación o servicio de consumidor.
Gateway Aggregation Usa una puerta de enlace para agregar varias solicitudes
individuales en una sola solicitud.
322
Cómputo en la nube y servicios
Pipes and Filters Desglosa una tarea que realiza un procesamiento complejo
en una serie de elementos independientes que se pueden
volver a utilizar.
[Link]. Mensajería
Patrón Resumen
323
Cómputo en la nube y servicios
Organización Haga que cada componente del sistema participe en el proceso de toma de
decisiones sobre el flujo de trabajo de una transacción empresarial, en lugar de
depender de un punto central de control.
Competing Permite que varios consumidores simultáneos procesen los mensajes recibidos
Consumers en el mismo canal de mensajería.
Pipes and Filters Desglosa una tarea que realiza un procesamiento complejo en una serie de
elementos independientes que se pueden volver a utilizar.
Priority Queue Clasifica por orden de prioridad las solicitudes enviadas a los servicios para que
aquellas con una prioridad más alta se reciban y procesen más rápidamente que
las que tienen una prioridad más baja.
Publisher- Permita que una aplicación anuncie eventos de forma asincrónica a varios
Subscriber consumidores interesados, sin necesidad de emparejar los remitentes con los
receptores.
Queue-Based Load Usa una cola que actúa como búfer entre una tarea y un servicio que invoca
Leveling para equilibrar cargas pesadas intermitentes.
5.4.1. Introducción
Las organizaciones de elaboración de normas (SDO) suelen tener un proceso que siguen
para elaborarlas. Por ejemplo, la Organización Internacional de Normalización (ISO) sigue
un proceso de seis pasos18 que incluye: propuesta, preparación, comité, investigación,
324
Cómputo en la nube y servicios
aprobación y publicación. La hoja de ruta de las normas de computación en nube del NIST
incluye una "conceptualización de alto nivel de las formas en que se desarrollan las normas
de TI y los métodos por los que se despliegan los productos, procesos y servicios de TI
basados en normas".
La adopción de normas es un proceso evolutivo. A lo largo del proceso, las normas crecen
tanto en aceptación como en madurez, y pueden tardar años en madurar. La mayoría de las
normas pueden clasificarse generalmente como uno (o más) de los siguientes tipos en algún
momento del ciclo de vida del desarrollo de normas.
325
Cómputo en la nube y servicios
Normas de facto. Se consideran normas del sector gracias a su amplia adopción y
aplicación "en la práctica". Han ganado aceptación y, por tanto, se espera que formen
parte de la hoja de ruta de un producto, en lugar de exigírseles.
Una infraestructura de nube es el conjunto de hardware y software que permite las cinco
características esenciales de la computación en nube.
La infraestructura de la nube puede considerarse que contiene una capa física y una capa
de abstracción. La capa física consiste en los recursos de hardware necesarios para soportar
los servicios en la nube que se proporcionan, y normalmente incluye servidores,
almacenamiento y componentes de red. La capa de abstracción consiste en el software
desplegado en la capa física, que manifiesta las características esenciales de la nube.
Conceptualmente, la capa de abstracción se sitúa por encima de la capa física.
Las nubes utilizan uno de los tres tipos principales de modelos de cómputo, y los
proveedores las despliegan de forma pública o privada. El tipo de modelo de servicio y el
modelo de despliegue afectan a la medida en que la nube puede beneficiarse de la
estandarización.
326
Cómputo en la nube y servicios
5.4.3. Estándares de Cloud Computing
Los estándares para la computación en la nube seguirán evolucionando, madurando y
ganando aceptación. No se pretende ofrecer un catálogo completo de normas que apoyen la
computación en nube, ya que la armonización de las normas podría llevar muchos años. En
cambio, se intenta abordar la importancia de que los estándares de la nube promuevan la
apertura y la flexibilidad de elección por parte del gobierno y empresas privadas, al tiempo
que apoyan los requisitos mínimos de interoperabilidad, portabilidad y seguridad. Para ello
es necesario centrarse en el desarrollo continuo de casos de uso de la computación en nube
para anticipar dónde se utilizarán las tecnologías de la nube, de modo que las organizaciones
de normalización, los grupos industriales y las asociaciones puedan coordinar sus esfuerzos
para definir las normas existentes e identificar dónde será necesario desarrollar nuevas
normas.
(b) Infraestructura como Servicio (IaaS), la Red como un Servicio (NaaS) y el escritorio
como servicio (DaaS); y también (c) interconexión entre las nubes, la gestión de extremo a
extremo de los recursos y la infraestructura Cloud.
UIT-T Y.3510: Esta Recomendación identifica los requisitos para las capacidades de
infraestructura en la nube para apoyar los servicios de nube. El alcance de esta
Recomendación incluye: visión general de la infraestructura de la nube, los requisitos para
327
Cómputo en la nube y servicios
los recursos informáticos, los requisitos de recursos de la red, los requisitos de recursos de
almacenamiento, y los requisitos para la abstracción y control de recursos. La abstracción y
control de los recursos físicos son medios esenciales para alcanzar a la carta y las
características elásticas de infraestructura Cloud.
328
Cómputo en la nube y servicios
5.5. Plataformas tecnológicas
El Cloud Computing incluye un conjunto de servicios que se ofrecen a través de Internet
y la empresa o institución puede configurar sus cargas de procesamiento, administrar IoT,
Big, Data, tecnología Serverless, usar máquinas virtuales e implemeción de soluciones WEB
como servicios. Permiten también redundancia, tanto local como distribuida
geográficamente.
Otra ventaja es que permite eliminar los costos indirectos. No se require invertir en un
conjunto de servidores ni en consumos eléctricos, tampoco en mantenimiento ni renovación
después de su vida útil también disminuyen los costos operativos que pueden ser contratados
ocasionalmente para la configuración y aprovisionamiento del servicio a implementar y
eliminar la necesidad de tener administradores de sistemas a tiempo completo.
Los servicios ofrecidos sonInfraestructura como servicio (IaaS), Plataforma como servicio
(PaaS) y software cmo servicio (SaaS).
IaaS nos libera del hardware por completo, PaaS suministra el hardware y el software de
base subyacente a las aplicaciones y nos deja la responsabilidad de las aplicaciones y las
bases de datos.
Tanto en IaaS como en PaaS, los proveedores ofrecen soluciones automatizadas para la
configuración y administración de los servicios contratados, lo que reduce los tiempos de
aprovisionamiento para la implementación de aplicativos.
329
Cómputo en la nube y servicios
5.5.1 AWS
Amazon Web Services ofrece soluciones de alojamiento web en la nube que proporcionan
a los negocios, las organizaciones sin fines de lucro y los organismos gubernamentales
maneras de entregar sus sitios y aplicaciones web a bajo costo. Independientemente de si está
buscando un sitio web de e-commerce, con medios enriquecidos o de marketing, AWS ofrece
una amplia gama de opciones de hospedaje para sitios web.
Amazon Elastic Compute Cloud (Amazon EC2). es un servicio web que proporciona
capacidad de cómputo configurable en la nube. Está diseñado para facilitar a los
desarrolladores recursos de cómputo escalables y basados en web.
Permite capacidad de cómputo de tamaño variable en la nube. EC2 puede aplicarse para
alojar sitios web que usan varios centros de datos y en sitios que tienen que escalarse con
balanceador de carga, autoscaling o bases de datos externas.
Amazon EC2 reduce el tiempo necesario para obtener y arrancar nuevas instancias de
servidor en minutos, lo que permite escalar rápidamente la capacidad, ya sea aumentándola
o reduciéndola, según cambien sus necesidades.
Amazon EC2 cambia el modelo económico de la computación, al permitir pagar sólo por
la capacidad que utiliza realmente.
330
Cómputo en la nube y servicios
Amazon S3 Permite administrar infraestructura de almacenamiento de objetos segura,
duradera y escalable. S3 se puede usar para alojar sitios web estáticos que entregan HTML,
JavaScript, imágenes y videos para sitios que no contienen scripts del lado del servidor.
5.5.2. Azure
Azure es una plataforma de nube abierta y flexible que permite compilar, implementar y
administrar aplicaciones rápidamente en una red global de centros de datos administrados
por Microsoft. Puede compilar aplicaciones en cualquier lenguaje, herramienta o marco,
permitiendo además integrar sus aplicaciones de nube públicas con el entorno de TI existente.
5.5.3. Google
Google App Engine permite crear y alojar aplicaciones web en los mismos sistemas
escalables con los que funcionan las aplicaciones de Google. Google App Engine ofrece
procesos de desarrollo y de implementación rápidos, y una administración sencilla, sin
necesidad de preocuparse por el hardware, las revisiones o las copias de seguridad y una
ampliación sin esfuerzos. Las aplicaciones Google App Engine son fáciles de crear, fáciles
de mantener y fáciles de escalar a medida que el tráfico y las necesidades de almacenamiento
de datos crecen. Con App Engine no es necesario mantener ningún servidor. Basta con cargar
su aplicación y esta ya se encontrará lista para servir a los usuarios.
331
Cómputo en la nube y servicios
kubernetes de google, permite monitorear y almacenar los registros de rendmiento de las
aplicaciones, almacenamiento de objetos seguro, duradero y escalable, almacén de datos para
agilizar las operaciones empresariales y extraer información valiosa. Ofrece entornos
totalmente administrados para ejecutar aplicaciones en contenedores basado en Cloud run.
Ofrece bilbiotecas y herramientas en línea de comandos para Google Cloud, CDN Cloud es
una red de distribución para publicar contenido web y de video que permite almacenamiento
dedicado fuera del servidor de la aplicación. Anthos plataforma para crear y modernizar
aplicaciones. Cloud SQL es un servicio de bases de datos relacionales para MySQL,
PostgresSQL y SQL Server, Dataflow permite hacer análisis de streaming para el
procesamiento de streaming y por lotes.
Ofrece otras tecnologías como administración de APIs que van desde el análisis, la
monetización, plataforma el portal para desarrolladores entre otras.
En computación ofrece la app Engine, para aplicaciones sin servidor que incluye la propia
aplicación y el backend, bare metal, infraestructura para ejecutar cargas de trabajo
especializadas en Google Cloud, GPUs de Cloud para aprendizaje automático, computación
científica y visualización en 3D, máquinas virtuales tolerantes a fallos máquinas virtuales
blindadas.
Tiene más de cien productos, incluyendo IoT, multimedia, videojuegos, redes, seguridad
e identidad, computación serverless y más.
332
Cómputo en la nube y servicios
5.5.4. Red Hat openshift
OpenShift es la oferta de plataforma como servicio para Computación en la nube de Red
Hat. En esta plataforma los desarrolladores de aplicaciones pueden construir, desplegar,
probar y correr sus aplicaciones. Prporciona espacio en disco, recursos de CPU, memoria,
conectividad de red y un servidor Apache o JBoss. Dependiendo del tipo de aplicación que
se está construyendo, también proporciona acceso a una plantilla de sistema de archivos para
esos tipos (por ejemplo, PHP, Python y Ruby/Rails). También proporciona herramientas de
desarrollo integradas para apoyar el ciclo de vida de las aplicaciones, incluyendo la
integración de Eclipse, JBoss Developer Studio, Jenkins, Maven y GIT. OpenShift utiliza un
ecosistema de código abierto para proporcionar servicios clave de la plataforma de
aplicaciones móviles (Appcelerator), servicios NoSQL (MongoDB), servicios de SQL
(PostgreSQL, MySQL), y más. JBoss proporciona una plataforma de middleware
empresarial para aplicaciones Java, proporcionando apoyo para Java EE6 y servicios
integrados tales como transacciones y mensajes, que son fundamentales para las aplicaciones
empresariales.
333
Cómputo en la nube y servicios
mediante la automatización y ha minimizado la pérdida de ingresos porque reduce el tiempo
de inactividad, planificado y no planificado. Sin embargo, las empresas actuales también
necesitan reducir el tiempo de comercialización de sus productos y servicios. Las unidades
de negocio exigen acceso rápido a los recursos de TI y a las aplicaciones. Se presenta a
continuación (figura 2.3), la solución para la nube propuesta por VMware, y también un
cuadro que define las responsabilidades de cada uno de los productos para la gestión e
infraestructura de la nube.
5.5.8. OpenStack
OpenStack es un conjunto de proyectos de software de código abierto que las empresas /
proveedores de servicios pueden usar para configurar y ejecutar su nube de computación e
infraestructura de almacenamiento. Rackspace y la NASA son los contribuyentes iniciales
clave para la pila. Rackspace contribuyó con su plataforma «Archivos en la Nube» (código)
para alimentar la parte de almacenamiento de objetos de OpenStack, mientras que la NASA
aportó su plataforma «Nebulosa» (código) para alimentar la parte Compute. El Consorcio
OpenStack ha logrado tener más de 100 miembros, incluyendo Canonical, Dell, Citrix, etc
en menos de un año. OpenStack hace que sus servicios se encuentren disponibles por medio
de una API compatible con Amazon EC2/S3. Por lo tanto, las herramientas cliente escritas
para AWS se pueden utilizar con OpenStack.
5.5.9. DigitalOcean
Ofrece máquinas virtuales llamadas droplets, kubernetes, plataforma para apps, bases de
datos libres de mantenimiento como mongoDB, MySql, postgresSQL, Redis y de
configuración, almacenamiento basado en objetos, almacenamiento de volúmenes en bloque,
Tiene herramientas de desarrollo como API, CLI, monitoreo, trabajo en equipo, despliegue
de aplicaciones. Ofrece nube privada virtual, balanceadores de carga, ips flotantes, servicio
de DNS entre otros.
334
Cómputo en la nube y servicios
5.5.10. Oracle Cloud OCl
Tanto si se ncesita modernizar las aplicaciones de forma amplia, buscar oportunidades
específicas en el sector u optimizar una única tecnología como VMware, OCI reúne más de
80 servicios en la nube con SaaS líder en gestión interna y específico del sector en una única
plataforma de infraestructura. Se puede empezar a usar las arquitecturas de referencia y las
soluciones totalmente automatizadas disponibles para el despliegue directo en tu entorno
OCI.
OCl utiliza entornos híbridos y multinube permite migrar aplicacines locales a la nube,
permite desplegar VMware en la nube híbrida de modo que las cargas de trabajo basadas en
ésta no se rediseñen. Oracle Cloud VMware Solution proporciona un entorno virtulizado
nativo en la nube adminsitrado por el cliente, con infraestructura elástica.
El Centro de datos con bases de datos autónomas permite eliminar prácticamente toda la
complejidad asociada a la administración y protección de bases de datos locales. Autonomous
database administra el hardware y automatiza el aprovisionamiento, la configuración, el
ajuste, el escalado, la protección, las copias de seguridad y la reparación de las bases de datos,
reduciendo hasta en un 80% los costos de administración de bases de datos.
335
Cómputo en la nube y servicios
Tabla 5.5 Otros servicios de nube
Nombre Descripción
Ofrece una variedad de servicios en la nube como firewalls, servidores,
Kamatera
almacenamiento, almacenamiento en bloque, balanceador de carga, etc. La
plataforma es muy fácil de usar y ofrece más de 40 de las aplicaciones y
servicios de implementación más populares, con solo hacer clic en un botón.
Algunos de ellos se enumeran a continuación.
WordPress
Docker
pfSense
NFS
MongoDB
HAProxy
Importa más
Rancher
Elasticsearch
OpenVPN
336
Cómputo en la nube y servicios
Proporciona almacenamiento en bloque SSD dedicado para ampliar el
almacenamiento en cualquier momento.
Proporciona API para crear o administrar su propia plataforma de
alojamiento personalizada sobre Vultr
Programe una copia de seguridad automática, tome una instantánea
de toda la máquina virtual.
Protección cortafuegos y DDoS.
Balanceador de carga para escalabilidad y alta disponibilidad.
Puede tener sus servidores físicos en sus centros de datos. Perfecto para
construir una plataforma de nube híbrida.
es perfecto para alojar aplicaciones web, desde un blog personal hasta
Linode
comercio electrónico.
337
Cómputo en la nube y servicios
Linode es conocido por sus características esenciales, como a continuación.
Excelente soporte 24 × 7.
Nano computaciones para aplicaciones web pequeñas o para un servidor
de prueba.
Almacenamientos de objetos compatibles con S3 que lo hacen ideal para
operaciones de análisis de big data y aprendizaje automático.
11 centros de datos globales que brindan una excelente flexibilidad de
implementación y capacidad para cumplir con las normas a nivel de país.
Aplicaciones de un clic para WordPress, Drupal, Gitlab.
Los usuarios finales son los usuarios de las aplicaciones desplegadas en los recursos de
la nube. Dado que estos usuarios se registran e identifican con la aplicación y no con los
recursos de la infraestructura, no suelen ser conscientes de que la aplicación se está
ejecutando en los recursos de la nube.
338
Cómputo en la nube y servicios
[Link]. Aprovisionamiento de cuentas de usuario
339
Cómputo en la nube y servicios
‘Los mecanismos de autenticación para verificar la identidad digital de los usuarios se
diferencian unos de otros según posean un mayor o menor número de factores de
autenticación, interpretados cada uno de ellos como capas de seguridad que protegen la
confidencialidad de los datos de autenticación. Son tres los factores mediante los cuales un
usuario puede verificar su identidad:
Por medio de algo que el usuario sabe: autenticación basada en información que solo
él conoce. Por ejemplo, una contraseña o PIN.
Por medio de algo que el usuario tiene: autenticación basada en la posesión de algo,
ya sea físico o no. Por ejemplo, un token o un código recibido por SMS.
340
Cómputo en la nube y servicios
número y tipo de factores que se combinen da lugar a distintos mecanismos de
autenticación, siendo los más comunes:
Los tokens de contraseña única (OTP): Dispositivos físicos que poseen una pequeña
pantalla donde se muestra un número aleatorio generado por sí mismo. El usuario verifica su
identidad a través de este código junto a un número PIN o contraseña que solo él conoce.
Por medio de correo electrónico: El usuario se autentica haciendo clic en un enlace que
contiene un email recibido en su bandeja de entrada, a la que solo puede acceder él a través
de una contraseña que conoce.
Por medio de SMS: Se envía al móvil del usuario un mensaje de texto con un código que
introducirá para autenticarse en la plataforma o web en la que desea realizar el trámite,
habiendo accedido previamente mediante un usuario y contraseña que solo él conoce.
Por medio de datos biométricos: Este tipo de autenticación hace referencia a algo
inherente al usuario, como su huella dactilar, su iris o su rostro, entre otros. Normalmente se
emplean para verificar la identidad del usuario en trámites de alto riesgo o valor.
Cabe destacar que para asegurar una autenticación fuerte las empresas emplean, como
mínimo, mecanismos de autenticación de dos factores (2FA). En sectores como el bancario
su aplicación es de obligado cumplimiento. Por ejemplo, para que los clientes de entidades
bancarias puedan realizar pagos de forma segura y vía telemática es necesario que estas
permitan las transacciones a través de un 2FA.’ (keyfactor, s.f.)
341
Cómputo en la nube y servicios
[Link]. Administración de las políticas de autorización de acceso a datos en
la nube
Las políticas de autorización de acceso indican la forma en la que se asignan los recursos
a un usuario.
Al planificar una infraestructura en cloud, se debe tener en cuenta todo esto junto con lo
que nos ofrece nuestro proveedor en la nube. Aplicar un modelo al principio con privilegios
mínimos y definir permisos para cada entidad debería ser la tónica general.
El primero de los pasos, que viene a ser un resumen de lo que he señalado arriba, es saber
qué usuarios pueden acceder a qué y por qué pueden. En un entorno en la nube, es aún
más importante definir privilegios sólidos. Cada entidad, máquina o espacio de
almacenamiento debe tener su propio propósito específico, y la comunicación entre los
servicios debe ser de acuerdo a las necesidades y el uso. Una vez que hayamos establecido
estos límites para cada recurso, será mucho más sencillo monitorear la actividad extraña y
acceder a los cambios. Podremos concentrarnos en actividades consecuentes, en lugar de
apagar incendios.
Delegar permisos de acceso a roles, con cada acceso de autorización sólo a los recursos
que necesitamos. Indentifica usuarios con demasiados permisos tal y como se hace en un
entorno local. Cuando se reducen el número de entidades con acceso a información
confidencial, es más fácil monitorearlos e identificar comportamientos inusuales o nuevos en
342
Cómputo en la nube y servicios
nuestra red en la nube. Recordemos que nunca se sabe dónde empezará una violación, ya sea
por credenciales robadas de un admin o una vulnerabilidad de día cero en una aplicación
web.
Por este medio, una empresa puede mantener toda su estructura organizacional de usuarios
y permisos y reflejarla en sus aplicaciones en la nube con mínimos cambios.
‘Hay algunas políticas que se deben de tener presente cuando se trabaja en entornos de nube
343
Cómputo en la nube y servicios
3. Crear políticas de seguridad para evitar el bloqueo de cuentas de administrador.
En caso de que el administrador del arrendamiento abandone su organización.
Asegúrese de que las credenciales de Identity and Access Management (IAM) no están
codificadas en ninguna de la documentación de operaciones o software.
Cree un usuario de IAM para todos los usuarios de la organización que necesiten
acceder a recursos del arrendamiento. No comparta un usuario de IAM entre varios
usuarios humanos.
Revise los usuarios de los grupos de IAM periódicamente y elimine los usuarios que
ya no necesitan acceder.
Cambie las claves de API de IAM al menos cada 90 días para reducir el riesgo de
comprometerse.’ (Oracle, s.f.)
344
Cómputo en la nube y servicios
[Link]. Esfuerzos de estandarización
‘Amazon Web Services Identity Access Management (AWS IAM): Amazon utiliza este
mecanismo para la autenticación y gestión de usuarios, y se está convirtiendo en un estándar
de facto [Amazon 2012d]. Soporta la creación y la gestión de permisos para múltiples
usuarios dentro de una cuenta de AWS. Cada usuario tiene credenciales de seguridad únicas
con las que puede acceder a los servicios asociados a una cuenta. Eucalyptus también utiliza
AWS IAM para la autenticación y gestión de usuarios.
También proporciona un proceso para que los usuarios finales autoricen el acceso de
terceros a sus recursos de servidor sin compartir sus credenciales. La versión actual es la 1.0,
y el trabajo del IETF continúa para la versión 2.0.
que soportan OAuth incluyen [Link], Google App Engine y Microsoft Azure.
- OpenID: OpenID es un estándar abierto que permite autenticar a los usuarios de forma
descentralizada [OpenID 2012]. Los usuarios crean cuentas con un proveedor de identidades
OpenID y luego utilizan cuentas (o identidades) para autenticarse con cualquier recurso web
que acepte la autentificación de OpenID.
Las plataformas en la nube que soportan OpenID incluyen Google App Engine y Microsoft
Azure. OpenStack tiene un proyecto en curso para soportar OpenID.
Imagen de máquina de Amazon (AMI): Una AMI es un tipo especial de máquina virtual
que puede ser desplegada dentro de Amazon EC2 y también se está convirtiendo en un
estándar de facto [Amazon 2012b]. Eucalyptus y OpenStack también soportan AMI.
Disco duro virtual (VHD): VHD es un formato de archivo de máquina virtual soportado
por Microsoft [Microsoft 2006]. Las plataformas en la nube que soportan VHD incluyen
Amazon EC2 y Microsoft Azure.
346
Cómputo en la nube y servicios
Hay dos tipos de almacenamiento en la nube. El almacenamiento de datos tipificados
funciona de forma similar a una base de datos compatible con SQL y permite realizar
operaciones CRUD en tablas definidas por el usuario. El almacenamiento de objetos permite
realizar operaciones CRUD de objetos genéricos que van desde elementos de datos (similares
a una fila de una tabla), archivos y a imágenes de máquinas virtuales.
Amazon S3 ofrece una interfaz basada en SOAP que otros entornos de almacenamiento
en la nube, como como Eucalyptus y OpenStack, pueden utilizar.
347
Cómputo en la nube y servicios
Azure Storage), OpenStack (Object Storage) y Rackspace (Cloud Files). La API definida por
CDMI es una interfaz RESTful.
Entre los proveedores que ofrecen API basadas en SOAP o RESTful para la
administración de cargas de trabajo se encuentran Amazon EC2, Eucalyptus, GoGrid Cloud
Servers, Google App Engine, Microsoft Windows Azure y OpenStack (Image Service).
(Lewis, 2012).
348
Cómputo en la nube y servicios
Bibliografía
Ache, R. (18 de Noviembre de 2019). [Link] Recuperado el 07 de
Diciembre de 2021, de [Link]
[Link]
empresa/
Alonso Amo, F., Martínez Normand, L., & Segovia Pérez, F. (2005). Introducción a la ingeniería de
software: modelos de desarrollo de programas. Zaragoza: Delta publicaciones
Universitarias.
Król, K. (2020). Evolution Of Online Mapping: From Web 1.0 To WEB 6.0. Recuperado el 30 de 10
de 2021, de [Link] [Link]
Leiner, B., Cerf, V., Clark, D., Kahn, R., Kleinrock, L., Lynch, D., . . . Wolff, S. (1997).
[Link] Obtenido de [Link]
[Link]
Internet_1997.pdf
350
Bibliografía
Lewis, G. (Octubre de 2012). [Link] Recuperado el 07 de Diciembre de
2021, de [Link]
[Link]
Nagy, Z. (Noviembre de 2015). Integrated Design Pattern for Intelligent Web Applications.
Obtenido de [Link]
[Link]
telligent_Web_Applications
Nixon, R. (2014). Learning PHP, MySQL, JavaScript, CSS & HTML5. Sebastopol, CA: O’Reilly.
Oktaba, H., Alquicira Esquivel, C., Su Ramos, A., Martínez Martínez, A., Quintanilla Osorio, G.,
Ruvalcaba López, M., . . . Flores Lemus, M. Á. (2005). Modelo de Procesos para la Industria
de Software MoProSoft. Ciudad de México: Secretaría de Economía.
351
Bibliografía
Ombeni, M., & Thomas, E. (2016). Web Programming II (Server Side Scripting). Dar Es Salaam,
Tanzania: Commonwealth of Learning, Canada.
Padilla Aguilar, J. J., & Pinzón Castellanos, J. (2015). Estándares para Cloid Computing: Estado del
arte y análisis de protocolos para varias nubes. Repositorio Institucional UPB, 33-36.
Uddin Ahmed, m., Sadeed Ahmad, H., & Haider, S. (2017). Web Programming - I (Client Side
Scripting. Islamabad, Pakistan: Commonwealth of Learning.
352
Bibliografía
353
Bibliografía