You are on page 1of 56

Captulo 1: Introduccin a la Mquina Virtual .Net. Las Aplicaciones Web con Web Forms.

1.1. Qu es la mquina virtual .Net Framework?


.Net es un desarrollo de Microsoft para la creacin de una plataforma de desarrollo de software basado en la transparencia a redes y multiplataforma. Es la respuesta de Microsoft al mundo Java. .Net se basa en el concepto de mquina virtual, por el cual, un programa se ejecuta previamente sobre esa mquina virtual (en s es un programa), para despus ser la mquina la que ejecute el programa con las instrucciones adecuadas sobre el sistema operativo en el que se encuentra. Esto permite que un programa diseado sobre Windows pueda ser ejecutado en un sistema operativo Linux sin necesidad de cambiar las lneas de cdigo. .Net se encuentra disponible para todas las versiones de Windows, incluidas las versiones Server. Existen desarrollos de cdigo abierto para la implementacin de .Net en sistemas como Linux y Unix por mediacin del proyecto Mono iniciado por Ximian. El diseo de .NET Framework est enfocado a cumplir los objetivos siguientes: Proporcionar un entorno coherente de programacin orientada a objetos, en el que el cdigo de los objetos se pueda almacenar y ejecutar de forma local, ejecutar de forma local pero distribuida en Internet o ejecutar de forma remota. Proporcionar un entorno de ejecucin de cdigo que reduzca lo mximo posible la implementacin de software y los conflictos de versiones. Ofrecer un entorno de ejecucin de cdigo que fomente la ejecucin segura del mismo, incluso del creado por terceras personas desconocidas o que no son de plena confianza. Proporcionar un entorno de ejecucin de cdigo que elimine los problemas de rendimiento de los entornos en los que se utilizan secuencias de comandos o intrpretes de comandos.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 1

Ofrecer al programador una experiencia coherente entre tipos de aplicaciones muy diferentes, como las basadas en Windows o en el Web. Basar toda la comunicacin en estndares del sector para asegurar que el cdigo de .NET Framework se puede integrar con otros tipos de cdigo.

.NET Framework contiene dos componentes principales: Common Language Runtime (CLR) y la biblioteca de clases de .NET Framework. El CLR es el fundamento de .NET Framework. El motor en tiempo de ejecucin se puede considerar como un agente que administra el cdigo en tiempo de ejecucin y proporciona servicios centrales, como la administracin de memoria, la administracin de subprocesos y la interaccin remota, al tiempo que aplica una seguridad estricta a los tipos y otras formas de especificacin del cdigo que fomentan su seguridad y solidez. De hecho, el concepto de administracin de cdigo es un principio bsico del motor en tiempo de ejecucin. El cdigo destinado al motor en tiempo de ejecucin se denomina cdigo administrado, a diferencia del resto de cdigo, que se conoce como cdigo no administrado. La biblioteca de clases, el otro componente principal de .NET Framework, es una completa coleccin orientada a objetos de tipos reutilizables que se pueden emplear para desarrollar aplicaciones que abarcan desde las tradicionales herramientas de interfaz grfica de usuario (GUI) o de lnea de comandos hasta las aplicaciones basadas en las innovaciones ms recientes proporcionadas por ASP.NET, como los formularios Web Forms y los servicios Web XML. .NET Framework puede alojarse en componentes no administrados que cargan Common Language Runtime en sus procesos e inician la ejecucin de cdigo administrado, con lo que se crea un entorno de software en el que se pueden utilizar caractersticas administradas y no administradas. En .NET Framework no slo se ofrecen varios hosts de motor en tiempo de ejecucin, sino que tambin se admite el desarrollo de estos hosts por parte de terceros. Por ejemplo, ASP.NET aloja el motor en tiempo de ejecucin para proporcionar un entorno de servidor escalable para el cdigo administrado. ASP.NET trabaja directamente con el motor en tiempo de ejecucin para habilitar aplicaciones de ASP.NET y servicios Web XML, que se tratan ms adelante en este tema. Internet Explorer es un ejemplo de aplicacin no administrada que aloja el motor en tiempo de ejecucin (en forma de una extensin de tipo MIME). Al usar Internet Explorer para alojar el motor en tiempo de ejecucin, puede incrustar componentes administrados o controles de Windows Forms en
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 2

documentos HTML. Al alojar el motor en tiempo de ejecucin de esta manera se hace posible el uso de cdigo mvil administrado (similar a los controles de Microsoft ActiveX), pero con mejoras significativas que slo el cdigo administrado puede ofrecer, como la ejecucin con confianza parcial y el almacenamiento aislado de archivos. En la ilustracin siguiente se muestra la relacin de Common Language Runtime y la biblioteca de clases con las aplicaciones y el sistema en su conjunto. En la ilustracin se representa igualmente cmo funciona el cdigo administrado dentro de una arquitectura mayor.
Fuente: Microsoft MSDN.

Componentes de .NET Los principales componentes del marco de trabajo son: El conjunto de lenguajes de programacin La Biblioteca de Clases Base o BCL El Entorno Comn de Ejecucin para Lenguajes o CLR por sus siglas en ingls.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 3

Conjunto de Lenguajes En el conjunto de los lenguajes de programacin se han desarrollado unos 60 lenguajes de programacin para la plataforma .Net, incluyendo C#, Cobol, Visual Basic, Delphi (Object Pascal), C++, Perl, Python, Fortran y PowerBuilder. Dentro de una aplicacin en .Net disponemos de la posibilidad de tener objetos diseados en lenguajes diferentes.

La Biblioteca de Clases La Biblioteca de Clases Base (BCL por sus siglas en ingls) maneja la mayora de las operaciones bsicas que se encuentran involucradas en el desarrollo de aplicaciones, incluyendo entre otras: Interaccin con los dispositivos perifricos Manejo de datos (ADO.NET) Administracin de memoria Cifrado de datos Transmisin y recepcin de datos por distintos medios (XML, TCP/IP) Administracin de componentes Web que corren tanto en el servidor como en el cliente (ASP.NET) Manejo y administracin de excepciones Manejo del sistema de ventanas Herramientas de despliegue de grficos (GDI+) Herramientas de seguridad e integracin con la seguridad del sistema operativo Manejo de tipos de datos unificado Interaccin con otras aplicaciones Manejo de cadenas de caracteres y expresiones regulares Operaciones aritmticas Manipulacin de fechas, zonas horarias y periodos de tiempo Manejo de arreglos de datos y colecciones Manipulacin de archivos de imgenes Aleatoriedad Generacin de cdigo Manejo de idiomas Auto descripcin de cdigo Interaccin con el API Win32 o Windows API. Compilacin de cdigo

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 4

Esta funcionalidad se encuentra organizada por medio de espacios de nombres jerrquicos.


Fuente: Wikipedia

El CLR. Entorno Comn de Ejecucin para Lenguajes Es el autentico motor de .NET. El Common Language Runtime o CLR (Lenguaje comn en tiempo de ejecucin) es el componente de mquina virtual de la plataforma .Net de Microsoft. Es la implementacin del estndar Common Language Infrastructure (CLI) que define un ambiente de ejecucin para los cdigos de los programas. El CLR ejecuta una forma de cdigo intermedio (bytecode) llamada Common Intermediate Language (CIL, anteriormente conocido como MSIL -- Microsoft Intermediate Language), la implementacin de Microsoft del CLI. Los desarrolladores que usan CLR escriben el cdigo en un lenguaje como C# o Visual Basic .Net. En tiempo de compilacin, un compilador.NET convierte el cdigo a MSIL (Microsoft Intermediate Language). En tiempo de ejecucin, el compilador en tiempo de ejecucin (Just-in-time compiler) del CLR convierte el cdigo MSIL en cdigo nativo para el sistema operativo. Alternativamente, el cdigo MSIL es compilado a cdigo nativo en un proceso separado anterior a la ejecucin. Esto acelera las posteriores ejecuciones del software debido a que la compilacin de MSIL a nativo ya no es necesaria. A pesar de que algunas implementaciones del Common Language Infrastructure se ejecutan en sistemas operativos no Windows, el CLR se ejecuta slo en sistemas operativos de Microsoft Windows.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 5

La manera en que la maquina virtual se relaciona con el CLR permite a los programadores ignorar muchos detalles especficos de la CPU que estar ejecutando el programa. El CLR tambin permite otros servicios importantes, incluyendo los siguientes: Administracin de la memoria Administracin de hilos Manejo de excepciones Recoleccin de basura Seguridad Proceso de ejecucin del cdigo en la mquina virtual de .Net. (Fuente: Wikipedia)

Estructura interna del CLR. (Fuente Wikipedia)

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 6

Caractersticas del CLR: Es el encargado de proveer lo que se llama cdigo administrado, es decir, un entorno que provee servicios automticos al cdigo que se ejecuta. Los servicios son variados: Cargador de clases: permite cargar en memoria las clases. Compilador MSIL a nativo: transforma cdigo intermedio de alto nivel independiente del hardware que lo ejecuta a cdigo de mquina propio del dispositivo que lo ejecuta. Administrador de cdigo: coordina toda la operacin de los distintos subsistemas del Common Language Runtime. Recolector de basura: elimina de memoria objetos no utilizados. Motor de seguridad: administra la seguridad del cdigo que se ejecuta. Motor de depuracin: permite hacer un seguimiento de la ejecucin del cdigo aun cuando se utilicen lenguajes distintos. Verificador de tipos: controla que las variables de la aplicacin usen el rea de memoria que tienen asignado. Administrador de excepciones: maneja los errores que se producen durante la ejecucin del cdigo. Soporte de multiproceso (hilos): permite ejecutar cdigo en forma paralela. Empaquetador de COM: coordina la comunicacin con los componentes COM para que puedan ser usados por el .NET Framework. Soporte de la Biblioteca de Clases Base: interfaz con las clases base del .NET Framework. Esto quiere decir que existen tipos de estructuras como es la de java y la .NET

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 7

1.2. El entorno de Visual Studio


Visual Studio es un entorno integrado de desarrollo de aplicaciones (IDE). Su funcin es dar todas las herramientas necesarias para que un desarrollo de software pueda ser realizado desde la edicin de cdigo, hasta la compilacin de ese cdigo, pasando por todas las fases de Compilacin y control de errores. Incluye un editor grfico para el desarrollo de Interfaz grficas en Windows y Web. A continuacin podemos ver la pantalla principal de Visual Studio.
Pantalla Principal de Visual Studio

Botones de Acceso a Funciones

Pestaas con Distintas Funciones Proyectos Recientes.

Informacin sobre los lenguajes de .Net

Informacin General sobre el entorno de programacin de Microsoft

Botones de Acceso a Funciones: Muchas veces puede ocurrir que no veamos algunas de las funcionalidades bsicas del IDE, como son el explorador de soluciones, la caja de herramientas, o las propiedades. Por mediacin de estos botones podemos abrir estas ventanas en el caso de que estuvieran ocultas.

Explorador de Soluciones

Caja de Herramientas

Explorador de Objetos Propiedades

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 8

Funciones: Ventana de Propiedades. Todos los objetos en Windows tienen propiedades que podemos modificar. Se selecciona el objeto y a continuacin modificamos sus propiedades.

Nombre del Objeto

Valor de la Propiedad Lista de Propiedades

Explicacin de la Propiedad

Ventana Caja de Herramientas. Cuando tenemos una ventana de Windows Forms o una pgina de Web Forms, disponemos de una serie de elementos grficos que pueden ser aadidos a cada uno de estos elementos. Por mediacin de la Caja de Herramientas podemos seleccionar los elementos que queremos visualizar para ser incorporados a nuestro proyecto. Los objetos se organizan en categoras para una bsqueda ms sencilla. Si un objeto aparece desactivado, significa que no se puede aadir. Los motivos
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 9

pueden ser: el programa se est ejecutando, no estamos en modo grfico, o directamente el objeto que se quiere agregar no est disponible para Windows Forms o Web Forms.

Pestaas de Categoras de objetos

Objetos

Explorador de Soluciones El explorador de soluciones nos permite ver los ficheros y recursos que componen nuestra aplicacin. Bsicamente un proyecto se compone de un nombre de solucin, seguido de un nombre o nombres de proyecto y, dentro de estos, todos los ficheros y recursos necesarios para cada proyecto.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 10

Nombre de la Solucin Nombre del Proyecto

Ficheros de cdigo y recursos del proyecto.

1.3. Estructura de un fichero de cdigo en Net Framework.

}
}

Uso de Clases agrupadas en Espacios de Nombres

Espacio de Nombres

Nombre de la Class

Mtodo

La apertura y cierre de llaves marca el bloque que identifica

Una aplicacin se compone de una serie de elementos. Primero disponemos de lo que se conoce como espacio de nombres, que es una forma de agrupar objetos. La class, es el objeto en s, y es el lugar donde programaremos el cdigo. La class permite slo unas pocas instrucciones, para programar, usamos el concepto de mtodo. Un mtodo son un conjunto de instrucciones que se llaman cuando llamamos al mtodo. Los mtodos, salvo los mtodo annimos, tienen un nombre que permite llamarlos en cualquier parte del cdigo en la que se tenga acceso al mismo. Ms adelante veremos los mtodos y sus funcionalidades.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 11

Toda aplicacin tiene que tener un punto de entrada, o lo que es lo mismo, el ordenador tiene que saber donde debe de empezar a ejecutar el cdigo. En .NET el punto de entrada es el mtodo Main, mtodo de tipo static y del cual slo puede haber uno en toda la aplicacin. En una aplicacin en Windows, el fichero de proyecto por defecto, program.cs, contiene el mtodo Main.
static void Main() { Application.Run(new Form1()); }

En el ejemplo anterior, el mtodo Main invoca a la clase Application, que contiene mtodos estticos. Uno de estos mtodos, .Run, permite ejecutar un bucle de mensajes de aplicacin dentro del subproceso actual.
Inicio (Main)
Por ejemplo Application.Run(new Form1());

Mtodo 1
Obtener Mensaje Aplicacin Enviar Mensaje a destinatario

Mtodo 2

Mtodo 3 Es Salir? S Fin No

Toda aplicacin maneja un concepto denominado Mensaje, cuya finalidad es atender a todos los sucesos y hechos que se produzcan durante su ejecucin. Todos los mensajes acaban en un mtodo, bien sea diseado por el programador, o por el diseador de VisualStudio. En la programacin Orientada a Objetos, los objetos se comunican entre s mediante mensajes. En la lnea Application.Run, aparece entre parntesis, new Form1. La clase Application realiza una llamada al constructor de la clase (new) Form1. En nuestro caso, Form1, es un objeto del tipo ventana de Windows, que a su vez tiene un constructor (el nombre del mtodo constructor tiene que coincidir con el nombre de la clase y, es el nico mtodo que se puede llamar as):
public Form1() { InitializeComponent(); }

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 12

El constructor, que no es ms que un mtodo, hace una llamada a otro mtodo que se llama InitializeComponent(), que es el responsable de construir los objetos que componen la ventana antes de visualizarla en pantalla. Este mtodo permite cambiar todas las propiedades de los objetos. Se encuentra en el fichero Form1.Designer.cs. Una vez que la ventana est mostrada, el programa empieza a escuchar los mensajes que se pudieran producir. Por ejemplo, el usuario podra cerrar la ventana usando la x de la barra de la ventana. Esto produce lo que se conoce como evento. En realidad, todo lo que ocurre en la aplicacin est basado en eventos. El evento de cerrar la venta, del objeto Form1, invoca al mtodo Dispose, que se encuentra en el fichero Form1.Designer.cs, e inicia los procesos necesarios para cerrar la ventana.
protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); }

El mtodo Dispose, admite un parmetro de entrada (disposing), que recibe el valor de true si ha sido llamado directa o indirectamente por el cdigo del usuario y, de false, si ha sido invocado por el CLR (Garbage Recolector). En Components se encuentran todos los componentes que forman parte del objeto ventana. El mtodo es del tipo Protected, lo que significa que slo es accesible por los mtodos de su propia clase y los de las clases derivadas. La palabra override, al igual que la palabra reservada virtual, que est relacionado con el polimorfismo de los objetos, especifica que este mtodo est sustituyendo al mtodo del tipo virtual heredado de la clase base.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 13

1.4. El Modelo de Aplicaciones Web.

Aplicaciones Web. Una aplicacin Web es un programa informtico que puede dar servicio simultneamente a mltiples usuarios que lo ejecutan a travs de Internet. Las aplicaciones Web, se basan en el modelo de tres capas, como podemos ver en la siguiente figura:
Capa Cliente Capa Intermedia Capa Datos

Internet

BASE DE DATOS

La Capa Cliente. Es la capa con la que interacta el usuario. Principalmente realiza dos funciones: Por un lado se encarga de capturar los datos de usuario con los que opera la aplicacin y envirselos a esta (por ejemplo solicitar datos para una bsqueda); por otro lado, presenta al usuario los resultados generados por la aplicacin. En la arquitectura de tres capas, la capa cliente esta implementada por el navegador. Un navegador es un tipo de software basado en interfaz grfica, que utilizan los usuarios para poder interactuar con una aplicacin Web. Existen diferentes modelos de navegadores, los cuales pueden presentar variaciones a la hora de ejecutar nuestro cdigo ASP. Es muy importante conocer estos comportamientos diferentes. Los resultados que el navegador muestra se conocen con el nombre de pginas web. Una pgina Web es un documento de texto que contiene informacin para ser visualizada por el navegador. Esta informacin es enviada por la Capa Intermedia y est codificada en un lenguaje especial capaz de ser interpretado por todos los tipos de navegadores. Este lenguaje es el HTML. HTML no es un lenguaje de programacin como tal, sino que se trata de un lenguaje de marcado formado por un conjunto de marcas o etiquetas, que
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 14

combinadas adecuadamente, permiten presentar informacin en la pantalla del navegador. A la Capa Cliente, no slo conectamos hoy da navegadores, tambin conectamos dispositivos mviles como son las PDA, telfonos mviles, e incluso aplicaciones independientes. Para una aplicacin que use el navegador, los lenguajes que procesan son el HTML y el XHTML. Para un dispositivo mvil, son WML y XHTML;, y; por ltimo, para las aplicaciones web, usamos XML. La comunicacin entre la Capa Cliente y la Capa Intermedia, se realiza por medio del protocolo HTTP. El protocolo HTTP se basa en un mecanismo de peticin respuesta. Cuando el usuario necesita ejecutar una aplicacin o pgina Web, sobre el servidor, enva una peticin HTTP. Las peticiones HTTP se basan en una cabecera, en la que se incluye la direccin del recurso solicitado (URL) e informacin relativa a las capacidades y caractersticas del navegador cliente. En estas caractersticas podemos destacar el tipo de navegador, su versin, si admite cookies, etc. Para el caso de ejecutar un programa, el cuerpo de la peticin contendr los datos proporcionados por el cliente para la aplicacin. Ver Esquema:
Peticin HTTP
Cabecera Cuerpo

Identificacin Cliente
Navegador

Datos Usuario
Servidor Web

Respuesta HTTP
Cabecera Cuerpo

Identificacin de Control

HTML

La Capa Intermedia. Esta capa es la que contiene la aplicacin en s. Est instalada en una mquina independiente conocida como Servidor, a la que acceden los clientes a travs de Internet. La aplicacin se ejecuta por mediacin de un motor especial capaz de permitir que una misma instancia de la aplicacin pueda dar servicio a mltiples clientes. Adems de este motor, los servidores necesitan otro software conocido como Servidor Web, que sirva la interfaz grfica entre la aplicacin y el cliente, lo que se conoce como el dilogo de HTTP. Para las tecnologas Microsoft, el servidor Web utilizado es el Internet Information Server, ms conocido por sus siglas IIS. Las funciones de la capa intermedia son: Recoger los datos enviados desde la capa cliente; procesar la informacin e implementar la lgica de la
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 15

aplicacin, incluyendo el acceso a datos y, por ltimo; generar las respuestas para el cliente. La capa intermedia, dispone de varias tecnologas para el desarrollo de aplicaciones Web, como son: ASP.Net. Tecnologa de Microsoft, que ha evolucionado de ASP. Java EE 5. Es un conjunto de libreras Java especficamente diseadas para crear aplicaciones en entorno Web. PHP. Lenguaje de programacin para la creacin de scripts de servidor. La Capa de Datos. Tiene como misin el almacenamiento permanente de la informacin manejada por la aplicacin y la gestin de la seguridad de los mismos. Para su manejo se usan bases de datos relacionales, como son: SQL Server, Oracle y MySQL. Cada tecnologa de capa intermedia que accede a la capa de datos, proporciona sus propias libreras para poder acceder a una base de datos. En el caso de ASP.Net es ADO.Net.

1.4.1. Programacin en HTML y XHTML Como pudimos ver en el apartado de XML, SGML es utilizado para definir los lenguajes de marcas necesarios para cada tipo de documento. SGML es, por tanto, lo que se conoce como metalenguaje: un lenguaje diseado para crear otros lenguajes de marcas. HTML es uno de estos lenguajes HTML es un lenguaje de marcas, como todos los definidos con SGML, con la aplicacin especfica de facilitar la composicin de documentos hipertexto. Su propio nombre, Hypertext Markup Language, destaca la importancia de la existencia de hipervnculos en los documentos, pero HTML tiene adems muchas otras funciones que permiten disear pginas en las que se combina el contenido, texto e imgenes principalmente, con indicaciones de formato que pueden aplicarse en una pantalla, un dispositivo de impresin o uno de sntesis de voz. Las marcas de HTML se delimitan con los smbolos < y >, como ocurre en muchos lenguajes derivados de SGML, en cuyo interior se escribira el nombre del elemento y, opcionalmente, la lista de los atributos si los tuviera. En caso de que la marca corresponda a un elemento con contenido, no vaco, ste se entregara tras el carcter > y, por regla general, existira una marca de cierre con la que se indicara dnde termina el elemento. La marca de cierre

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 16

tendra el mismo nombre de elemento que la de apertura, pero ira precedido de los caracteres </ en lugar nicamente <. En la definicin de HTML. En la DTD del HTML se fue bastante permisivo en cuanto a la aparicin o no de las etiquetas de cierre, el uso de las maysculas y minsculas, la delimitacin de los valores de los atributos, etc. Los analizadores de documentos HTML, que son el motor de agentes de usuario como los navegadores, son ms permisivos an, por lo que no es de extraar encontrar documentos HTML con patentes incorrecciones que, sin embargo, producen el resultado que se pretenda. Elementos y marcas. Al hablar de HTML suelen intercambiarse los trminos elemento y marca como si fuesen una misma cosa, pero en realidad no lo son y, en ocasiones, es necesario distinguir entre un concepto y otro. Podemos verlo ms claro en la figura siguiente:

Modelo de un documento HTML


Marca de apertura del elemento HTML Marca de atributo Valor del atributo

<HTML lang = es> <BODY style = background: silver>


Elemento BODY

Texto del documento </BODY> </HTML

Marca de cierre del elemento HTML

Contenido del elemento BODY

En este esquema tenemos un elemento HTML con sus correspondientes etiquetas de apertura : <HTML> y cierre </HTML>. De existir atributos, tal como ocurre en este caso, siempre se introducirn en la marca de apertura usando la sintaxis atributo = valor, yendo este ltimo normalmente entrecomillado. El contenido del elemento es el que existe entre las marcas de inicio y cierre, en este caso un elemento BODY y el contenido de ste. Si buscamos en la DTD de HYML la definicin del elemento HTML comprobaremos que se indica explcitamente que puede contener dos elementos: HEAD y BODY, que aparecern en ese orden.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 17

La jerarqua de los distintos elementos, por la que unos contienen a otros y stos, a su vez, a otros, viene pues determinada por la definicin de tipo de documento o DTD. En ella se establece exactamente qu elementos pueden aparecer como contenido de otros y cules no. Puesto que la lista de elementos, sus nombres y atributos est predefinida, HTML es un lenguaje con una sintaxis fija. Dicho con otras palabras: no podemos inventarnos nuevas marcas para elementos a medida. XHTML Como hemos podido comprobar cuando vimos XML (otro lenguaje obtenido a partir de SGML), su importancia en la programacin actual est fuera de cualquier duda. No hay aplicacin que no haga uso de XML de una forma u otra. Pero la importancia de XML tambin se extiende al diseo de documentos HTML, ya que ha sido utilizado para desarrollar el que es llamado el sucesor del HTML, el XHTML. La primera versin de XHTML, la 1.0, se convirti en recomendacin del W3C el 26 de enero de 2000, siendo, bsicamente, una reconstruccin de HTML 4.01 utilizando XML en lugar de SGML. Por ello se suele decir que XHTML 1.0 es una reformulacin de HTML 4.01 usando XML. Coloquialmente se dice que XHTML es una aplicacin del XML. El objetivo de XHTML es aprovechar las ventajas de XML en un nuevo lenguaje de marcas para la Web pero manteniendo una compatibilidad prcticamente absoluta con HTML 4.01, de tal manera que los actuales agentes de usuario, que no se han adaptado an a este nuevo estndar, puedan seguir interpretando correctamente dichos documentos. Esta primera versin, no obstante, ha servido ya y servir en el futuro para ir avanzando hacia capacidades que eran difcilmente alcanzables con HTML. La versin 1.1. de XHTML, por ejemplo, aade el concepto de modularizacin del lenguaje, dividindolo en un ncleo y mdulos perifricos que pueden ir integrndose segn las necesidades de cada documento. Los documentos XHTML son muy similares a los HTML, pero en ellos hay que tomar en consideracin las normas XML antes citadas: delimitacin de valores de atributos, correcta anidacin de los elementos, no supresin de marcas de cierre, etc. Lo que se consigue, en principio, son documentos HTML mucho ms correctos. La ventaja ms importante, sin embargo, es que los agentes de usuario capaces de manipular documentos XML pueden utilizarse con XHTML, incluso a medida que el lenguaje vaya evolucionando, sin necesidad de actualizarlos, algo que no ocurra con HTML.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 18

1.4.2. Javascript JavaScript es un lenguaje que nos permite interactuar con el navegador de manera dinmica y eficaz. Nos permite, por ejemplo, que el navegador no tenga que llamar al servidor para verificar si un dato ha sido rellenado. Crear un documento HTML es crear algo de carcter esttico, inmutable. La pgina se carga y ah termina la historia. Tenemos ante nosotros la informacin que buscbamos, pero no se puede interactuar con ella. El nacimiento de JavaScript viene a solucionar este problema. Se trata de un lenguaje de tipo script compacto, basado en objetos y guiado por eventos diseado especficamente para el desarrollo de aplicaciones cliente-servidor dentro del mbito de Internet. Los programas JavaScript van incrustados en los documentos HMTL, y se encargan de realizar acciones en el cliente, como pueden ser pedir datos, confirmaciones, mostrar mensajes, crear animaciones, comprobar campos... Existen distintos modos de incluir lenguaje JavaScript en una pgina. La forma mas frecuente de hacerlo es utilizando la directiva <script> en un documento HTML (se pueden incluir tantas directivas <script> como se quiera en un documento). El formato es el siguiente: <script language="Javascript 1.3"> El atributo lenguaje hace referencia a la versin de JavaScript que se va a utilizar en dicho script. Otro atributo de la directiva script es src, que puede usarse para incluir un archivo externo que contiene JavaScript y que quiere incluirse en el cdigo HTML. <script language="JavaScript" src ="archivo.js"> </script> El archivo externo simplemente es un archivo del texto que contiene cdigo JavaScript, y cuyo nombre acaba con la extensin js. Puede incluirse tambin cdigo JavaScript como respuesta a algn evento: <input type="submit" onclick="alert('Acabas de hacer click');return false;" value="Click">

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 19

1.5. Introduccin a ASP .Net


ASP es la parte de Net Framework orientada a la creacin de aplicaciones de tres capas. Las aplicaciones ASP tienen que ejecutarse sobre un servidor IIS y se comunican con la capa cliente por mediacin del protocolo HTTP. Ventajas de ASP.NET: Utilizacin de lenguajes orientados a objetos. Cualquier lenguaje soportado por la plataforma Net Framework puede desarrollar aplicaciones con ASP.NET. Programacin basada en eventos. Al igual que las aplicaciones Windows, las aplicaciones Web ASP.Net estn basadas en eventos, lo que facilita la escritura de cdigo y permite la estructuracin de las aplicaciones. Separacin de cdigo y presentacin. El cdigo y la presentacin en una aplicacin bajo ASP .Net se encuentran en archivos independientes. La extensin aspx almacena el formulario Web y los controles. El cdigo de respuesta a los eventos se encuentra en un archivo de extensin aspx.cs (para C#) y aspx.vb (para Visual Basic). Cules son los componentes de una aplicacin ASP.Net? Independientemente del lenguaje utilizado aceptado por el Net Framework, por ejemplo C# o Visual Basic, (lo que permite adems usar las distintas clases que conforman el .Net) una aplicacin bajo ASP.Net se compone de los siguientes elementos: Formularios Web. Representan las pginas Web de la aplicacin a travs de las cuales se producir la interaccin con el usuario. Controles Web y controles HTML. Son los elementos grficos que permiten realizar el diseo de la interfaz de usuario. Objetos ASP. Permiten resolver los diferentes aspectos de la problemtica que se presenta en la programacin de aplicaciones Web, como es el mantenimiento de estado, el acceso a los datos del cliente, etc. Primeros Pasos. La Creacin de una aplicacin ASP. Desde la versin de Visual Studio 2005, no es necesario instalar el Internet Information Server (IIS) en la mquina, ya que incorpora un emulador del IIS. Esto permite al programador abstraerse del problema que supone la configuracin correcta del IIS y su puesta en marcha.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 20

Para el desarrollo de una aplicacin Web, cuando pulsamos sobre el men de Archivo, Nuevo, debemos de seleccionar la opcin de Sitio Web. En la ventana que aparece nos muestra una opcin llamada Lenguaje, que nos permite especificar el lenguaje de programacin que utilizaremos para desarrollar nuestro proyecto Web. Desde el punto de vista del diseo de la aplicacin, en el Explorador de Soluciones, lo primero que podemos observar es que cada formulario Web, tiene un fichero con extensin .aspx. Por defecto genera las pginas con el nombre de Default. Evidentemente el nombre se puede cambiar. Este fichero se divide en dos partes: Diseo y cdigo (Ver figura) En la parte cdigo podemos ver el cdigo en formato HTML, que es lo que realmente recibe el cliente e interpreta el Navegador. En la parte Diseo, podemos ver como mostrar el Navegador ese cdigo, es decir, veremos cmo coloca los distintos objetos grficos que componen el formulario Web y que son construidos a partir de su cdigo en HTML. Dentro del Formulario Web, podemos observar que es un archivo de texto con extensin .aspx. Adems de las etiquetas HTML que componen la pgina, el archivo .aspx incluye una instruccin en la primera lnea de cdigo que no es una etiqueta de HTML. Es una directiva: <%Page Language = C#%> En el servidor todo archivo .aspx, es transformado en una clase. Las directivas que aparecen los ficheros .aspx, son rdenes que se evalan durante ese proceso de transformacin. Si desplegamos en el smbolo del +, que aparece al lado del fichero default.aspx, observaremos que aparece otro fichero con el mismo nombre y que se llama Default.aspx.cs (vb si es Visual Basic). Este es el fichero de

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 21

cdigo asociado que es el responsable de contener el cdigo que se ejecutar en el servidor. Si damos doble click sobre la vista diseo del fichero default.aspx, o bien damos doble click sobre el nombre Default.aspx.cs, accederemos a su contenido. Como podemos observar, su estructura es idntica a los ficheros de clase que se han desarrollado para las aplicaciones de Consola o de Windows. Lo primero que se puede observar, es que la clase que conforma el fichero, hereda de una clase llamada System.Web.UI.Page, que es la responsable de facilitar el soporte bsico para la programacin en el servidor; entre otras cosas, dispone de una serie de propiedades que permiten acceder a los objetos ASP y ofrece el soporte necesario para la gestin de eventos en el servidor. Cualquier cdigo de servidor asociado a la pgina deber ser incluido en el interior de mtodos definidos en esta clase. La mayor parte de los mtodos suelen ser mtodos de respuesta a eventos producidos sobre los elementos de la interfaz grfica de usuario y que se ejecutarn en el servidor. Prctica. Primera Aplicacin en ASP. Lo primero que vamos a probar es la inclusin de cdigo ASP directamente en el cdigo HTML, lo que se conoce como scripts de servidor. Para ello, tecleamos el siguiente cdigo dentro de las etiquetas <div> de la pgina Default:
<center> <% for (int i = 1; i < 7; i++) {%> <h<%=i %>> Mi primera aplicacin en ASP </h<%=i %>> <%} %> </center>

Es importante saber que a pesar de que la sintaxis de C# exige terminar una lnea con ;, aqu no se puede poner. Cuando un script de servidor, o un bloque de cdigo, tienen como objetivo insertar el resultado de una expresin o variable del programa en la pgina de respuesta, se las conoce como expresiones ASP y utilizan esta sintaxis: <%=expresin%>. La variable i, que es utiliza en el bucle, es utilizada como expresin ASP en el cdigo: <h<%=i %>>. En este caso su funcin es establecer el orden de la etiqueta de encabezado que va a ser utilizada. Como podemos observar, funciona perfectamente, pero esto no es una solucin vlida, ya que es muy complicado su manejo cuando se tiene que

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 22

procesar gran cantidad de cdigo ASP, con cdigo HTML. Adems, se pierde la lgica de la programacin orientada a objetos. La solucin pasa por utilizar el fichero de cdigo asociado para ejecutar el cdigo ASP. Siguiendo con el ejemplo, podemos teclear el siguiente cdigo en el fichero de Default.aspx.cs:
protected void Page_Load(object sender, EventArgs e) { this.Response.Write("<center>"); for (int i = 1; i < 7; i++) { this.Response.Write("<h" + i + ">Mi Primera Aplicacin en ASP" + "</n" + i + ">"); } this.Response.Write("<center>"); }

El resultado es idntico al caso anterior, salvo que aqu el cdigo de servidor se ejecuta en el fichero de cdigo asociado. Podemos observar que para generar de forma dinmica las etiquetas HTML, es necesario hacer uso del mtodo Write(), del objeto ASP, Response, ya que no es posible escribirlas directamente en el cdigo.

1.5.1. Programacin basada en Eventos La mayor parte de las instrucciones que se incluyen en la clase Page se ejecutarn como respuesta a eventos. En el ejemplo que acabamos de hacer, el cdigo se ejecuta dentro del evento Load del objeto Page. La programacin en eventos en ASP.Net, consiste en implementar mtodos dentro de la clase Page que sern invocados por el motor de ASP.NET, y por tanto ejecutados en el servidor, como respuesta a ciertos eventos que se producen tanto en los controles Web que forman la interfaz grfica de usuario como en el propio formulario Web. Eventos de Formulario. Durante el proceso de peticin de una pgina aspx se producen una serie de eventos en el servidor que estn definidos en la clase Page. Algunos de ellos son: Init. Se produce al recibir la peticin de la pgina del servidor durante el proceso de inicializacin de la misma. Normalmente, este evento se emplea para realizar alguna tarea previa al procesamiento de la pgina.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 23

Load. Una vez finalizada la inicializacin (Init) de la pgina se produce la carga en memoria de la misma, hecho que es notificado lanzando el evento Load. Este evento suele utilizarse para tareas de inicializacin de propiedades de los controles Web incluidos en la pgina aspx. PreRender. Se produce cuando se va a proceder al envo de la respuesta al cliente. Tipicamente, se emplea para realizar los ltimos cambios en los contenidos de la pgina. La definicin de estos mtodos tiene que realizarse de la siguiente forma: Page_Xxx, donde Xxx es el nombre del evento a capturar. As pues, el evento Init, debera de crearse como Page_Init. Estructura: protected void Page_Init(object sender, EventArgs e) Esto es posible gracias a la utilizacin del atributo AutoEventWiredup de la directiva Page. Al establecer este atributo al valor de true, los eventos de la pgina son asociados automticamente a los mtodos que utilizan la convencin de nombres especfica, evitando tener que hacer dicha asociacin desde cdigo a travs de delegados. Prctica: Implementar los tres eventos mencionados anteriormente en nuestra aplicacin ASP, escribiendo en el navegador el evento que se est desarrollando en ese momento.

1.5.2. Eventos en controles Web. Los controles Web son los objetos de servidor que proporcionan una interfaz grfica basada en HTML para facilitar al cliente la interaccin con la aplicacin. Adems de propiedades y mtodos, los objetos de servidor, contienen eventos que son lanzados por el control al realizar algn tipo de accin sobre el mismo, como, por ejemplo, un click sobre un botn de pulsacin o la seleccin de elementos en una lista. Aunque el evento es desencadenado en la pgina HTML, su procesamiento y la respuesta al mismo se realizan sobre el servidor. Prctica: Aadir objetos Web al formulario. Aadir un label y un button. Observaremos que todos los controles son puestos a la izquierda. En versiones anteriores se podan colocar en cualquier sitio como si fuera una ventana. Esto es debido a que en el cdigo HTML para que se pueda realizar, es necesario incluir una etiqueta <body>, que no es compatible con el estndar XHTML.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 24

Para colocar los objetos se suele recurrir al uso de hojas de estilo (CSS) Podemos observar que los objetos incorporados tienen una etiqueta HTML que no es estndar, pero tienen asociado una o varias etiquetas HTML y cdigo JavaScript de cliente, de modo que al ser procesada la pgina en el servidor antes de su envo al cliente, cada instruccin de control Web es sustituida por su bloque HTML/JavaScript equivalente, recibiendo el navegador nicamente el contenido compatible con XHTML 1.0. En Windows, la propiedad Name del objeto me permita identificar a ese objeto cuando necesitaba referirme a l. En ASP, la propiedad Name es Id. Por su parte, la propiedad Text de los objetos se comporta igual que para una aplicacin en Windows. En cuanto a los eventos, como el del Click del botn, su funcionamiento es idntico a Windows. Podemos vincular el siguiente cdigo al botn que acabamos de incorporar: lblTexto.Text = <h1>Mi segunda aplicacin en ASP</h1>; Cuando el usuario pulse sobre el botn, la propiedad text del label, contendr un bloque de texto en HTML, lo que provocar que al ser pulsado el botn se visualice en el rea ocupada por la etiqueta el mensaje Mi segunda aplicacin en ASP, con el tamao del encabezado de primer nivel.

Proceso de Ejecucin de los mtodos de respuesta a Eventos en ASP


Secuencia de Eventos producidos en Cliente Secuencia de Ejecucin de Mtodos en Servidor

1. Evento TextChanged en TextBox

1. Mtodo TextChanged en TextBox

2. Evento SelectedIndexChanged en ListBox

2. Mtodo SelectedIndexChanged en ListBox

3. Evento Click en Button

3. Mtodo Click en Button

Solicitud de recarga de la pgina al servidor

Enviar pgina al Cliente

Si observamos el cdigo enviado al usuario, los controles Web han sido sustituidos por en etiquetas HTML estndar, siendo el control label en una etiqueta <span> y el botn de pulsacin en un botn HTML del tipo submit. En el diagrama anterior cuando se pulsa sobre el button (que es del tipo Submit) dentro de un formulario HTML que apunta a su propio archivo .aspx, el navegador vuelve a realizar una nueva solicitud de la pgina .aspx, operacin conocida como recarga de la pgina. Gracias a la informacin enviada desde
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 25

campos ocultos del formulario HTML, el objeto Page determina que debe ejecutarse y la secuencia para posteriormente volver a enviar el nuevo contenido de la pgina al cliente. No todos los eventos de los controles Web provocan una recarga inmediata de la pgina, ya que esto podra redundar en una prdida de rendimiento importante de la aplicacin. En los eventos de Page, son vinculados automticamente al mtodo de respuesta gracias al atributo AutoEventWiredup que se incluye en la directiva Page de la cabecera del fichero .aspx de la pgina. En el caso de los controles Web esta asociacin se realiza a travs de atributos de la instruccin <asp:TipoControl>. La estructura sigue el formato OnXxx, donde Xxx es el nombre del mtodo de respuesta. Ejemplo:
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Ver tabla multiplicar" /><br />

El botn con Id, Button1, ejecuta como respuesta a su evento Onclick, el mtodo Button1_Click, que se encuentra en el fichero de cdigo asociado a la pgina .aspx.

1.5.3. Funcionamiento de los eventos dentro de la pgina aspx Las peticiones de una pgina aspx que llegan al servidor son gestionadas por una dll que contiene una clase Page con el cdigo de la pgina. Cada vez que en el servidor se recibe una peticin de una pgina aspx, el entorno de ejecucin de ASP.NET crea una instancia de la clase asociada y la mantiene en memoria hasta que se produzca el envo de la respuesta al cliente. Durante su corto periodo de vida, la instancia pasa por una serie de estados en los que se llevan a cabo todas las tareas definidas por el programador para el procesamiento de la peticin, as como para la construccin de la respuesta que va a ser enviada al cliente. Los estados por los que va pasando la instancia asociada a la pgina aspx conforman el llamado ciclo de vida de la pgina. Segn el orden en el que tienen lugar, estos estados son: Comienzo. Este es el primer estado por el que pasa la instancia de Page, al que llega nada ms crearse. Durante este estado se establecen algunas de las propiedades ms importantes del objeto, como Request y

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 26

Response, que proporcionarn acceso a los datos de la peticin y de la respuesta, respectivamente. Tambin en este estado el entorno de ejecucin determina si la peticin es producto o no de una recarga de la pgina, inicializndose el valor de la propiedad IsPostBack del objeto a true en caso de que as sea o a fa/se si no lo es. Recordemos que una recarga es una peticin que se produce debido a un evento que ha tenido lugar en algn control de la interfaz de usuario. Inicializacin. Tras el comienzo, la pgina entra en el estado de inicializacin que, como su nombre indica, es donde se produce la inicializacin de los componentes de la pgina. En este estado, los valores de las propiedades de los controles son restaurados a sus valores iniciales, no estando disponible an el ViewState del objeto o, lo que es lo mismo, los cambios sobre la vista del objeto realizados desde la pgina cliente. Por ejemplo, si se trata de una recarga de una pgina en la que se han solicitado unos datos a travs de controles Web de tipo TextBox, la propiedad Text de estos controles no contendr an en este estado el valor introducido en el control. Por ltimo, indicar que cuando el objeto Page entra en el estado de inicializacin se dispara el evento Init comentado con anterioridad, pudiendo definir el programador alguna accin adicional que deba ser ejecutada para este estado. Carga. Una vez inicializada la instancia, se produce lo que se conoce como la carga de la misma. En el caso de recargas de la pgina, el estado de las propiedades de los controles Web ya ha sido establecido a los valores enviados desde la capa cliente. Al llegar a este estado se produce el evento Load del objeto Page, que como ya vimos, suele ser utilizado por los programadores para realizar algn tipo de accin inicial. Gestin de eventos. En el caso de que estemos ante una recarga de la pgina, es en este estado cuando el objeto Page ejecuta los mtodos de respuesta a los eventos producidos en los controles Web. Como sabemos, cuando se producen los eventos en la interfaz de cliente, estos se guardan en una especie de cola a la espera de que se tenga lugar la recarga de la pgina, hecho que sucede al producirse el evento Click sobre el botn de pulsacin. Esta cola determina el orden en que se ejecutarn los mtodos de respuesta a eventos. Rendering. Tras la ejecucin de los mtodos de respuesta a eventos, la pgina entra en el estado rendering o previo al envo de respuesta, durante el cual se prepara la respuesta HTML que va a ser enviada al cliente. El evento
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 27

PreRender, que se produce al llegar a este estado, permite al programador realizar algn tipo de modificacin en la respuesta antes de que sea enviada. Unload. Una vez que la respuesta ha sido enviada, la pgina entra en el estado previo a su destruccin. En l, los objetos Response y Request ya han sido eliminados. El programador puede definir algn tipo de accin que se deba ejecutar al llegar a este estado a travs del evento Unload. Esquema de funcionamiento de una pgina ASP:
Proceso de ejecucin de una pgina aspx
Peticin 1 - Comienzo, inicializacin y carga de la instancia. - Generacin y envo de la respuesta. - Destruccin de la instancia.

Instancia

Respuesta 1 - Comienzo, inicializacin y carga de la instancia. - Ejecucin del mtodo de respuesta al evento click. - Generacin y envo de la respuesta. - Destruccin de la instancia.

Peticin 2 (PostBack)

Instancia

Respuesta 2

Para finalizar, es conveniente hacer hincapi en dos hechos importantes relativos al funcionamiento de las pginas aspx, que se deducen de todo lo que se acaba de explicar sobre el proceso de ejecucin de las mismas: El primer hecho a destacar es que las pginas aspx no mantienen el estado del cliente. Cada vez que se produce una peticin de la pgina, una instancia de la clase Page es creada para procesar la peticin y es destruida despus de enviar la respuesta al cliente, perdindose toda la informacin asociada a la peticin, as como los valores de los datos miembro existentes en la instancia. Debido a ello, cuando se vuelve a realizar una nueva peticin de la pgina, por ejemplo debido a una recarga, la nueva instancia que se crea no puede tener acceso a los datos manejados en la peticin anterior por la otra instancia. Este hecho suele hacer cometer errores a los programadores de ASP.NET, ya que se tiende a pensar con la lgica de las aplicaciones Windows, donde los datos estn accesibles de un evento a otro, olvidando que en ASP.NET esto implica a instancias de clases diferentes.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 28

La prdida de datos entre peticiones es un problema clsico de las aplicaciones Web, conocido como el problema del mantenimiento del estado (aunque sera ms correcto decir del no mantenimiento). Ms adelante, analizaremos las distintas alternativas que nos proporciona ASP .NET para poder conservar datos entre peticiones, incluso entre distintas pginas de la aplicacin. La otra circunstancia a destacar es que los datos manejados por un cliente no pueden ser utilizados por otro. La mayora de las veces esto es lo deseable, aunque hay casos en los que puede ser interesante compartir datos entre usuarios. El motivo que provoca esta situacin es exactamente el mismo que en el caso anterior: al destruirse la instancia toda la informacin manejada por ella se pierde. En el caso de dos peticiones simultneas a la pgina de clientes diferentes, podra darse el caso de que ambas instancias coexistieran en memoria durante un corto periodo de tiempo, aun as, cada una tiene su propio contexto de ejecucin, haciendo imposible que desde una de ellas se pudiera acceder a los datos de la otra. Como veremos tambin ms adelante en el mantenimiento del estado, ASP.NET dispone de un objeto que posibilita la comparticin de datos entre peticiones de distintos clientes.

1.5.4. Componentes de la interfaz de usuario En la prctica de una pgina Web que tomamos como ejemplo, utilizamos un pagina aspx en la que se inclua un tipo de objetos grficos, conocidos como controles Web, para interaccionar con el usuario. Pero las aplicaciones ASP. NET no solamente permiten utilizar controles Web para construir la interfaz de usuario; tambin es posible emplear controles HTML clsicos. As pues, una pgina aspx admite dos tipos de controles grficos: Controles Web. Controles HTML. 1.5.4.1. Controles Web A estas alturas ya tenemos una idea ms o menos clara de lo que es un control Web. Adems de facilitar la creacin de las pginas Web haciendo uso de la tcnica de arrastrar y soltar, los controles Web son objetos de servidor que proporcionan un amplio abanico de propiedades y mtodos para ser usados por el programador en la implementacin de la aplicacin.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 29

En la clase parcial generada dinmicamente durante la primera peticin de la pgina se incluyen las instrucciones para la instanciacin de controles, de forma que estos puedan ser referenciados desde el cdigo de la clase Page. Esta instancias que son almacenadas en variables, cuyos nombres se obtienen del valor de propiedad id de los controles. Utilizando estas referencias, el programador puede acceder a las propiedades y mtodos de los objetos desde el archivo de cdigo asociado. Las clases de controles Web se encuentran en el espacio de nombre System.Web.UIWebControls. Todas ellas heredan a la clase WebControl, la cual proporciona todas las propiedades bsicas del control, entre las que figuran aquellas relacionadas con el aspecto y estilo. La clase System.Web.UIWebControls.WebControl a su vez hereda System.Web.UI.Control que es la clase base de todos los controles que se pueden emplear en aplicaciones Web .NET. 1.5.4.2. Controles HTML A la hora de disear la interfaz grfica de una aplicacin ASP.NET tambin se pueden incluir controles HTML estndar dentro de un formulario Web, si bien, estos tienen unas capacidades ms limitadas que los controles Web. Aunque los motivos por los que un programador puede querer utilizar este tipo de controles son muy variados, la razn fundamental suele ser la familiaridad de los mismos. Al fin y al cabo, los controles HTML existen desde mucho antes que la plataforma .NET, siendo bastante conocidos para la mayora de los programadores Web. Para incluir un control HTML en una pgina aspx seguiremos el mismo procedimiento de arrastrar y soltar utilizado para los controles Web. Los controles HTML se encuentran en la seccin "HTML" del cuadro de herramientas. En una pgina aspx un control HTML puede funcionar de dos modos: Como control de cliente. Como control de servidor. 1.5.4.3. Control HTML de Cliente Este es el modo de funcionamiento predeterminado del control, comportndose como un control HTML clsico dentro de una pgina Web. En este caso, las propiedades expuestas por el control solamente pueden ser manipuladas desde scripts de cliente.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 30

Si aadimos un control de este tipo a una pgina aspx, podremos comprobar en la vista HTML de la misma como este es traducido directamente por la etiqueta HTML correspondiente (ver en el diseador de Visual Studio) Dado que los controles HTML en este modo de funcionamiento no son objetos de servidor, no solamente no se puede acceder a sus propiedades desde la clase Page sino que tampoco generarn eventos que puedan gestionarse desde la misma. 1.5.4.4. Control HTML de Servidor En este modo de funcionamiento, el control HTML es tratado como un objeto de servidor de la misma forma que lo son los controles Web. Para que un control HTML funcione como un control de servidor, en la vista de diseo de la pgina nos situaremos con el ratn sobre l y pulsaremos el botn derecho de este para acceder al men contextual del control, donde elegiremos la opcin "Run as Server Control". Si despus entramos en la vista de HTML de la pgina, veremos que el control sigue siendo representado por su etiqueta HTML estndar, si bien en ella podemos distinguir el atributo runat=" server", que es lo que hace que el control HTML funcione como un control de servidor. Ejecucin en un servidor. Cdigo HTML de un control Text HTML de servidor: <form id="form 1" runat =server"> <div> <input id="Text" runat="server" type="text" /> </div> </form> Al igual que con los controles Web, utilizando la propiedad Id del control HTML de servidor podremos acceder desde el cdigo de la clase Page a las propiedades del objeto. As mismo, cuando un control HTML es convertido en control de servidor tambin expone una serie de eventos que pueden ser gestionados desde la clase Page de la misma forma que se hace con los controles Web. Clases de controles HTML de servidor: Los controles HTML de servidor son manejados por el programador a travs de instancias de clases, referenciadas por variables cuyos nombres se indican en la propiedad id de los controles. Estas clases se encuentran en el espacio de nombres System.Web.UI.HtmIControls y heredan todas ellas de la

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 31

clase abstracta HtmlControl que proporciona la funcionalidad bsica de todos los controles HTML de servidor. 1.5.4.6. Objetos ASP Los controles Web proporcionan un potente mecanismo para el desarrollo de la interfaz grfica de una aplicacin Web, facilitando la captura y presentacin de datos en la misma. No obstante, las aplicaciones Web tambin necesitan realizar otras operaciones como es el mantenimiento del estado de las aplicaciones, el acceso a la informacin de la peticin HTTP, la gestin de las respuestas HTTP, etc. Para ello, ASP.NET proporciona una serie de clases cuyos mtodos y propiedades permiten realizar todas estas operaciones. Estas clases son instanciadas con cada peticin y almacenadas en propiedades del objeto Page, exponindose al programador como objetos intrnsecos a la aplicacin. Estos objetos son conocidos como objetos ASP. A continuacin, comentaremos las principales caractersticas de estos objetos: Request. Proporciona acceso a la peticin actual. A travs de las propiedades de este objeto pueden recuperarse los datos enviados por el usuario, acceder a los encabezados de la peticin o recuperar las cookies del cliente. Response. El objeto Response est asociado al stream de salida de la pgina, pudindose utilizar para escribir texto en la respuesta que va a ser enviada al cliente o para insertar una cookie en la misma. Session. Permite realizar el control y gestin de las sesiones de los usuarios, proporcionando adems un medio para el almacenamiento de informacin accesible en el mbito de sesin para cada usuario. Application. Permite el almacenamiento de informacin compartida por todos los usuarios de la aplicacin. Server. Este objeto proporciona una serie de mtodos de utilidades que permiten realizar tareas tales como la transferencia del control de la peticin entre pginas, la codificacin/decodificacin de texto HTML o el acceso a direcciones fsicas a partir de direcciones virtual es. Context. Proporciona acceso al contexto de ejecucin de la pgina, incluyendo informacin acerca de la peticin, la respuesta, la sesin y la aplicacin.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 32

1.6. Uso de Matrices o Arrays


Una matriz o array es un conjunto de datos de un mismo tipo, agrupados bajo un nico nombre de variable. Cada uno de estos datos tiene asociado una posicin, pudiendo acceder a cada uno de ellos utilizando el nombre de la variable y un ndice numrico que representa su posicin. Estos objetos son almacenados en memoria por referencia, lo que significa que en un lugar de la memoria estn los datos y, en otro lugar, las referencias o direcciones de memoria donde se encuentran los datos. Ver esquema. Declaracin: Tipo [ ] NombreVariable; Ejemplos: //Define una matriz de tipo string llamada strNombres. string [ ] strNombres; //Define una matriz de tipo int llamada iNumeros. int [ ] iNumeros;

Dimensionamiento del Array: El array tiene que ser dimensionado antes de poder ser usado, el dimensionamiento tiene como finalidad indicar el tamao mximo de datos que podr almacenar. El tamao se especifica con un tipo int denominado ndice de la matriz o el array. La estructura del dimensionamiento es: Tipo variable = new variable Tipo[ndice]; Ejemplos: Dimensiona el array para poder contener 10 datos. Por ejemplo podra guardar 10 nombres de personas. string strNombre; strNombre = new string[10];

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 33

Dimensiona el array para poder contener hasta 5 nmeros. int iNumeros; iNumeros = new int[5]; Podemos declarar y dimensionar el array en la misma lnea: string strNombre = new string[10]; int iNumeros = new int[5];

Acceso al array Para acceder al array se usa el nombre de la variable y entre los corchetes -[ ]-, el ndice que queremos obtener. El ndice empieza a numerarse desde el cero. Por ejemplo, para un array definido como string[10], almacenar datos del 0 al 9. Ejemplos: strNombre[0] = Antonio; //Guarda Antonio en la posicin cero del array. strNombre[4] = Pedro; //Guarda Pedro en la posicin cuatro del array. Almacena en la variable dato, el contenido del array strNombre en su posicin cero: string dato = strNombre[0]; Propiedades ms usuales de los Array: Lenght. Devuelve un valor que indica el tamao del array. LongLenght. Devuelve un valor de tipo Long que indica el nmero de elementos de todas las dimensiones del array. Rang. Obtiene el nmero de dimensiones del array. Mtodos ms usuales de los Array: Contains(string). Pregunta si existe una coincidencia dentro del Array, en la posicin indicada por su ndice. Por ejemplo: bool respuesta = strNombres[0].Contains("Antonio"); En el ejemplo, si en el ndice 0 del array aparece Antonio, devolver true en la variable respuesta.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 34

CopyTo(matrizDestino, IndiceOrigen). Copia un array en otro array. El array destino debe de tener como mnimo el tamao de origen especificado. El valor IndiceOrigen, especifica desde que ndice se va a proceder a copiar. Para copiar todo el array, el valor de IndiceOrigen tiene que ser cero. Por ejemplo: strNombres.CopyTo(strNombres2, 0); En el ejemplo anterior copia la matriz strNombres en strNombres2, empezando desde el ndice 0 de strNombres hasta el ndice final. Clone(). Realiza una copia superficial de un array en otro array. Por ejemplo: nombres2 = (string[ ])strNombres.Clone(); En el ejemplo anterior, clona la matriz strNombres en nombres2. Aunque ambas matrices hayan sido definidas como string, exige la conversin explcita, por eso aparece entre los parntesis antes de la igualacin: string[ ]. Recorrer un array Para recorrer un array podemos utilizar un bucle de tipo For: for (int i = 0; i < strNombres.Length; i++) { Console.WriteLine(strNombres[i]); } Arrays Mltiples Es posible dimensionar un array con ms de una dimensin. Cuando se necesita ms una dimensin se especifican las dimensiones utilizando la coma dentro de los corchetes. Por ejemplo: Define una matriz de tipo string de dos dimensiones llamada strTabla. string [ , ] strTabla; Define una matriz de tipo string de tres dimensiones llamada strCubo string [ , , ] strCubo;

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 35

Dimensionar un array de mltiples dimensiones // Crea una matriz de tres filas por cuatro columnas. strTabla = new string[3,4] // Crea una matriz de tres filas por cuatro columnas y dos tablas. strTabla = new string[3,4,2]

Recorrer un array mltiple con un bucle For: // Bucle para la primera dimensin del array. for (int i = 0; i < 3; i++) { // Bucle para la segunda dimensin del array. for (int i2 = 0; i2 < 4; i2++) { lblValor.Text += (strTabla[ i , i2 ]); } }

El bucle foreach. Es posible recorrer un array con un bucle del tipo foreach. Sintaxis: foreach (tipo variable in Matriz) El tipo de la variable tiene que ser del mismo tipo que la matriz y cada vez que pasa por el bucle guarda en la variable los distintos valores de la matriz. Ejemplo:

foreach (string Dato in strNombres) { lblValor.Text += Dato; }

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 36

1.7. Las Colecciones


NET Framework ofrece clases especializadas para almacenamiento y recuperacin de datos. Estas clases proporcionan compatibilidad para pilas, colas, listas y tablas hash. Las colecciones proporcionan mtodos y propiedades que pueden resultar ms tiles que el uso de los arrays. Se puede utilizar una coleccin para agregar, quitar y modificar elementos aislados o intervalos de elementos de la coleccin. Tambin se pueden copiar una coleccin en otra. Algunas colecciones tienen capacidades de ordenacin y la mayor parte estn indizadas. La administracin de la memoria se controla automticamente y la capacidad de una coleccin se expande si es necesario. La sincronizacin proporciona seguridad para los subprocesos cuando se tiene acceso a los miembros de una coleccin. Las clases de coleccin tienen las siguientes caractersticas: Las clases de coleccin estn definidas como parte del espacio de nombres System.Collections, System.Collections.Generic y System.Collections.Specialized. La mayora de las clases de coleccin derivan de las interfaces ICollection, IComparer, IEnumerable, IList, IDictionary e IDictionaryEnumerator, y los tipos genricos equivalentes. Las clases de coleccin genricas proporcionan una seguridad de tipos superior y, en algunos casos, pueden proporcionar un rendimiento mayor, sobre todo cuando almacenan tipos de valor. Propiedades Comunes a las colecciones: Count. Devuelve el nmero total de elementos en la coleccin. Es equivalente a la propiedad Length. Capacity. Contiene el nmero mximo de elementos que soporta la coleccin. Cuando Count supera a Capacity en una operacin de insercin de nuevos elementos, Capacity aumenta automticamente antes de insertar. Podemos fijar la capacidad mxima usando Capacity (dispone de los descriptores Get y Set), o utilizando el mtodo TrimToSize. IsFixedSize. Esta propiedad devuelve true si la coleccin es de tipo fijo. En caso contrario devuelve false. Una coleccin de tamao fijo no permite agregar o quitar elementos una vez que se ha creado, pero s

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 37

permite modificar los elementos existentes. Una coleccin se puede volver de tipo fijo por la aplicacin del mtodo esttico FixedSize. IsReadOnly. Esta propiedad devuelve true si la coleccin es slo lectura. EN caso contrario devuelve false. Una coleccin de slo lectura no permite que se agreguen, quiten, o modifiquen elementos una vez que se ha creado. Para hacer que una coleccin se vuelva de slo lectura, usaremos el mtodo esttico ReadOnly.

Mtodos comunes a las colecciones: Add. Aade un elemento nuevo a la coleccin. En las colecciones, a diferencia de las matrices, no es necesario especificar el nmero mximo de elementos que contendrn. El mtodo add aade automticamente un nuevo valor a la coleccin. AddRange. Permite aadir un grupo de elementos a la coleccin en una sola operacin. Es necesario especificar una matriz del tipo junto a los valores para ejecutar el mtodo. Clone. Realiza una copia superficial de una coleccin en otra. Clear. Limpia la coleccin de elementos. Contains. Devuelve true si un objeto se encuentra en la coleccin. En caso contrario devuelve false. CopyTo. Copia la coleccin en una matriz. Permite copiar toda la coleccin o slo un rango de la coleccin. Es necesario haber dado tamao a la matriz antes de ejecutar el mtodo CopyTo. GetRange. Mtodo que proporciona un rango de elementos de una coleccin en otra. Hay que tener en cuenta que el resultado de GetRange no es una coleccin propia, sino una vista de los datos originales. Esto produce que cualquier cambio que se haga en el subconjunto de datos se har automticamente en los datos originales, pero si modificamos los datos originales, el subconjunto se inutiliza y da un error del tipo: InvalidOperationException. GetType. Devuelve el tipo de la coleccin a la que pertenece la instancia. IndexOf. Busca un objeto y devuelve el ndice de la coleccin donde se encuentra el objeto. Si devuelve -1 el objeto no ha sido encontrado. Insert. Inserta un objeto nuevo en la coleccin por mediacin de un ndice. Ese ndice le indica cual ser la posicin de ese objeto en la coleccin. InsertRange. Idntico que el mtodo insert, pero en lugar de insertar un objeto se inserta un grupo de objetos a partir de una matriz. LastIndexOf. Busca un objeto en la coleccin y devuelve la ltima aparicin de ese objeto en la coleccin. Si no encuentra el objeto devuelve -1.
Pgina 38

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Remove. Quita un objeto de la coleccin. Slo quita la primera aparicin del objeto en la coleccin. RemoveAt. Quita un objeto de la coleccin usando su ndice dentro de la coleccin. RemoveRange. Quita un rango de objetos seleccionando un ndice y, a partir de ese ndice, el nmero de elementos que se quieren quitar. Reverse. Invierte los valores de una coleccin. Es decir, el primero es el ltimo y el ltimo es el primero. Y as sucesivamente. Sort. Ordena la coleccin. Permite ordenar la coleccin de forma estndar; aplicar un mtodo de ordenacin mediante la implementacin de la interfaz IComparer; u ordenar un intervalo de la coleccin usando tambin una implementacin de esa interfaz. ToArray. Permite pasar una coleccin a una matriz. Al contrario que en el caso del CopyTo, no es necesario dar un tamao previo a la matriz. En el momento de ejecutar el mtodo ToArray, el sistema asigna el tamao y despus copia los elementos. TrimToSize. Establece la capacidad de la coleccin en el nmero real de elementos que contenga en ese momento.

Mtodos estticos comunes a las colecciones: FixedSize. Mtodo esttico que permite fijar la coleccin en un tamao fijo. A partir de la ejecucin del comando, la coleccin se queda con el tamao que tuviera en ese momento. Ejemplo: ArrayList objSubConjunto = ArrayList.FixedSize(objOriginal); ReadOnly. Mtodo esttico que convierte la coleccin en slo lectura. Al igual que para FixedSize, genera una coleccin subyacente que permitira realizar cambios sobre el subconjunto, pero no sobre la coleccin original. Ejemplo ArrayList objSubConjunto = ArrayList.ReadOnly(objOriginal);

1.7.1. Colecciones Predefinidas (System.Collections) Bajo este espacio de nombres se agrupan diferentes colecciones de objetos, como son: listas, colas, matrices de bits, tablas hash y diccionarios. Las colecciones predefinidas no necesitan especificar el tipo que contendrn, de hecho, cada fila de la coleccin puede ser de un tipo diferente.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 39

1.7.1.1. ArrayList. Esta coleccin no est ordenada. Se puede disminuir la capacidad llamando al mtodo TrimToSize o estableciendo explcitamente la propiedad Capacity. Se puede obtener acceso a los elementos de esta coleccin utilizando un ndice entero. Los ndices de esta coleccin estn basados en cero. El objeto ArrayList acepta null como valor vlido y permite elementos duplicados. 1.7.1.2. Hashtable. Es una coleccin de elementos de tipo clave-valor que se organizan en funcin del cdigo hash de la clave. Cada elemento es un par de clave y valor almacenado en un objeto DictionaryEntry. Una clave no puede ser null, pero un valor s puede serlo. Los objetos de claves deben permanecer inmutables mientras se utilicen como claves en Hashtable. Cuando se agrega un elemento a Hashtable, el elemento se coloca en un sector de almacenamiento en funcin del cdigo hash de la clave. Las bsquedas posteriores de la clave utilizarn su cdigo hash para buscar solamente en un sector de almacenamiento determinado; de este modo, se reducir considerablemente el nmero de comparaciones de clave necesarias para encontrar un elemento.
ESQUEMA FUNCIONAMIENTO HASHTABLE CLAVES INDICES 0
5263839X

Pares CLAVES / VALOR (Datos)

1 2

5263839X

Antonio Lpez

47363262Y

3 4

47363262Y

Jess Snchez

2364354N

5 6

2364354N

Mara Hernndez

El factor de carga de Hashtable determina la relacin mxima de elementos por sectores de almacenamiento. Factores de carga ms
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 40

pequeos causan tiempos de bsqueda ms largos a costa de un mayor consumo de memoria. El factor de carga predeterminado de 1,0 suele proporcionar el mejor equilibrio entre velocidad y tamao. Tambin se puede especificar un factor de carga diferente cuando se cree Hashtable. Conforme se agregan elementos a Hashtable, va aumentando el factor de carga real de Hashtable. Cuando el factor de carga real alcanza el factor de carga especificado, el nmero de depsitos de Hashtable aumenta automticamente hasta el nmero primo ms pequeo que sea superior al doble del nmero actual de depsitos de Hashtable. Cada objeto de clave de Hashtable debe proporcionar su propia funcin hash, a la que se tiene acceso llamando al mtodo GetHash. Sin embargo, se puede pasar cualquier objeto que implemente IHashCodeProvider a un constructor Hashtable y utilizar esa funcin hash para todos los objetos de la tabla. La capacidad de Hashtable es el nmero de elementos que Hashtable puede contener. Conforme se agregan elementos a Hashtable, la capacidad aumenta automticamente segn lo requiera la reasignacin. En comparacin a otras colecciones, el Hashtable es ms til cuantos ms datos hay que manejar. Dado que los datos son guardados en posiciones pseudo-aleatorias, el acceso a los datos de forma ordenada hace que sea muy lento (por ejemplo para recorrerlo entero). Propiedades propias del tipo HashTable: Key. Contiene la clave de la coleccin que almacena el valor. Value. Contiene el valor almacenado por mediacin de la clave.

Mtodos propios del tipo HashTable: ContainsKey. Permite buscar por la clave en una coleccin del tipo HashTable. Devuelve true si lo encuentra y false en caso contrario. ContainsValue. Permite buscar un valor en la coleccin. Si lo encuentra devuelve true, en caso contrario devuelve false.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 41

Recorrer un HashTable obteniendo todos sus valores:


foreach (DictionaryEntry Variable in objHashTable) { Console.WriteLine("La clave del elemento es: " + Variable.Key); Console.WriteLine("El valor para esa clave es: " + Variable.Value); }

El siguiente ejemplo muestra como buscar y obtener un valor concreto en un HashTable. Tanto la clave como el valor fueron declarados del tipo string:
if (objHashtable.ContainsKey("47326576X")) { //Devuelve el dato que est almacenado en la clave: //"47326576X". Nombre = objHashtable["47326576X"].ToString(); Console.WriteLine(Nombre); } else Console.WriteLine("No existen los datos en la tabla");

Ejemplo: Uso HashTable 1.7.1.3. SortedList. Es un Hashtable ordenado. En este caso es posible acceder al elemento por la clave o por el ndice. La secuencia de ndices se basa en la secuencia de ordenacin. Cuando se agrega un elemento, se inserta en SortedList en el orden correcto y la indizacin se ajusta en consonancia. Cuando se quita un elemento, la indizacin tambin se ajusta en consonancia. Por lo tanto, el ndice de un par de clave y valor especfico puede cambiar a medida que se agreguen o quiten elementos del objeto SortedList. Las operaciones de un objeto SortedList suelen ser ms lentas que las operaciones de un objeto Hashtable debido a la ordenacin. Mtodos propios del SortedList: GetByIndex. Permite obtener un valor de la coleccin por su ndice, en lugar de por su clave. GetKey. Permite obtener una clave por su ndice dentro de la coleccin. GetValueList. Devuelve la lista de valores de la coleccin. IndexOfKey. Devuelve el ndice dentro de la coleccin de una clave. IndexOfValue. Devuelve el ndice dentro de la coleccin de un valor.
Pgina 42

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

1.7.1.4. Queue. Es una lista del tipo FIFO. Primero en entrar, primero en salir. Las colas son tiles para almacenar mensajes en el orden en el que fueron recibidos para el procesamiento secuencial. Esta clase implementa una cola como una matriz circular. Los objetos almacenados en Queue se insertan en un extremo y se quitan del otro. Permite valores null y duplicados. Tiene un funcionamiento distinto al resto de colecciones y no es aplicable la mayora de los mtodos que se aplican al resto de colecciones. Por ejemplo, no existe el mtodo add ni el mtodo remove, en su lugar y debido a su particular funcionamiento, existen otras formas de agregar y quitar elementos. Mtodos propios de la clase Queue: Dequeue. Quita y devuelve el objeto que estaba situado al principio de la cola de la coleccin. Enqueue. Agrega un objeto nuevo al final de la cola de la coleccin. Peek. Devuelve el objeto situado al principio de la cola de la coleccin, pero a diferencia del mtodo Dequeue, no lo quita.

1.7.1.5. Stack. Es una lista del tipo LIFO. ltimo en entrar, primero en salir. Stack se implementa como un bfer circular. Permite valores null y duplicados. Al igual que Queue, no admite la mayora de los mtodos comunes a las colecciones y dispone de los suyos propios. Mtodos propios de la clase Stack: Pop. Quita y devuelve el objeto situado al principio de la cola de la coleccin stack. Push. Inserta un objeto al principio de la cola de la coleccin stack. Peek, Devuelve el objeto situado al principio de la cola de la coleccin, pero no quita el objeto.

1.7.2. Colecciones Genricas. (System.Collections.Generic) En las colecciones predefinidas es necesario hacer conversiones explcitas. Cuando llamo a la coleccin para mostrarla en pantalla, necesito crear una variable de ese tipo y convertir explcitamente los datos del Array a la variable. En una clase Predefinida cada elemento de la coleccin puede ser de un tipo distinto, por eso, es necesario realizar las conversiones. En el caso de las colecciones Genricas, se especifica el tipo que contienen cuando se crean, evitando de esta manera las conversiones. Ejemplo de uso de Predefinidas:
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 43

ClaseClientes DatoObtenido = (ClaseClientes)Clientes[1]; //1 es el ndice del array. Para evitar las conversiones explcitas y transformarlas todas a implcitas, disponemos de las colecciones genricas. Ejemplo de cmo se hara en una Genrica: ClaseClientes DatoObtenido = Clientes[1];//1 es el ndice del array. Para cada coleccin predefinida, tenemos su equivalente en genrica, ms algunas otras especficas de este tipo de colecciones: 1.7.2.1. List. Representa una matriz unidimensional dinmica. Es el equivalente al ArrayList 1.7.2.2. LinkedList. Representa una lista doblemente enlazada donde cada nodo sabe que nodo es el anterior y el siguiente al suyo (orden de entrada). Ejemplo: Uso LinkedList. Propiedades propias de la coleccin LinkedList: Firts. Obtiene el primer nodo de la coleccin. Last. Obtiene el ltimo nodo de la coleccin.

Mtodos propios al LinkedList: AddAfter. Agrega un nuevo nodo o valor detrs de un nodo existente en la coleccin. AddBefore. Agrega un nuevo nodo o valor antes de un nodo existente en la coleccin. AddFirst. Agrega un nuevo nodo o valor al principio de la coleccin. AddLast. Agrega un nuevo nodo o valor al final de la coleccin. Find. Encuentra el primer nodo que contiene el valor especificado. FindLast. Encuentra el ltimo nodo que contiene el valor especificado. RemoveFirst. Quita el nodo del principio de la coleccin. RemoveLast. Quita el nodo del final de la coleccin. 1.7.2.3. Dictionary. Representa una coleccin de pares clave-valor. Es el equivalente al HashTable. 1.7.2.4. Queue. Representa una cola. Primero en entrar, primero en salir.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 44

1.7.2.5. Stack. Representa una cola. ltimo en entrar, primero en salir. 1.7.2.6. SortedList. Representa una coleccin de pares clave-valor ordenados por la clave. 1.7.2.7. HashSet. Es una coleccin implementada en Net Framework 3.5, que permite un conjunto de objetos nicos no ordenados, que adems, permite comparar con objetos nicos no ordenados para realizar alguna de las siguientes funciones: Unin de elementos contenidos por ambos objetos, interseccin de los elementos contenidos en ambos objetos y diferencia de los elementos contenidos por ambos objetos. Mtodos propios del HashSet UnionWith. Realiza una operacin de unin entre el HashSet<T> actual y un segundo HashSet<T>. Se modifica el HashSet<T> actual para contener el resultado de la operacin. InterseccionWith. . Realiza una operacin de interseccin entre el HashSet<T> actual y un segundo HashSet<T>. Se modifica el HashSet<T> actual para contener el resultado de la operacin. ExceptWith. Elimina todos los elementos del HashSet<T> que ha sido pasado como parmetro. El objeto HashSet<T> es modificado para contener el resultado de la operacin. SymmetricExceptWith. Ejecuta una operacin de diferencia entre el HashSet<T> actual y un segundo objeto HashSet<T>. Se modifica el HasSet<T> actual para contener la diferencia entre ambos objetos. El HashSet<T> resultante contiene slo los elementos que estn presentes en cada HashSet<T>, pero no los elementos que estn en los dos a la vez. IsSubsetOf. Indica con un valor booleano si un HashSet<T> es un subconjunto de un segundo objeto HashSet<T> Ejemplo: Uso HashSet Siguiendo con el ejemplo descrito en predefinidas, el ArrayList se podra sustituir por un List de la siguiente forma: List<ClaseCuenta> Clientes = new List<ClaseCuenta>(); Cuando se obtengan los datos de la coleccin, no ser necesaria una conversin explcita. Ejemplo: ClaseCuenta DatosCliente; DatosCliente = Clientes[1]; //1 es el ndice del array.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 45

Para las aplicaciones destinadas a la versin 2.0 y posteriores de .NET Framework es recomendable utilizar las clases de coleccin genricas del espacio de nombres System.Collections.Generic, que proporcionan una seguridad de tipos y una eficiencia mayores que las de sus homlogas no genricas. Ejemplo: Uso Colecciones.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 46

1.8. Control de Excepciones.


1.8.1. La Instruccin: try-catch-finally Sintaxis: try { // Instrucciones a controlar } catch(tipo excepcin variable) { // Instrucciones que se ejecutan como respuesta a un error. } finally { // Instrucciones que se ejecutan siempre, con o sin error. } Se utiliza para controlar errores de ejecucin. Todas las instrucciones que aparecen en el bloque de la instruccin try, son controladas por la instruccin y, en caso de que se obtenga algn error, es enviado al bloque catch para que sea tratado. Se pueden poner ms de un catch, para controlar distintos errores mediante tipo excepcin y variable. El bloque finally se ejecuta siempre que aparece, da igual que de error. Ejemplo: (Uso TryCatchFinally)
int x = 200; int y = 0; try { lblVer.Text = "La divisin es: " + (x / y).ToString(); } catch (Exception error) { lblVer.Text = "Error: + error.Message; } finally { lblVer.Text = "Termina el Try-Catch; }

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 47

1.9. Gestin de Ficheros y Directorios. La clase System.IO


El espacio de nombres System.IO, incluye todas las clases necesarias en .NET para realizar tareas de lectura y escritura sobre ficheros, tambin llamado flujo de caracteres, as como el manejo de directorios. Las siguientes clases se encuentran dentro del espacio de nombres System.IO: 1.9.1. La clase StreamWriter. Esta clase hereda de TextWriter, que es la clase base abstracta tanto de StreamWriter como de StringWriter, pudiendo escribir tanto caracteres en secuencias (StreamWriter), como en cadenas(StringWriter). Dispone de dos constructores: StreamWriter(string nombre); StreamWriter(Stream flujo); El primer constructor abre un fichero, cuyo nombre se especifica en la variable nombre, mientras que el segundo hace lo mismo pero desde un tipo Stream (el tipo stream se ver ms adelante) Ejemplo: Uso ClaseStreamWriter. Mtodos usuales de StreamWriter: Write(string). Escribe un string en el fichero, dejando el puntero al final del texto escrito. WriteLine(string). Escribe un string en el fichero, dejando el puntero al principio de la siguiente lnea (equivale a insertar un return dentro de un texto). 1.9.2. La clase StreamReader.

Esta clase hereda de TextReader, que es la clase base abstracta tanto de StreamReader como de StringReader, pudiendo escribir tanto caracteres en secuencias (StreamReader), como en cadenas(StringReader). Dispone de dos constructores: StreamReader(string nombre) StreamReader(Stream flujo)

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 48

El primer constructor abre un fichero, cuyo nombre se especifica en la variable nombre, mientras que el segundo hace lo mismo pero desde un tipo Stream. Ejemplo: Uso ClaseStreamReader Mtodos usuales de StreamReader. Read. Permite leer un carcter o conjunto caracteres. ReadLine. Lee una lnea entera. El final de la lnea se define por los smbolos \n, \r o bien los dos juntos. Estos caracteres de terminacin no son devueltos por ReadLine. Peek. Permite obtener el siguiente carcter a leer pero sin extraerlo del buffer asociado al flujo. DiscardBufferredData. Elimina los caracteres que actualmente estn en el buffer asociado al flujo.

1.9.3.

La clase abstracta Stream.

Existe una clase base de tipo abstracto denominada Stream, que tiene compatibilidad de lectura y escritura asncrona. A la hora de manejar ficheros, disponemos de dos conceptos: la E/S de archivos y; la lectura y escritura de secuencias. El objetivo de la clase Stream es abstraer al programador de la tarea de manejar el sistema operativo y los dispositivos de almacenamiento. Propiedades comunes en la clase Stream y sus derivadas: CanRead. Esta propiedad es usada por las clases derivadas, para indicar si la secuencia admite operaciones de lectura. CanWrite. Esta propiedad permite saber si la secuencia admite operaciones de escritura. CanSeek. Permite saber si la secuencia admite operaciones de bsqueda. Algunas secuencias son slo hacia delante y por tanto no permiten buscar en posiciones especficas. Lenght. Indica el tamao en bytes de la secuencia. Position. Indica la posicin actual del puntero dentro de la secuencia. Mtodos comunes en la clase Stream y sus derivadas: BeginRead. Comienza una lectura asncrona (subprocesamiento) BeginWriter. Comienza una operacin de escritura asncrona.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 49

Close. Cierra la secuencia actual y libera todos los recursos no administrados asociados a sta, como son identificadores de ficheros a nivel de sistema operativo, sockets de red, etc. EndRead. Completa una operacin de lectura asncrona. EndWrite. Completa una operacin de escritura asncrona. Flush. Borra todos los buffers de la secuencia y guarda cualquier dato independiente en el almacn de apoyo subyacente. Read. Lee una secuencia de bytes desde la secuencia actual. ReadByte. Lee un byte de la secuencia. Seek. Desplaza el puntero en la secuencia a la posicin indicada, con respecto al principio, final del fichero, o posicin actual. SetLength. Si la secuencia lo permite, la expande o la contrae. Write. Escribe una secuencia de bytes en la secuencia actual. WriteByte. Escribe un byte en la secuencia. 1.9.4. La clase MemoryStream.

Aunque las siguientes clases que veremos a partir de MemoryStream trabajan sobre discos, o dispositivos de almacenamiento, esta clase utiliza como almacn la memoria en lugar de un disco o una conexin de red. MemoryStream encapsula los datos almacenados como una matriz de bytes sin signo que se inicializa al crear un objeto MemoryStream; tambin se puede crear una matriz vaca. Es posible obtener acceso directamente a los datos encapsulados en la memoria. Las secuencias de memoria pueden reducir la necesidad de archivos y bferes temporales en una aplicacin. Las secuencias de memoria creadas con una matriz de bytes sin signo proporcionan una vista de secuencia de los datos que no es de tamao variable y slo es posible escribir en ellas. Al utilizar una matriz de bytes, no es posible anexar la secuencia ni reducirla, aunque tal vez sea posible modificar el contenido existente dependiendo de los parmetros pasados al constructor. Las secuencias de memoria vacas son de tamao variable y se puede escribir y leer en ellas. Ejemplo: Uso MemoryStream.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 50

1.9.5.

La clase FileStream.

De forma predeterminada abre los ficheros de forma sncrona, pero tambin pueden ser abiertos de forma asncrona. Incluye adems el mtodo Seek, que permite el acceso aleatorio al fichero. Una de las aplicaciones ms interesantes de FileStream pueda radicar en la posibilidad de leer ficheros en formato byte, en lugar de hacerlo slo en texto plano. Ejemplo: FileStream objFile = new FileStream("fich.txt", FileMode.Create); string texto = "Este texto es una prueba de escritura.";
objFile.Write(Encoding.UTF8.GetBytes(texto),0 textograbar.Length);,

objFile.Close(); En este ejemplo que acabamos de ver, por mediacin de la clase Encoding (ver ms adelante), le especificamos que los bytes sern escritos en formato UTF8 (nos permite manejar acentos y ). En FileStream podemos usar el miembro de tipo enumeracin FileMode, para indicarle al sistema operativo como queremos que se abra el archivo. FileMode. Dispone de seis miembros para su uso: CreateNew. Le indica al sistema operativo que debe de crear un fichero nuevo. Si el fichero existe, se provoca una excepcin del tipo IOException. Create. Le indica al sistema operativo que debe de crear el fichero. Si existe, se sobrescribe. Open. Le indica al sistema operativo que debe de abrir el fichero. La capacidad de abrir el fichero depende del valor especificado por el enumerador FileAccess. OpenOrCreate. Le indica al sistema operativo que si existe el fichero lo abra y, en caso contrario, lo cree. Truncate. Le indica al sistema operativo que si existe el fichero lo abra. Una vez abierto, trunca su contenido, dejando el tamao del archivo en cero bytes. Append. Le indica al sistema operativo que si existe el fichero, lo abra, realizando a continuacin una bsqueda de informacin hasta el final del mismo. Si no existe lo crea. FileAccess. Dispone de tres miembros: Read. Da acceso de slo lectura al fichero. Write. Da acceso de slo escritura al fichero. ReadWrite. Combina el acceso de lectura y de escritura.
Pgina 51

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Ejemplo: FileStream objFile = null; objFile= new FileStream("Dat.txt", FileMode.Create, FileAccess.Write);

La Clase Encoding.
Es una clase que pertenece al espacio de nombres System.Text. Encoding se ha diseado para operar sobre codificacin de caracteres Unicode. Codificar es el proceso de transformar un conjunto de caracteres Unicode en una secuencia de bytes. Y decodificar es el proceso de transformar una secuencia de bytes codificados en un conjunto de caracteres Unicode. NET Framework proporciona las implementaciones siguientes de la clase Encoding para que exista compatibilidad con las codificaciones Unicode actuales y de otro tipo: ASCIIEncoding codifica caracteres Unicode como caracteres ASCII sencillos de 7 bits. Esta codificacin slo admite valores de caracteres entre U+0000 y U+007F. Pgina de cdigos 20127. Tambin disponible mediante la propiedad ASCII. La clase UTF7Encoding codifica los caracteres Unicode mediante la codificacin UTF-7. Esta codificacin acepta todos los valores de caracteres Unicode. Pgina de cdigos 65000. Tambin disponible mediante la propiedad UTF7. La clase UTF8Encoding codifica los caracteres Unicode mediante la codificacin UTF-8. Esta codificacin acepta todos los valores de caracteres Unicode. Pgina de cdigos 65001. Tambin disponible mediante la propiedad UTF8. La clase UnicodeEncoding codifica los caracteres Unicode mediante la codificacin UTF-16. Se admiten tanto el orden de bytes little-endian (pgina de cdigos 1200) como el big-endian (pgina de cdigos 1201). Tambin disponible mediante las propiedades Unicode y BigEndianUnicode. La clase UTF32Encoding codifica los caracteres Unicode mediante la codificacin UTF-32. Se admiten tanto el orden de bytes little-endian (pgina de cdigos 12000) como el big-endian (pgina de cdigos 12001). Tambin disponible mediante la propiedad UTF32. La clase Encoding est pensada principalmente para convertir entre diferentes codificaciones y Unicode. A menudo, la opcin correcta para una aplicacin es una de las clases de Unicode derivadas. Ejemplos de uso: string Texto = Texto de Prueba; Encoding objUTF8 = Encoding.UTF8;
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 52

// Convierte el contenido del string Texto, en una matriz // de bytes codificada en UTF8. byte [ ] MatrizBytes = objUTF8.GetBytes(Texto); Encoding objUnicode = Encoding.Unicode; // Convierte una matriz codificada en UTF8, en una matriz // codificada en Unicode. byte [ ] MatrizUnicode = Encoding.Convert(objUnicode, objUTF8, MatrizBytes);

El uso de secuencias de bytes que hemos comentado anteriormente con la clase FileStream, tiene su razn de ser en la necesidad que puede existir de acceder a ficheros donde la informacin no es simplemente texto, como por ejemplo un fichero grfico, o archivos binarios que contengan estructuras de datos fijas. Para trabajar con texto sencillo evidentemente se puede simplificar todo lo anterior, usando para ello, las clase StreamWriter y StreamReader que vimos anteriormente, pero variando su forma de uso de la siguiente forma: Si queremos abrir un fichero de texto con codificacin en UTF-8 (nos permite acentos y la letra ), podemos realizar la siguiente instruccin: StreamReader obj = File.OpenText(NombreFichero); //Agrega a un objeto RichTextBox el contenido del fichero. TextBox1.Text = obj.ReadToEnd(); Si queremos guardar un fichero de texto con codificacin en UTF-8, podemos realizar la siguiente instruccin. StreamWriter obj = File.CreateText(SalvarFichero.FileName); //Escribe el contenido de un richTextBox en el fichero obj.Write(TextBox1.Text); Otras opciones para StreamReader y StreamWriter son: File.ReadAllBytes Lee un fichero completo del tipo binario, lo almacena en una matriz de Bytes y despus lo cierra. File.ReadLines Lee un fichero completo del tipo texto, con la codificacin especificada y despus lo cierra. File.AppendText Aade texto a un fichero. Si no existe lo crea.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 53

1.9.6.

Lectura Asncrona de Ficheros.

Como mencionamos anteriormente, cuando se realiza una operacin de sobre ficheros tanto de lectura como de escritura, esta se hace de forma sncrona. Si queremos usar la lectura o escritura en ficheros de forma asncrona disponemos del subprocesamiento mltiple (se ver ms adelante en el curso), pero tambin de unos mtodos de la clase Stream que permiten realizar esos accesos de forma asncrona. En una lectura asncrona, si la lectura o escritura del fichero tarda dos minutos, el usuario estar esperando ese tiempo hasta que el programa vuelva a ponerse en marcha con las siguientes instrucciones. En la lectura asncrona se puede seguir trabajando mientras se realizan las funciones de lectura o escritura. En el ejemplo Uso Asincrono, se puede ver un ejemplo de lectura asncrona. Para poder probarlo es necesario generar un fichero de texto lo suficientemente grande como para que el sistema tarde en cargarlo. Este ejemplo tiene como finalidad mostrar un uso de la lectura asncrona. Los conceptos de subprocesamiento y delegados que son necesarios para avanzar en este tipo de procesos, se explican a lo largo del curso.

1.9.7.

El almacenamiento Aislado.

Toda aplicacin en Net Framework se ejecuta bajo un concepto denominado la caja de arena (sandboxing). El CLR, crea filtros de seguridad que son aplicados a todos los objetos que se ejecutan, impidiendo en muchas ocasiones accesos a disco que son necesarios para nuestra aplicacin, pero que el nivel de seguridad que tiene el usuario lo impiden. Esta seguridad, que puede parecer excesiva, es muy necesaria sobre todo cuando descargamos aplicaciones por Internet. Muchas veces nuestro objetivo es guardar preferencias de usuario que no se pueden guardar en bases de datos, debido a que el diseo ya est hecho y es muy complicado cambiarlo; o que simplemente, no queremos consumir recursos de una conexin a base de datos para obtener un perfil del usuario. Lo normal sera grabarlo en disco, pero puede ocurrir, que por el nivel de proteccin del usuario este no pueda grabar datos en su disco duro. Esta clase viene a resolver el problema que existe cuando es el usuario final el que tiene la responsabilidad de grabar los datos. Ver ejemplo: Uso AlmacenamientoAislado
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 54

1.9.8.

Las Clases: File, Directory y Path

Estas clases son las responsables del manejo de directorios y ficheros en los dispositivos de almacenamiento. Todos los mtodos que conforman estas clases son del tipo static, lo que evita tener que hacer una instancia del objeto. De todas formas, tambin existen las clases equivalentes para instanciacin. La forma de acceder a preguntar por un fichero o un directorio es mediante un tipo string, que puede ser escrito tanto como un literal o como una variable de tipo string. Ejemplos de uso: Para conocer si existe un fichero en una ruta concreta, se usa el mtodo Exists de la clase File (devuelve true si lo encuentra): File.Exists("c:\\dato.txt"); Para crear un directorio o, una ruta, usaremos el mtodo CreateDirectory de la clase Directory. Directory.CreateDirectory("c:\\datos\\martes"); Para colocar el atributo de oculto a un fichero: File.SetAttributes(path, FileAttributes.Hidden); Para colocar ms de un atributo a un fichero: File.SetAttributes(path, File.GetAttributes(path) FileAttributes.ReadOnly | FileAttributes.System); Ejemplo: Uso Clases File-Directory y Path 1.9.8.1. La Clase File. Mtodos usuales a la clase File: Copy. Copia un fichero existente en un nuevo. Delete. Borra un fichero. Exists. Devuelve true si existe el fichero. GetAttributes. Obtiene los atributos del fichero. Move. Mueve un fichero a una nueva localizacin. SetAttributes. Establece los atributos de un fichero.
Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web. Pgina 55

1.9.8.2. La Clase Directory. Mtodos usuales a la clase Directory CreateDirectory. Crea todos los directorios y subdirectorios especificados. Delete. Borra un directorio y su contenido. Exists. Devuelve true si existe el directorio. GetFiles. Obtiene los ficheros de un directorio. GetParent. Conduce al directorio padre. Move. Mueve un directorio y su contenido a una nueva ubicacin. 1.9.8.3. Clase Path. Mtodos usuales a la clase Path ChangeExtension. Cambia la extensin de un fichero. Combine. Combina dos rutas. GetDirectoryName. Retorna la ruta de un fichero. GetExtension. Retorna la extensin de la ruta especificada. GetFileName. Retorna el nombre y la extensin de la ruta especificada. GetFileNameWithoutExtension. Retorna el nombre sin la extensin. GetPathRoot. Retorna la raz de la ruta especificada. HasExtension. Determina si una ruta tiene extensin. IsPathRoot. Determina si la ruta incluye la raz.

Capitulo 1. Introduccin a la Mquina Virtual y a las Aplicaciones Web.

Pgina 56

You might also like