Capítulo segundo Fundamentos teóricos Se plantea como objetivo de esta sección exponer las distintas tecnologías que se pueden contemplar a la hora de desarrollar la aplicación. Se explica en qué consiste cada una. Se prestará principal atención a las tecnologías de desarrollo Web. I.2.1 Lenguajes de programación Una de las alternativas que se contemplan es la programación de una aplicación con alguno de los lenguajes de programación existentes. Uno de los lenguajes contemplados por las facilidades que aporta para el manejo de bases de datos es el conocido lenguaje Java. Los detalles referentes a la programación y a la tecnología se pueden consultar en la página Web donde se tienen gran cantidad de recursos, manuales, tutoriales, explicación de la tecnología, etc. [40]. I.2.2 Tecnologías de desarrollo Web A la hora de desarrollar una aplicación Web se puede elegir entre varios lenguajes de programación. Si además se quiere usar bases de datos en nuestra aplicación también se dispone de otras varias posibilidades, que en algunas ocasiones están determinadas o influenciadas por el lenguaje seleccionado. Se explican las características de las principales alternativas, que son las siguientes: • • • • ASP: Active Server Pages (páginas de servidor activas) [1] JSP: Java Server Pages (páginas de servidor Java [2] PHP: Personal Home Page Hypertext Pre-processor (preprocesador de hipertexto de páginas personales) [14], [15] CGI + PERL: Common Gateway Interface (Interfaz de pasarela común) + Practical Extraction and Reporting Language (lenguaje práctico para la extracción e informe) [41], [42] Todos estos lenguajes tienen como objetivo la generación de código HTML (HyperText Markup Language, lenguaje de marcas hipertextuales) [30], de manera que una misma página de código pueda generar distintas páginas HTML en función de parámetros de entrada. Esto posibilita la interacción del usuario con la página Web. En lo que sigue se explicarán los tres primeros lenguajes ya que se consideran actualmente los más usados. Se expondrá su filosofía de uso y se describirán Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 17 I Memoria resumidamente los aspectos más importantes. Se terminará la explicación con algunos comentarios sobre su instalación. I.2.3 Active Server Pages Active Server Pages (ASP) es una tecnología del lado servidor de Microsoft para páginas web generadas dinámicamente. Un documento ASP puede contener tanto sintaxis HTML como código script, que interpretará el servidor para devolver un documento HTML generado a partir de otros documentos HTML y resultados de la interpretación de tal código script. ASP permite conservar la información específica de un usuario a lo largo de varias solicitudes HTTP (HyperText Transfer Protocol, protocolo de transferencia de hipertexto) gracias al uso de variables a lo largo de varios documentos Web (User Session). Cuando se transfiere una página ASP al navegador de un usuario ocurren los siguientes acontecimientos: • • • • una vez que se introduce una dirección Web (URL) en el navegador, se envía al servidor Web una petición. el servidor Web, generalmente IIS (Internet Information Server, servidor de información de internet) recibe la solicitud y comprueba la disponibilidad de la página pedida. Si se trata de una página HTML, se envía directamente al navegador y éste la muestra al usuario. Si se trata de una página ASP, el servidor busca todas las instrucciones ASP que contiene la página, las ejecuta y devuelve los resultados con el resto de la página al navegador Web del usuario. Se puede observar que al navegador Web del usuario sólo llegan páginas HTML. Sólo es en el servidor donde existe diferencia entre páginas con código ASP o sin él. Casi todas las aplicaciones están escritas en VBScript debido a que es el estándar de las páginas ASP. ASP se basa en objetos, que se explicarán en el siguiente apartado. Algunas de las posibilidades que nos dan los objetos son entre otras: • • • análisis de las entradas del usuario en formularios. leer y escribir cookies. acceso a variables de entorno del servidor. Además tenemos otro tipo de objetos. Los componentes son objetos, por tanto tienen propiedades y métodos. Para trabajar con un componente lo primero es instanciarlo. Luego se puede configurar accediendo a sus propiedades y actualizando sus valores. Llamando a sus métodos se ponen en marcha sus funcionalidades. 18 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos La razón de la existencia de estos componentes se debe a las limitaciones de la funcionalidad del lenguaje con que se programa ASP, que no van más allá de las básicas de cualquier lenguaje: trabajo con variables, tipos, estructuras de control y un juego de funciones (que en VBScript es bastante limitado). Por tanto, si se piensa hacer una aplicación algo compleja, con seguridad se tendrá que realizar basándose en algún componente. Incluso conexiones y accesos a bases de datos se hacen a través de un componente del servidor. La mayoría de los componentes son comerciales y habrá que adquirirlos. Es uno de los problemas de ASP, que no hay utilidades gratuitas. Algunos de estos componentes comerciales se exponen en un apartado posterior de este mismo capítulo. Además existen objetos especiales llamados componentes ActiveX. ActiveX es una tecnología que nos permite ejecutar aplicaciones en el ordenador del usuario a través de internet. Posibilita que los distintos componentes trabajen entre sí en entornos de red. También opera en el mismo servidor. Algunos objetos ActiveX se pueden invocar con ASP permitiendo operaciones como: • • • acceso al sistema de archivos del servidor Web envío y recepción de e-mails accesos a bases de datos Hay que distinguir los componentes ActiveX, que son objetos del lenguaje de programación, de los controles ActiveX, que son scripts insertados en una página web para su ejecución en el cliente. Lugares donde se pueden adquirir componentes es en Serverobjectos.com o Persist.com, que son páginas dedicadas a programarlos y venderlos. En ActiveX.com se pueden encontrar controles además de componentes. I.2.3.1 Objetos ASP El ASP es un lenguaje diseñado para la creación de aplicaciones en internet. Esto quiere decir que existen toda una serie de tareas bastante corrientes a las cuales debe dar un tratamiento fácil y eficaz. Nos referimos por ejemplo al envío de e-mails, acceso a archivos, gestión de variables del cliente o servidor como pueden ser su IP o la lengua aceptada... El lenguaje de programación para ASP no da una solución fácil y directa a estas tareas sino que invoca a los denominados objetos que no son más que unos módulos incorporados al lenguaje que permiten el desarrollo de tareas específicas. Estos objetos realizan de una manera sencilla toda una serie de acciones de una complejidad relevante. A partir de una llamada al objeto este realizará la tarea requerida. En cierta forma, estos objetos nos ahorran el tener que hacer largos programas para operaciones sencillas y habituales. Algunos de estos objetos están incorporados en el propio ASP, otros deben de ser incorporados como si se tratase de componentes accesorios. Por supuesto, no Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 19 I Memoria podríamos ejecutar correctamente un script en el cual tuviésemos que llamar a un objeto que no estuviese integrado en el servidor. Se expondrán los siguientes puntos: • • • • • Definición de objetos, métodos y colecciones Objetos ASP que existen Ámbito de operación: cliente, servidor o ambos Tipo de información que se puede conocer del usuario gracias a objetos ASP Otros componentes de ASP I.2.3.1.1 Objetos Son una agrupación de datos y funciones. Se pueden comparar con las cosas de la vida real que tienen un carácter y funcionalidad específicos. Todos los detalles en torno a la implementación se encierran en una cápsula que los oculta al exterior, de manera que sólo se puede acceder a las propiedades y a la funcionalidad de los objetos a través de unas interfaces predefinidas. VBScrìpt pertenece a la clase de lenguajes de programación procedural ampliados con la funcionalidad de la programación orientada a objetos. Por esta razón la funcionalidad añadida de VBasic y VBScript (simplificación de VBasic) para manejar objetos es limitada, no obstante permiten integrar clases de objetos, que es precisamente lo que se ha hecho con los objetos ASP. Muy ligado al concepto de objetos está el concepto de colecciones. Las colecciones son objetos en sí que representan un conjunto de objetos. Todas las colecciones tienen métodos y propiedades predefinidos: el método Item, la propiedad Count y el método _NewEnum. Por definición, una colección también tiene la capacidad de crear objetos del mismo tipo que la colección. En otras palabras, si un objeto puede ser englobado en un conjunto de objetos iguales, ese objeto tiene un objeto colección que puede instanciar otros objetos dentro de la colección. I.2.3.1.2 Objetos en VBScript Un objeto VBScript posee propiedades, métodos y eventos que operan sobre él. Como ejemplo definimos un objeto: <% Dim objauto Set objauto = Server.CreateObject("miautomovil ") objauto.ruedas = 4 objauto.Color = "verde" objauto.cambio = "manual" %> Figura I.2.1 Ejemplo de cómo instancia de un objeto ASP 20 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos El método CreateObject del objeto Server (objeto predefinido de VBScript) devuelve una instancia que se asigna a la variable definida. En las líneas siguientes se asigna un valor a cada propiedad que definamos. Si tuviera un método se llamaría de la siguiente forma: Variable = objeto.metodo() Y también se podrían pasar parámetros en la llamada del método si éste tuviera parámetros definidos en su llamada: Parámetro = valordelparametro Objeto.metodo (parámetro) I.2.3.1.3 Objetos estándar de ASP Se incorporan objetos predefinidos. Son los siguientes: • • • • • • Request Response Session Server Application ObjectContext Cada uno tiene un comportamiento distinto en su forma de interactuar entre servidor y cliente. Los objetos Request y Response se encargan de manejar las consultas del cliente al servidor y de la respuesta del servidor al cliente respectivamente. El resto de objetos interaccionan exclusivamente con el servidor. El objeto Session está subordinado al objeto Application. Éste informa sobre el inicio de una aplicación y se mantiene activo hasta que se cierra tal aplicación. El objeto Session se genera cada vez que se inicia una sesión y desaparece cuando concluye la sesión a la que está asociado. Estos objetos representan y proporcionan funciones que no están disponibles en servidores Web normales. El objeto Server es el responsable de las operaciones básicas del servidor. Algunas tareas son transformar rutas lógicas en rutas físicas o convertir caracteres ASCII en textos HTML. El objeto ObjectContext nos permite gestionar nuestras páginas ASP transaccionales. A través de este objeto se puede abortar una transacción o llevarla a cabo. I.2.3.1.3.1 Request Se compone de cinco colecciones y son las siguientes: Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 21 I Memoria • • • • • QueryString: los pares nombre/valor se agregan y transmiten a través de la URL. Form: Al consultar formularios los pares nombre/valor se guardan en esta colección. Cookies: si el cliente remite cookies se guardan en esta colección. ServerVariables: guarda los valores de variables del servidor HTTP. ClientCertificate: lista de valores utilizada para certificados y datos de seguridad. I.2.3.1.3.2 Response Este objeto ofrece un gran número de métodos que nos permiten interaccionar con el navegador. • Envío de información al navegador o El método Write: Es el método más utilizado, ya que devuelve al navegador los resultados de un código ASP. Su llamada es Response.Write(valor a devolver), o abreviadamente = valor a devolver, como se muestra en el siguiente ejemplo: <BODY> <% operacion = “Suma” operando1= 3 operando2 = 5 resultado = operando1 + operando2 %> <P>Título: <% Response.Write(operacion) %> <P>Resultado: <% = resultado %> </BODY> Figura I.2.2 Ejemplo de uso del método Write • Control del navegador o El método Redirect: Con este método se puede elegir otras páginas ASP o bien páginas HTML sencillas. Su llamada es Response.Redirect = URLDestino. Esta llamada siempre se debe realizar delante de cualquier texto HTML para evitar incompatibilidades con los registros de encabezado HTML que genera. 22 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos o Propiedad Expires: Sirve para asegurarse que la versión del documento que se tiene es actual, ya que esta propiedad establece un periodo de tiempo dentro del cual los datos guardados temporalmente por el navegador se consideran actuales, así que no hay que pedirlos al servidor. Pasado el tiempo fijado por esta propiedad, el documento se borra de la caché y se accede de nuevo a una versión completa desde el servidor. Esta propiedad se define como Response.Expires = Minutos. o Propiedad ExpiresAbsolute: Esta propiedad fija el tiempo absoluto en el que deja de tener validez el documento. Por tanto, se debe concretar fecha y hora. Se establece con Response.ExpiresAbsolute = #DateTime#. El formato fecha y hora se corresponde con la siguiente fecha y hora: DD.MM.AAAA, HH:MM • Control de transferencia de los datos La información de una página ASP se envía continuamente al navegador del usuario a través de un flujo de datos. El objeto Response cuenta con algunos métodos que permiten regular este flujo de datos. Las propiedades y métodos asociados son las siguientes: o Propiedad Buffer: Con la propiedad Buffer se establece si la transmisión de datos al navegador se realiza o bien automáticamente o bien a través del programa ASP. Response.Buffer = True indica que la transmisión de los datos se controlará a través del programa ASP. Esta propiedad se debe definir en un lugar específico dentro de la página: antes de cualquier texto HTML y después de fijar el lenguaje de script. <% LANGUAJGE = “VBScript” %> … <% Response.Buffer = True %> … <HTML> … Figura I.2.3 Establecimiento de la propiedad Buffer o Método Flush : Al llamarlo se envía inmediatamente al navegador del usuario el código que hasta entonces se ha ido almacenando en el buffer, y al mismo tiempo se continúa ejecutando el programa ASP. La llamada es Response.Flush. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 23 I Memoria o Método Clear: Borra código fuente escrito y guardado en el buffer si todavía no se ha enviado al navegador. Se invoca con Response.Clear. o Método End: Se detiene la ejecución de un programa ASP. El buffer ya escrito se envía al navegador del usuario si la propiedad buffer es true. Se llama con Response.End. I.2.3.1.3.3 Session Una sesión se asocia siempre con un cliente y se genera cuando se solicita el primer documento y concluye cuando tras un tiempo no se ha recibido ninguna consulta más de ese cliente. El concepto session trabaja con Cookies en el lado del cliente. Cada sesión se identifica con un número exclusivo, que se almacena de forma cifrada en la cookie del cliente, manteniendo los datos de sesión en el servidor. Hay que tener cuidado de que el cliente no tenga desactivada la escritura en cookies. • Colecciones: o StaticObjects: Se basa en el archivo global.asa y se utiliza para consultar un determinado valor de un objeto. Este archivo global.asa es el que posibilita que se mantengan datos a lo largo de una sesión. o Contents: Contiene todas las variables que se han insertado en el objeto Session con comandos script. • Propiedades: Establecen particularidades locales como el idioma o el formato de fecha. Son las siguientes: o SessionId: identifica al usuario de forma unívoca y se le asigna a través de una cookie. Esta cookie no tiene fecha de caducidad con lo que se elimina cuando se cierra el navegador. Se puede ver el session id con Response.Write (Session.SessionId). o Timeout: Indica cuánto tiempo le queda de vida a una sesión si no se recibe ninguna petición por parte del usuario. Para modificar su valor: Session.Timeout = 10. En este ejemplo queda fijado en 10 minutos. o Codepage: Indica cuál de los juegos de caracteres disponibles se va a utilizar. Session.Codepage = numeroCodigo. El número del código se puede ver en tablas. Por ejemplo, para Unicode, se tendría el número 1200. Se pueden usar diferentes códigos en una misma página. 24 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos o LCID: identificador local. Establece el formato de fecha. Session.LCID = codigoregion. • Método Abandon: Destruye el objeto Session actual. Se liberan todos los recursos que utiliza el objeto Session actual una vez se han procesado todas las instrucciones de la página activa. Hay que hacer notar que sólo se destruye el objeto, no las variables Session, de manera que después de llamar a este método aún se pueden consultar estas variables. La llamada es Session.Abandon. Además se procesa todo el contenido del evento Session_OnEnd, contenido en el archivo global.asa. Este archivo simplemente contiene una serie de subrutinas que se ejecutan al inicio y al final de una sesión o una aplicación. • Eventos: En el objeto Session están las subrutinas OnStart y OnEnd, que se ejecutan al iniciar y finalizar la sesión. Se explican dichas subrutinas a continuación: o OnStart Si el tratamiento correspondiente a este evento está definido en el archivo global.asa se ejecutarán las instrucciones que contiene y sólo después se procesa el auténtico programa ASP del código script. <% SUB Session_OnStart … ‘Codigo que se debe ejecutar al iniciar la sesión … END SUB %> Figura I.2.4 Subrutina OnStart escrito dentro del objeto Session. Se puede utilizar para definir y dar valores a variables que tengan validez en toda la sesión. o OnEnd Se activa justo antes de eliminar el objeto Session. Las causas pueden ser o bien llamada al método Session.Abandon o bien a transcurrido el tiempo Timeout. Para que tenga efecto este tratamiento de evento también se debe definir en el archivo global.asa. <% Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 25 I Memoria SUB Session_OnEnd … ‘Codigo que se debe ejecutar al finalizar la sesión … END SUB %> Figura I.2.5 Subrutina OnEnd escrito dentro del objeto Session Por ejemplo nos puede servir para guardar datos en el servidor para disponer de ellos en sesiones futuras. I.2.3.1.3.4 Application El objeto Applicaction nos servirá para intercambiar datos entre sesiones, ya que cuando una sesión existe es porque una aplicación existe. De esta manera se puede tener variables en una aplicación que serán accesibles desde todas las sesiones, pudiendo así intercambiar datos. Una aplicación comienza cuando se llama por primera vez la primera página de la aplicación. Es cuando se lanza el evento OnStart. Si en el archivo global.asa está definido el procedimiento Application_OnStart se procesará el código escrito. • Colecciones: o Contents: Ofrece todas las variables que aparecen a lo largo de la existencia del objeto Application. Para registrar en la colección Contents una variable, por ejemplo llamada Autor, se hace lo siguiente: <% Application(“Autor”) = “Ildefonso Ferrer” %> o StaticObjects: Contiene todos los objetos definidos en global.asa con la etiqueta <Object>. Su manejo es similar al de la colección anterior. • Métodos: o Lock: asegura de que otros clientes con puedan modificar ninguna de las variables y propiedades de la aplicación hasta que no se llame al método UnLock. La llamada es Application.Lock. o UnLock: anula el bloqueo del objeto Application para el resto de clientes. Application.UnLock. • Eventos: Análogamente al objeto Session, este objeto también posee los mismos eventos registrados en el archivo global.asa. 26 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos o OnStart: Se lanza al arrancar una aplicación. Si en el archivo global.asa se ha definido la subrutina Application_OnStart se ejecutará primero todo el código allí contenido. <% SUB Applicaton_OnStart … ‘Codigo que se debe ejecutar al iniciar la aplicación Application(“FechaAhora”) = Now() … END SUB %> Figura I.2.6 Subrutina OnStart escrita dentro del objeto Application En este código se ha introducido la fecha, que se puede consultar mientras esté la aplicación viva: <% Response.Write(Application(“FechaAhora”)) %> o OnEnd Funciona de la misma manera que el evento anterior. Debe estar registrado en el archivo global.asa. <% SUB Application_OnEnd … ‘Codigo que se debe ejecutar al finalizar la aplicación … END SUB %> Figura I.2.7 Subrutina OnEnd escrita en el objeto Application I.2.3.1.3.5 Server Permite controlar propiedades del servidor y proporciona la posibilidad de crear objetos propios para ampliar las funciones de ASP. La mayor parte de la funcionalidad está representada por los métodos que vamos a describir. • Métodos: o CreateObject: Instancia objetos. Server.CreateObject genera objetos con los métodos, colecciones y eventos que se definan. Ej.: <% ConexionObjeto = Server.CreateObject (“ADODB.Connection”) %>. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 27 I Memoria Genera un objeto de tipo ADODB.Connection cuyo nombre es ConexionObjeto. o HTMLEncode: Sustituye todos los caracteres especiales por los caracteres específicos definidos para HTML. Ejemplo: <% text = “Ejemplo” %> <HTML> <body> <% = text %> <br> <% Response.Write(Server.HTMLEncode(“<% = text %\>”)) %> </body> </HTML> Figura I.2.8 Ejemplo de uso del método HTMLEncode Da como salida: <HTML> <body> Ejemplo <br> &lt;% = text %&gt; </body> </HTML> Figura I.2.9 Salida del ejemplo anterior o URLEncode: Toma como parámetro una cadena y la convierte a formato URL cambiando espacios en blanco por el símbolo “+” y toda una serie de otros caracteres especiales por “%” seguido de su código ANSI (como valor hexadecimal). Nota: Así es posible insertar caracteres especiales en una URL y enviarlos a otras páginas ASP. o MapPath: Convierte rutas reales en rutas virtuales. Mostramos un ejemplo. • Componentes: En los programas ASP, los componentes son siempre ActiveX. No forman parte de ASP, aunque algunos de ellos ya están disponibles con ASP y ofrecen funciones muy útiles. Un componente se hace accesible al usuario con la creación de un objeto a través del objeto Server: Server.CreateObject (“NombreObjeto”). Vamos a ver algunos de los componentes estándar ActiveX que se distribuyen con ASP: 28 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos o Ad Rotator: Va cambiando de forma cíclica el contenido de un marco de imagen, por ejemplo un banner publicitario. En la misma operación es posible indicar también las nuevas dimensiones del gráfico o un link asociado a la imagen. o Browser Capabilities: Ayuda a conocer información sobre el navegador del usuario como puede ser el soporte de cookies o de JavaScript. El archivo Browsercap.ini define todas las funcionalidades de los diferentes navegadores. El componente utiliza este archivo para interpretar la información relativa al navegador contenida en el encabezado HTTP. o Content Linking: Sirve para asociar entre sí una serie de páginas ASP y de esta manera poder pasar páginas hacia delante o atrás como si se tratar de un libro. o ADO: ActiveX Data Objects (Objetos de datos ActiveX). Se trata de la principal tecnología de Microsoft para acceder a bases de datos. I.2.3.1.3.6 ObjectContext Ofrece la posibilidad de completar transacciones o disparar una vuelta atrás o Rollback de todos los comandos de la transacción. Un Rollback significa prácticamente deshacer todas las instrucciones dentro de una transacción. Las transacciones se llevan a cabo dentro del marco de Microsoft Transaction Server. Cada uno de los dos métodos que contiene tiene asignado un evento que nos permitirá reaccionar en consecuencia ante el éxito o fracaso de una transacción. I.2.3.2 Componentes comerciales Se estudian algunos componentes ActiveX, concretamente aquellos que están instalados en el servidor de la empresa que nos da el servicio de alojamiento Web de partida. Para conocer más acerca de estos componentes recurrimos al Web, donde se encuentra abundante información, manuales y casos prácticos. Tras numerar estos componentes se describen las funcionalidades que ofrecen. Estos componentes son: • • • • • ASPGRID ASPUPLOAD ASPUTILS ASPEMAIL CSIMAGEFILE I.2.3.2.1 ASPGRID Este componente ofrece a las aplicaciones ASP la posibilidad de utilizar un control de tipo rejilla para gestionar los registros de las bases de datos empleadas. Permite crear interfaces de acceso a las bases de datos, independientes del navegador y con pocas líneas de código. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 29 I Memoria Si se quieren mirar las características que ofrece este componente no se tiene más que visitar las páginas de las compañías que se dedican a su programación y venta [8]. Podemos también descargarnos una versión de prueba [9]. Algunas de las características que soporta este componente son: • • • • • • • • Permite crear una interfaz tipo rejilla editable y basado en Web que enlace a una tabla de base de datos en tan solo 3 líneas de código ASP. Interfaz de objetos intuitiva que le permite personalizar la apariencia de los datos en la rejilla. Soporta recordsets con claves extranjeras (foreign-keys recordsets). Soporta controles HTML como listas desplegables (list box), casillas de opción (checkboxes) y cuadros de texto (textareas). Permite transformar campos de datos en enlaces o imágenes. Soporta ordenación por columnas. Botones de navegación. Soporta formularios de datos enlazados. El aspecto que presenta una interfaz creada con este componente es el que se muestra en la imagen siguiente: Figura I.2.10Tabla creada con ASPGRID I.2.3.2.2 ASPUPLOAD Es un componente que permite gestionar la transferencia de archivos por medio de un navegador hacia el servidor. ASPUPLOAD permite al servidor aceptar, guardar y manipular archivos que hayan sido enviados por un usuario a partir de un clásico formulario en HTML. El contenido de este formulario es enviado a un script que invoca a un objeto que es quien realmente se encarga de realizar todas las funciones necesarias para la toma y almacenamiento de los archivos. Entre otras cosas, este componente nos da las siguientes funcionalidades: • • • • • 30 Limitar el tamaño del archivo a colgar. Permitir o no el sobrescribir un archivo. Controlar los atributos del archivo. Mover, copiar, renombrar y borrar el archivo recibido. Almacenar los archivos en bases de datos. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos • • Guardar los archivos en memoria, no en el disco duro. Nos informa sobre las dimensiones y tipo de archivo gráfico colgado. En algunos sitios Web de donde se ha sacado la información se comenta que este componente, a pesar de no ser gratuito, es de manejo fácil y completo [11]. I.2.3.2.3 ASPEMAIL Como se puede imaginar por su nombre, este componente permite enviar emails a través de una página Web. Con ASPEMAIL se puede poner a disposición de los clientes un formulario de contacto en la página Web diseñada y recibir su contenido por correo electrónico. También se puede enviar correos electrónicos automatizados como boletines, o responder a solicitudes determinadas desde la página Web. Las funcionalidades de este componente son: - - Envía e-mail usando un servidor SMTP (Simple Mail Transfer Protocol, protocolo de transferencia de correo simple). Soporta múltiples recipientes, CC’s (Carbon Copy, copia), BCC’s (Blind Carbon Copy, copia oculta), Contestar-A’s, adjuntar archivos. Soporta formato HTML. Imágenes incrustadas y sonidos (multipart/related) Envía mensajes en ambos formatos, HTML y formatos de texto (multipart/alternative). Correo seguro en formato S/MIME (Secure / Multipurpose Internet Mail Extensions, extensiones de correo por internet multipropósito seguro), cuando se usa conjuntamente con ASPENCRYPT (no disponible en nuestro hosting). Varios métodos de autenticación SMTP. Soporte de alto volumen de cola de mensajes. Entrega de mensajes diferida. Soporta NNTP (Network News Transfer Protocol, protocolo de transferencia de noticias de red). Adjuntar en memoria. Se puede añadir archivos directamente de una base de datos sin crear una copia temporal en el disco. I.2.3.2.4 CSIMAGEFILE Este componente permite el manejo de imágenes y redimensionado. Se dispone de un rango amplio de funciones para editar y optimizar imágenes. Sus funcionalidades son: - - Redimensiona y escala imágenes. Permite entradas desde el servidor, URL remota o datos binarios de una base de datos. Acepta entradas directamente del componente csASPUPLOAD (no es exactamente el que se dispone: cs denota la empresa que programa el componente). Envía la salida al servidor, o crea un flujo hacia una base de datos o navegador. Crea imágenes compuestas, pegando una sobre otra. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 31 I Memoria - Añade texto sobre la imagen usando cualquier fuente instalada. Soporta caracteres Unicode. Realiza edición simple de dibujo de líneas y relleno con colores. Usa los formatos JPEG, GIF, BMP, PNG, PSD, PCX, TIF Y WBMP y puede convertirlos entre ellos. Lee y edita texto IPTC en imágenes JPG y TIF. Lee y edita atributos EXIF de archivos JPG. I.2.3.3 Software necesario Se pretende exponer los requisitos necesarios para crear un entorno de trabajo de prueba local y una plataforma servidor. Si se trabaja bajo sistema Windows NT, o las versiones Profesional y Server de Windows 2000 y XP, el servidor a instalar es el Internet Information Server (IIS, servidor de información de internet). Es el servidor de páginas web avanzado de la plataforma Windows. Se distribuye gratuitamente junto con las versiones de Windows basadas en NT, como pueden ser Windows 2000 Profesional o Windows 2000 Server, así como Windows XP, también en sus versiones Profesional y Server. Existe también la posibilidad de trabajar en plataformas UNIX empleando en este caso el ChilisoftASP [43]. Esto permite a las orgnaizaciones diseñar aplicaciones Web basadas en páginas ASP en una amplia variedad de servidores Web y sistemas operativos. Como entornos de desarrollo podemos usar el Visual Studio del cual existe una versión gratuita (Visual Studio Express) o bien Microsoft ASP .NET Web Matriz que es otro entorno gratuito. I.2.4 Java Server Pages Para comprender las Páginas Java en Servidor (Java Server Pages), es preciso comprender la estructura que les sirve de base: los servlets de Java [2]. Los servlets son clases de Java que amplían la funcionalidad de un servidor Web mediante la generación dinámica de páginas Web. Un entorno de ejecución denominado motor de servlets administra la carga y descarga del servlet, y trabaja con el servidor Web para dirigir peticiones a los servlets y enviar la respuesta a los clientes. Los servlets se ejecutan en una máquina virtual en un entorno de servidor controlado y sólo necesitan el HTTP básico para comunicarse con sus clientes. No es necesario que el cliente tenga un software especial. Aunque los servidores HTTP no tienen capacidad para recordar detalles de una petición previa del mismo cliente, la interfaz API Servlet proporciona una clase que permite superar esta limitación. Los servlets son aplicaciones Java, por tanto tienen acceso directo a toda la gama de características Java, como el uso de subprocesos, acceso a redes y conectividad a bases de datos. 32 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos Las páginas JSP, que se convierten automáticamente en servlets, heredan todas estas ventajas. I.2.4.1 Servlets Como sus equivalentes applets (programa escrito en lenguaje Java que puede ser incluido en una página HTML) del cliente, los servlets proporcionan métodos a los que recurrimos cuando ocurren eventos específicos en un contexto más amplio. La programación en este entorno obliga a escribir métodos predefinidos (métodos de retrollamada –callback-) a los que vamos llamando a medida que el programa que los gestiona lo requiere. Un applet, por ejemplo, proporciona métodos como init(), start(), paint(), stop() y destroy(), a los que el entorno de ejecución del applet llama como respuesta a las acciones realizadas por el usuario. Sólo es preciso sobrescribir aquellos métodos que ocurren durante los eventos con los que estamos trabajando. De forma similar, los servlets operan en el contexto de un modelo de petición y respuesta administrado por el motor de servlets. El motor de servlets se encarga de: • • • • Cargar un servlet cuando lo solicitamos por primera vez Llamar al método init() del servlet. Manejar todas las peticiones que reciba llamando al método del servlet service(). Llamar al método destroy() de cada servlet al terminar la ejecución. Hay clases base estándar javax.servlet.GenericServlet y javax.servlet.HttpServlet que implementan los métodos de retrollamada del servlet. La programación de servlets, por tanto, consiste en subclasificar una de estas clases y sobrescribir el método necesario para llevar a cabo la tarea que se tiene entre manos. I.2.4.2 Ciclo de vida Vamos a explicar los métodos que componen el ciclo de vida de un servlet para tener una idea de cómo funcionan: • init() Cuando el motor de servlets recibe la petición de un servlet, comprueba si el servlet ya está cargado. Si no es así , el motor de servlets emplea un cargador de clases para conseguir la clase servlet concreta requerida en ese caso y después invoca a su constructor para obtener un ejemplar del servlet. • service() Después de que el método init() lleve a cabo su tarea con éxito, el servlet está preparado para aceptar peticiones. De manera predeterminada se crea un solo ejemplar del servlet, y el motor de servlets lanza cada petición al templar en un subproceso diferente. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 33 I Memoria La mayoría de servlets están diseñados para operar en el entrono HTTP, para el cual hay un paquete especializado javax.servlet.http. Estos servlets extienden la clase javax.servlet.http.HttpServlet, que proporciona métodos especializados correspondientes a cada método de petición HTTP. • destroy() La especificación servlet permite a un motor de servlets descargar un servlet en cualquier comento. Esto se puede hacer para conservar los recursos del sistema o como preparación para el cierre del motor de servlets. El motor de servlets notifica a cada servlet cargado que esto está a punto de ocurrir llamando a su método destroy(). I.2.4.3 Contexto del servlet Un contexto de servlet es una interfaz proporcionada por el motor de servlets para entregar servicios a una aplicación Web. Los servlets de la aplicación Web pueden utilizar el contexto del servlet para conseguir: • • • • La capacidad para guardar y recuperar atributos entre invocaciones y para compartir estos atributos con otros servlets. La capacidad para leer el contenido de los ficheros y otros recursos estáticos de la aplicación Web. Un medio de lanzar peticiones de un servlet a otro. Una manera de registrar errores y mensajes informativos. El contexto del servlet tiene un nombre que establece una relación unívoca con un directorio del sistema de ficheros. I.2.4.4 Clases e interfaces Las clases e interfaces principales de la API Servlet son: • • • • • • La interfaz Servlet, que describe los métodos de retrollamada que se deben implementar. GenericServlet, una clase base que implementa los métodos de la interfaz Servlet. HttpServlet, una subclase específica para HTTP de GenericServlet. ServletRequest, que encapsula la información sobre la petición del cliente. ServletResponse, que proporcionan acceso a un flujo de salida para que los resultados se devuelvan al cliente. La interfaz ServletContext, que permite a un grupo de servlets ínteroperar entre sí en una aplicación Web. Los servlets son la tecnología que sirve de base a las páginas JSP. 34 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos I.2.4.5 Las JSP Una página Java en servidor es una plantilla para una página Web que empela código Java para generar un documento HTML dinámicamente. Las páginas JSP se ejecutan en un componente del servidor conocido como contenedor de JSP, que las traduce a servlets Java equivalentes. Por esta razón los servlets y las páginas JSP están íntimamente relacionados. Lo que se puede hacer con una tecnología es, en gran medida, también posible con la otra, cada una con sus capacidades propias. Las páginas JSP, al ser servlets, tienen todas las ventajas de los servlets: • • • Mayor rendimiento y capacidad de adaptación que las secuencias de comandos CGI al admitir múltiples subprocesos y conservarse en memoria. Incorporan soporte para sesiones HTTP. Tienen pleno acceso a la tecnología Java. Y además, las ventajas propias de las páginas JSP: • • • Se vuelven a compilar automáticamente cuando es necesario. Es más fácil dirigirse a las páginas JSP que a los servlets, ya que las JSP están en el espacio común de documentos del servidor Web. Al ser las páginas JSP similares al HTML, tienen mayor compatibilidad con las herramientas de desarrollo Web. I.2.4.5.1 Funcionamiento de las JSP La página JSP pasa por tres etapas en la evolución de su código: • Código fuente JSP: Este código es el que realmente escribe el desarrollador. Se encuentra en un archivo de texto con extensión .jsp y consiste en una mezcla de código de plantilla HTML, instrucciones en lenguaje Java, directivas JSP y acciones que describen cómo generar una página Web para dar servicio a una petición concreta. • Código fuente Java: El contendor de JSP traduce el código fuente JSP al código fuente de un servlet Java equivalente. • Clase Java compilada: Como cualquier otra clase Java, el código del servlet generado se compila en código de bytes en un archivo .class, preparado para ser cargado y ejecutado. El contenedor JSP administra cada una de estas etapas de la página JSP automáticamente, basándose en la situación temporal de cada archivo. Como respuesta a la petición HTTP, el contenedor comprueba si el archivo fuente .jsp ha sufrido modificaciones desde que el código fuente .java se compiló por última vez. Determina el nombre de la clase correspondiente al archivo .jsp. Si la clase no existe o es anterior al archivo .jsp, entonces el contenedor crea el código fuente Java para un servlet equivalente y lo compila. Si no hay aún un ejemplar o instancia del servlet en funcionamiento, el contenedor carga la clase servlet y crea un ejemplar. Finalmente, el Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 35 I Memoria contenedor lanza un subproceso para que gestione la petición HTTP actual del ejemplar cargado. I.2.4.6 XML y JSP El lenguaje extensible de marcas (XML, eXtensible Markup Language) ha quedado establecido como lenguaje universal para el almacenamiento e intercambio de información. Se utiliza para el desarrollo de contenidos de sitios Web, intercambio de datos entre empresas y en aplicaciones tan diversas como arquitectura, informes financieros y música. I.2.4.6.1 Visión general XML es un sistema para describir datos estructurados con un grupo de etiquetas de marcado definidas por el usuario. No es un lenguaje en sí mismo, sino un sistema para definir lenguajes de propósito específico. Parece similar con HTML, que marca secciones de un documento Web con etiquetas predefinidas. La diferencia está en que XML permite diseñar un juego predeterminado de etiquetas mientras que el juego de etiquetas de HTML es fijo. Los primeros formatos de procesamiento de texto no distinguían entre contenido y presentación. De esta manera cuando se necesita un nuevo formato de salida, la información contenida en el documento no sirve. XML se centra completamente en la estructura. Se puede identificar claramente elementos de datos específicos para ser extraídos por aplicaciones de búsqueda de texto. Así, cuando necesitamos mostrar un documento XML en un navegador Web, se puede convertir de forma programada a HTML utilizando una hoja de estilo XSL. I.2.5 PHP Hypertext Preprocessor Es un lenguaje de programación, con sintaxis parecida a los lenguajes C y Perl, que se interpreta por un servidor Web y genera código HTML dinámico. Se puede encontrar todo acerca de PHP en su página oficial [15]. El funcionamiento de una página PHP comienza con la petición del cliente a un servidor Web como si se tratara de cualquier otra página. El servidor Web, al reconocer la extensión de la página se la envía al intérprete PHP y éste tras ejecutar los resultados la devuelve al navegador cliente. Lo más interesante que incorpora PHP es la facilidad para consultar bases de datos y generar páginas en función de los resultados obtenidos en la consulta. Se pueden definir clases y usar características de la programación orientada a objetos. La ejecución de un programa PHP se puede realizar desde un cliente Web de cualquier plataforma: sistema operativo y cliente Web cualesquiera. 36 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos I.2.5.1 Sintaxis PHP En este apartado no se pretende enseñar cómo se usa PHP, simplemente dar una idea de la sintaxis de este lenguaje de programación. En cualquier momento se puede consultar bibliografía sobre PHP donde se muestra cómo usarlo [3] o incluso el propio manual de referencia que se puede encontrar en internet [14] o incluso descargarlo [16]. Además se pueden encontrar numerosos ejemplos [17] [18]. Para interpretar un archivo, PHP simplemente interpreta el texto del archivo hasta que encuentra uno de los caracteres especiales que delimitan el inicio de código PHP. El intérprete ejecuta entonces todo el código que encuentra, hasta que encuentra una etiqueta de fin de código, que le dice al intérprete que siga ignorando el código siguiente. Este mecanismo permite embeber código PHP dentro de HTML: todo lo que está fuera de las etiquetas PHP se deja tal como está, mientras que el resto se interpreta como código. Hay cuatro conjuntos de etiquetas que pueden ser usadas para denotar bloques de código PHP. De estas cuatro, sólo 2 (<?php. . .?> y <script language="php">. . .</script>) están siempre disponibles; el resto pueden ser configuradas en el fichero de php.ini para ser o no aceptadas por el intérprete. Mientras que el formato corto de etiquetas y el estilo ASP pueden ser convenientes, no son portables como la versión de formato largo de etiquetas. Además, si se pretende embeber código PHP en XML o XHTML, será obligatorio el uso del formato <?php. . .?> para la compatibilidad con XML. La separación de instrucciones se hace de la misma manera que en C o Perl terminando cada declaración con un punto y coma PHP soporta el estilo de comentarios de C, C++ y de la interfaz de comandos de Unix. Hay que tener cuidado con no anidar comentarios de estilo ', algo que puede ocurrir al comentar bloques largos de código. I.2.5.1.1 Tipos PHP soporta ocho tipos primitivos. Cuatro de ellos son escalares (boolean, integer, float y string), dos compuestos (array y object) y dos especiales (resource y NULL). También se puede encontrar el tipo double aunque es el mismo tipo que float y existe sólo por razones históricas. El tipo de una variable usualmente no es declarado por el programador; en cambio, es decidido en tiempo de compilación por PHP dependiendo del contexto en el que es usada la variable I.2.5.1.2 Variables En PHP las variables se representan como un signo de dólar seguido por el nombre de la variable. El nombre de la variable es sensible a minúsculas y mayúsculas. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 37 I Memoria Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable valido tiene que empezar con una letra o una raya (underscore), seguido de cualquier número de letras, números y rayas. Como expresión regular se podría expresar como: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]. En nuestro caso, una letra es a-z, A-Z, y los caracteres ASCII del 127 al 255 (0x7f-0xff). PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. De todas formas, muchas de esas variables no pueden estar completamente documentadas ya que dependen de sobre qué servidor se esté ejecutando, la versión y configuración de dicho servidor, y otros factores. A partir de PHP 4.1.0, PHP ofrece un conjunto adicional de matrices predefinidas, conteniendo variables del servidor web, el entorno y entradas del usuario. Estas nuevas matrices son un poco especiales porque son automáticamente globales. Por esta razón, son conocidas a menudo como “autoglobales" ó "superglobales". Variables PHP superglobales: 38 • $GLOBALS Contiene una referencia a cada variable disponible en el espectro de las variables del script. Las llaves de esta matriz son los nombres de las variables globales. $GLOBALS existe dese PHP 3 • $SERVER Variables definidas por el servidor web ó directamente relacionadas con el entorno en don el script se esta ejecutando. Análoga a la antigua matriz $HTTP_SERVER_VARS (la cual está todavía disponible, aunque no se use) • $GET Variables proporcionadas al script por medio de HTTP GET. Análoga a la antigua matriz $HTTP_GET_VARS (la cual está todavía disponible, aunque no se use) • $POST Variables proporcionadas al script por medio de HTTP POST. Análoga a la antigua matriz $HTTP_POST_VARS (la cual está todavía disponible, aunque no se use) • $COOKIE Variables proporcionadas al script por medio de HTTP cookies. Análoga a la antigua matriz $HTTP_COOKIE_VARS (la cual está todavía disponible, aunque no se use) • $FILES Variables proporcionadas al script por medio de la subida de ficheros vía HTTP . Análoga a la antigua matriz $HTTP_POST_FILES (la cual está todavía disponible, aunque no se use). Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos • $ENV Variables proporcionadas al script por medio del entorno. Análoga a la antigua matriz $HTTP_ENV_VARS (la cual está todavía disponible, aunque no se use) • $REQUEST Variables proporcionadas al script por medio de cualquier mecanismo de entrada del usuario y por lo tanto no se puede confiar en ellas. Esta matriz no tiene un análogo en versiones anteriores a PHP 4.1.0 • $SESSION Variables registradas en la sesión del script. Análoga a la antigua matriz $HTTP_SESSION_VARS (la cual está todavía disponible, aunque no se use) La mayor parte de las variables PHP sólo tienen un ámbito simple. Este ámbito simple también abarca los ficheros incluidos y los requeridos. Dentro de las funciones definidas por el usuario aparece un ámbito local a la función. Cualquier variable que se use dentro de una función está, por defecto, limitada al ámbito local de la función. Por ejemplo: <?php $a = 1; /* global scope */ function Test() { echo $a; /* reference to local scope variable */ } Test(); ?> Figura I.2.11Ejemplo del ámbito de las variables Este script no producirá salida, ya que la orden echo utiliza una versión local de la variable $a, a la que no se ha asignado ningún valor en su ámbito. En PHP, las variables globales deben ser declaradas globales dentro de la función si van a ser utilizadas dentro de dicha función. Ejemplo: <?php $a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b; ?> Figura I.2.12Ejemplo del uso de funciones locales dentro de una función Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 39 I Memoria El script anterior producirá la salida "3". Al declarar $a y $b globales dentro de la función, todas las referencias a tales variables se referirán a la versión global. No hay límite al número de variables globales que se pueden manipular dentro de una función. Un segundo método para acceder a las variables desde un ámbito global es usando la matriz $GLOBALS. El ejemplo anterior se puede rescribir así: <?php $a = 1; $b = 2; function Sum() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Sum(); echo $b; ?> Figura I.2.13Uso de $GLOBALS para el acceso a variables locales La matriz $GLOBALS es una matriz asociativa con el nombre de la variable global como clave y los contenidos de dicha variable como el valor del elemento de la matriz. $GLOBALS existe en cualquier ámbito. Otra característica importante del ámbito de las variables es la variable static. Una variable estática existe sólo en el ámbito local de la función, pero no pierde su valor cuando la ejecución del programa abandona este ámbito. I.2.5.1.3 Constantes Una constante es un identificador para expresar un valor simple. Como el nombre sugiere, este valor no puede variar durante la ejecución del script. Una constante es sensible a mayúsculas por defecto. Por convención, los identificadores de constantes suelen declararse en mayúsculas El nombre de una constante sigue las mismas reglas que cualquier etiqueta en PHP. Un nombre de constante válido empieza con una letra o un carácter de subrayado, seguido por cualquier número de letras, números, o subrayados. Se podrían expresar mediante la siguiente expresión regular: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]. Para nuestros propósitos , entenderemos como letra los caracteres a-z, A-Z, y los ASCII del 127 hasta el 255 (0x7f-0xff). Se puede definir una constante usando la función define(). Una vez definida, no puede ser modificada ni eliminada. Estas son las diferencias entre constantes y variables: • • 40 Las constantes no son precedidas por un símbolo de dólar ($) Las constantes sólo pueden ser definidas usando la función define() , nunca por simple asignación Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos • • • Las constantes pueden ser definidas y accedidas sin tener en cuenta las reglas de alcance del ámbito Las constantes no pueden ser redefinidas o eliminadas después de establecerse Las constantes sólo pueden albergar valores escalares I.2.5.1.4 Funciones Una función se puede definir con la siguiente sintaxis: <?php function foo ($arg_1, $arg_2, ..., $arg_n) { echo "Funci&oacute;n de ejemplo.\n"; return $retval; } ?> Figura I.2.14 Sintaxis para la definición de una función Cualquier instrucción válida de PHP puede aparecer en el cuerpo de la función. PHP no soporta la redefinición de funciones previamente declaradas. PHP soporta pasar parámetros por valor (el comportamiento por defecto), por referencia, y parámetros por defecto. Listas de longitud variable de parámetros sólo están soportadas en PHP4 y posteriores. Por defecto, los parámetros de una función se pasan por valor (de manera que si cambias el valor del argumento dentro de la función, no se ve modificado fuera de ella). Si se quiere que un parámetro de una función siempre se pase por referencia, se antepone un símbolo & al nombre del parámetro en la definición de la función. Una función puede definir valores por defecto para los parámetros escalares estilo C++: <?php function makecoffee ($type = "cappucino") { return "Hacer una taza de $type.\n"; } echo makecoffee (); echo makecoffee ("espresso"); ?> Figura I.2.15 Ejemplo de valores por defecto para parámetros de una función La salida del fragmento anterior es: Hacer una taza de cappucino. Hacer una taza de espresso. El valor por defecto tiene que ser una expresión constante, y no una variable, miembro de una clase ó llamada a una función. Destacar que cuando se usan parámetros por defecto, estos tienen que estar a la derecha de cualquier parámetro sin valor por defecto; de otra manera las cosas no funcionarán de la forma esperada. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 41 I Memoria Los valores se retornan usando la instrucción opcional return. Puede devolverse cualquier tipo de valor, incluyendo listas y objetos. No puedes devolver múltiples valores desde una función, pero un efecto similar se puede conseguir devolviendo una lista: <?php function small_numbers() { return array (0, 1, 2); } list ($zero, $one, $two) = small_numbers(); ?> Figura I.2.16 Retornando una matriz para obtener múltiples valores Para retornar una referencia desde una función, se tiene que usar el operador de referencias & tanto en la declaración de la función como en la asignación del valor de retorno a una variable: <?php function &returns_reference() { return $someref; } $newref =& returns_reference(); ?> Figura I.2.17 Retornando una referencia desde una función PHP soporta el concepto de funciones variable, esto significa que si una variable tiene unos paréntesis añadidos al final, PHP buscará una función con el mismo nombre que la evaluación de la variable, e intentará ejecutarla: <?php function foo() { echo "En foo()<br>\n"; } function bar($arg = '') { echo "En bar(); el argumento fue '$arg'.<br>\n"; } // Función que envuleve a la función echo function echoit($string) { echo $string; } $func = 'foo'; $func(); // Llama a foo() $func = 'bar'; $func('test'); // Llama a bar() $func = 'echoit'; $func('test'); // Llama a echoit() ?> Figura I.2.18 Ejemplo de función variable 42 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos I.2.5.2 Funcionalidades PHP facilita en gran medida las operaciones típicas que se pueden necesitar a la hora de programar una página que genere código HTML de forma dinámica. Funciones típicas que se usan son acceso a bases de datos, envío de correo electrónico, transferencia de ficheros, etc. Se expone a continuación algunos detalles de las funciones que se han comentado. I.2.5.2.1 Acceso a bases de datos Se podrá consultar cualquier motor de bases de datos SQL, bien en modo nativo o mediante ODBC. Existe soporte para MySQL, PostgreSQL, mSQL, Informix, Internase, SQL Server, Oracle, Solid, Sybase o trabajar con fichero DBF. Hay que hacer notar que no todos los binarios precompilados en los que se distribuye PHP estén compilados con soporte a todas las bases de datos. En tal caso deberíamos compilar las fuentes de PHP incluyendo el soporte que se quiere. El gestor de base de datos más utilizado es MySQL debido a su simplicidad y rapidez frente a la solidez de PostgreSQL. Se pueden encontrar tanto tutoriales para usar MySQL con PHP [19] como ejemplos de su uso [20]. I.2.5.2.2 Envío de correo electrónico Se puede enviar correo electrónico o bien leyendo los datos del cliente en un formulario Web, o bien ejecutando una aplicación de correo en el propio cliente. I.2.5.2.3 Transferencia de ficheros PHP permite la transferencia de ficheros, de manera que el cliente pueda actualizar desde su navegador las páginas de su sitio. También proporciona una serie de funciones para poder dialogar con un servidor FTP y realizar las operaciones habituales. I.2.5.3 Ventajas de usar PHP Se señalan algunas de las razones de por qué escoger PHP frente a otras alternativas para desarrollos Web: • • • • • • Es muy fácil de aprender si se conocen lenguajes como C, Java, o programación en Shell de Unix. Se puede hacer cualquier cosa con PHP Ampliamente probado como herramienta. Se puede usar en cualquier plataforma. Existen numerosas Web donde encontrar ayuda a problemas que se puedan presentar aunque no tenga soporte comercial. Existen recursos en la Web. Existen bibliotecas de clases que resuelven los problemas más frecuentes con los que se puede encontrar el programador. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 43 I Memoria • • No requiere muchos recursos: puede funcionar en un portátil 486 con 16Mb de RAM. La gran mayoría de alojamientos Web ofrecen soporte para PHP. I.2.5.4 Software necesario Se quiere usar PHP para ejecutar scripts en el lado del servidor. Se necesitan tres cosas para que funcione. El analizador PHP (CGI ó módulo), un servidor web y un navegador. Algunos servidores web son Apache en Linux y MacOS X ó IIS en Windows. Se tienen dos maneras de utilizar PHP. Existen módulos directos (también llamados SAPI) para muchos servidores web, como Apache [44], Microsoft Internet Information Server, Netscape e iPlanet. Muchos otros servidores soportan ISAPI. Si PHP no soporta un módulo para el servidor web, siempre se puede usar como binario CGI. Esto significa que el servidor se configura para usar el ejecutable para línea de comandos de PHP en el procesado de peticiones de ficheros PHP. Existen soluciones para instalar un servidor web, PHP y MySQL sobre Windows [6] [7]. Es software gratuito. Como entorno de desarrollo existen numerosas opciones aunque no todas son gratuitas. Un buen entorno de desarrollo es por ejemplo PHP Designer [45]. I.2.6 Hojas de estilo Hojas de Estilo en Cascada (Cascading Style Sheets) [22], es un mecanismo simple que describe cómo se va a mostrar un documento en la pantalla, o cómo se va a imprimir, o incluso cómo va a ser pronunciada la información presente en ese documento a través de un dispositivo de lectura. Esta forma de descripción de estilos ofrece a los desarrolladores el control total sobre estilo y formato de sus documentos. CSS se utiliza para dar estilo a documentos HTML y XML, separando el contenido de la presentación. Los estilos definen la forma de mostrar los elementos HTML y XML. CSS permite a los desarrolladores Web controlar el estilo y el formato de múltiples páginas Web al mismo tiempo. Cualquier cambio en el estilo marcado para un elemento en la CSS afectará a todas las páginas vinculadas a esa CSS en las que aparezca ese elemento. La especificación CSS pertenece al W3C. Este organismo ofrece un gran soporte para CSS en la página Web dedicada a hojas de estilo [24]. También ofrece un servicio de validación de CSS [33]. Para tener una idea general de qué es y cómo funciona CSS podemos recurrir a la guía breve de CSS que nos ofrece el W3C [23]. También podemos encontrar guías de otros organismos para CSS [26] o incluso guías desarrolladas por terceras personas [27] Si queremos ver cómo funciona mediante un ejemplo podemos encontrar numerosos sitios Web donde nos explican detalladamente los ejemplos [28] [29]. 44 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC Fundamentos teóricos I.2.6.1 Marcado del documento HTML Los documentos HTML deben seguir el estilo marcado en las hojas de estilo. Para ello se debe marcar el documento HTML con etiquetas análogas a las etiquetas HTML, marcando de esta manera bloques sobre los que se aplicará un estilo. Básicamente el marcado de los documentos consiste en el uso de dos elementos o etiquetas, que son SPAN y DIV. A cada elemento se le puede asignar uno de los posibles atributos, que son CLASS e ID. Los atributos son una manera de dar nombre a los elementos de manera que se puedan distinguir. Si se quiere que varios elementos tengan el mismo nombre tendremos que usar un atributo CLASS. Si el nombre del elemento va a ser único en todo el documento entonces se puede asignar un atributo ID. Una explicación en mayor detalle de cómo enlazar el estilo con un documento HTML se puede encontrar el la Web [31]. Una vez que se tiene marcado nuestro documento HTML, el W3C nos ofrece un servicio Web para la validación del marcado del documento [32]. I.2.6.2 Ejemplos de CSS Con CSS se tiene un control absoluto sobre la presentación de la información contenida en el documento HMTL y permite una gran facilidad en el cambio de su aspecto con tan solo modificar el archivo de estilo. Un buen ejemplo que muestra la flexibilidad y la potencia de las hojas de estilo es un sitio Web donde se presenta un documento HTML que podemos ver en diferentes estilos con tan solo pulsar uno de los posibles estilos [25]. Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC 45 I Memoria 46 Conversión de aplicación empresarial para permitir el acceso remoto usando PocketPC y PC