Download Sede Trelew Primer cuatrimestre de 2014 1 Aplicaciones Web
Document related concepts
no text concepts found
Transcript
Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Cliente - servidor Aplicaciones Web HTTP Clase 2 Diego C. Martínez Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Universidad Nacional de la Patagonia San Juan Bosco Tecnologías del lado del cliente HTML XHTML CSS JavaScript DOM Más relacionado con la presentación de información © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Cliente - servidor Servidores Web El Servidor Web es el encargado de recibir los pedidos HTTP y realizar el procesamiento necesario para devolver una respuesta HTTP. En general todos se organizan de forma similar... esperar conexion recibir mensaje HTTP procesar pedido HTTP ports aplicaciones Tecnologías del lado del servidor CGI Scripts Perl PHP Java Más relacionado con el procesamiento de información © Diego C. Martínez - DCIC-UNS docroot generar respuesta HTTP enviar mensaje HTTP La funcionalidad general es compleja: pueden agregarse extensiones, filtros, hosts virtuales, directivas de seguridad a diversos niveles, etc. © Diego C. Martínez - DCIC-UNS 1 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Servidores Web Servidores Web En su expresión más simple, el servidor es básicamente un servidor de documentos: busca, identifica y retorna documentos, usualmente HTML. request 80 request 80 código Documentos Los documentos que recibe el cliente no existen textualmente en el servidor. Son generados de acuerdo a código residente en el servidor. Pero siguiendo este esquema, el origen de la respuesta siempre es estático. La web en sus origenes : "page replacement" Sin embargo, en muchos casos es deseable consultar información que es fruto de un procesamiento previo: consultas a bases de datos, respuestas a formularios, consultas a otros sistemas etc. El cliente solicita entonces el programa que debe ejecutarse, no el documento que debe entregarse. ¿Como permitir que clientes remotos puedan ejecutar aplicaciones, enviarles información para su procesamiento y recibir el resultado correspondiente? Se podría utilizar el mismo protocolo para “ejecutar programas a distancia”... © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Server Side Includes Server Side Includes Los Server Side Includes (SSI) son directivas que se incluyen en las páginas HTML, dirigidas al servidor para algún procesamiento específico antes de retornar ese documento al cliente. La idea es incluir alguna información dinámica en una página creada estáticamente. La estructura de una directiva es: <!--#directiva parametro=valor parametro=valor --> Algunas directivas comunes: <!--#set var="cost" value="\$100" --> <!--#if expr="test_condition" --> <!--#elif expr="test_condition" --> <!--#else --> <!--#endif --> Debe indicarse específicamente qué archivos seran preprocesados en búsqueda de tags SSI. La extensión habitual es shtml. En Apache puede utilizarse XBitHack para independizarse de la extensión. <!--#echo var="DATE_LOCAL" --> No todos los servidores aceptan SSI. <!--#config timefmt="%A %B %d, %Y" --> Hoy es <!--#echo var="DATE_LOCAL" --> Aunque es tecnología vieja, todavia se usa con frecuencia cuando el balance estático-dinámico en la página lo justifica. Ultima modificacion: <!--#flastmod file="index.html" --> <!--#include virtual="/footer.html" --> <!--#printenv --> © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 2 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 CGI Scripts Common Gateway Interface CGI (Common Gateway Interface) es un estándar que establece una interfaz entre aplicaciones externas y servidores de información, como HTTP o FTP. Básicamente es un mecanismo que permite a todo el mundo ejecutar un programa determinado, residente en un servidor de información. Por este hecho se les suele denominar aplicación CGI, o scripts CGI. Datos Rob McCool Esto requiere algunas consideraciones de seguridad. Por ejemplo, usualmente las aplicaciones a ejecutarse se mantienen en directorios fuera del alcance normal. Cliente Servidor Applicación Como es un estándar de interfaz, cualquier programa puede ejecutarse como aplicación CGI: puede ser implementado en C, C++, Fortran, PERL, Unix Shell, etc. La particularidad es que no utiliza la línea de comandos para recibir información, sino variables de entorno... QUERY_STRING es todo lo que sigue luego del primer ? del URL. PATH_INFO es la ruta para información adicional que puede requerir la aplicación. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS CGI CGI Scripts - Perl La aplicación CGI recibe los datos en forma de variables de entorno y simplemente escribe sus resultados en la salida estándar. Uno de los lenguajes más populares para la implementación de aplicaciones CGI es Perl, creado en 1987 por Larry Wall. Sin embargo, debe hacerlo sabiendo que el receptor directo es el servidor. Esto implica que debe escribir unos headers antes: El nombre Perl es una derivación de pearl (perla en inglés). Por ejemplo, para enviar HTML debe escribirse: Content-type: text/html <HTML><HEAD> <TITLE>Titulo</TITLE> </HEAD><BODY> ... </BODY></HTML> Para redireccionar a otro documento Content-type: text/html Location: <HTML><HEAD><TITLE>Oops..</TITLE> </HEAD><BODY> ... </BODY></HTML> © Diego C. Martínez - DCIC-UNS Mateo 13:45-46 El Reino de los Cielos se parece también a un negociante que se dedicaba a buscar perlas finas; y al encontrar una de gran valor, fue a vender todo lo que tenía y la compró. Larry Wall a.k.a PERL -- Practical Extraction and Report Language Es un lenguaje de programación dinámico, y el que mayoritariamente contribuyó al titulo de scripts que suelen tener las aplicaciones CGI. http://www.perl.org/ La sintaxis es similar a la del lenguaje C, pero con claras diferencias por la necesidad de ser dinámico. © Diego C. Martínez - DCIC-UNS 3 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 CGI – Perl - ejemplos CGI - Perl HTML <form method="post" action="http://localhost/cgi-bin/mostrar.pl" > Texto: <input type="text" name="mitexto"><br> <input type="submit" value="Enviar"> <input type="reset" value="Limpiar"> </form> #!c:\Program Files\Perl\bin\perl.exe $inputlength=$ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$inputlength); ($name,$value)=split /=/,$formdata; print "Content-type: Content type: text/html\n"; text/html\n ; print "\n"; print " <HTML> <HEAD> <TITLE>Resultados:</TITLE> </HEAD> <BODY> <H1>Esto es lo que se ha ingresado:</H1> <BR> $name = $value </BODY> </HTML>"; Algunas características generales de Perl: Perl es Open Source (GPL). Al ser dinámico no requiere declaración de variables. Puede realizar entrada y salida estándar o comunicarse con un servidor via la interfaz CGI (usando filehandles, como STDIN). Las variables comienzan con el símbolo $ (eventualmente tambien % o @) . Es fácil definir arreglos y tablas hash simples. Provee librerias para el acceso a bases de datos Admite muchas características de la orientación a objetos. Posee buen soporte para la utilización de expresiones regulares. Mucha ayuda, libros, tutoriales. Script CGI (PERL) © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS CGI y Java Programación del lado servidor – otro modelo El estándar CGI sugiere que cualquier aplicación escrita en cualquier lenguaje puede actuar como script CGI. El estándar CGI establece el vínculo entre el servidor web y una aplicación externa que recibe y procesa datos. Algunos lenguajes pueden presentar obstáculos, como en Java: Las aplicaciones Java no pueden ejecutarse como cualquier otra aplicación. Java no tiene acceso general al entorno. El uso popular de Perl y la técnica de SSI derivaron con el tiempo en nuevas tecnologías para la programación del lado servidor. Una forma de solucionar esto es construir un shell script que administre la interacción Java – WebServer: recolecta los datos de entorno y se los envía a la aplicación Java. Sin embargo, es algo contraproducente. Java propone una arquitectura aparte para sus aplicaciones del lado servidor y ésa debería usarse. © Diego C. Martínez - DCIC-UNS Otra aproximación para lograr dinamismo en las páginas web es “incluir” el intérprete en el servidor (al estilo CGI) y procesar documentos con tags incrustados en su contenido (a la manera de SSI). <HTML> <HEAD> <TITLE>Pagina</TITLE> </HEAD> <BODY> <H1>Encabezado</H1> <BR> Bla bla bla <tagespecial ..codigo en algun lenguaje... tagespecial> </BODY> </HTML> © Diego C. Martínez - DCIC-UNS 4 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Procesando una respuesta – Server Side Includes Programación del lado servidor – otro modelo HTML con directivas incrustadas (SSI) Parsing + ejecución de directivas request Preprocesado 80 Documentos con código incrustado Las directivas son indicaciones puntuales al servidor sobre procesamientos simples HTML <!--#directiva parametro=valor --> No ofrecen las estructuras de datos ni de control de un lenguaje de alto nivel. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Procesando una respuesta – Aplicaciones CGI Procesando una respuesta – Scripting Aplicación HTML con directivas incrustadas (lenguaje de alto nivel) El servidor es asociado con un intérprete de un lenguaje de alto nivel. Output de la aplicación La aplicación puede estar implementada en cualquier lenguaje de programación moderno. La integración con el servidor es simple pero rústica, por medio de la entrada-salida estándar :( Ejecución de la aplicación en el S.O. El lenguaje l j de d script i t puede d utilizarse tili directamente en los documentos HTML Parsing + ejecución de directivas de I té Intérprete t procesamiento Las directivas de procesamiento son ahora segmentos de código. Se dispone de estructuras de control y datos de un lenguaje de alto nivel. Mayor poder de procesamiento. HTML La aplicación no necesariamente está basada en tecnologías para la web o Internet. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 5 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 PHP PHP El lenguaje PHP surge en 1995 bajo el nombre PHP/FI, creado por Rasmus Lerdorf. Los archivos que contienen tags con código PHP residen en el servidor, con extensión .php y se ejecutarán en cuanto son solicitados. Originalmente Rasmus creó el lenguaje como reemplazo de unos scripts Perl que había hecho para su página personal. PHP significaba “Personal Home Page” y FI “Form Interpreter”. El preprocesador PHP se limita a ejecutar el script. Rasmus Lerdorf El output del programa (el código HTML que nuestro cliente espera) debe ser generado por el script. Podemos pensar que imprimimos en una pantalla que finalmente verá nuestro cliente, al estilo PERL Luego de liberar PHP, junto con Zeev Suraski y Andi Gutmans reecriben el intérprete y nace PHP3 en 1997, siendo testeado publicamente en 1998. La sintaxis es básicamente la misma que la de los lenguajes “parientes” del C... En 1999 reescriben el núcleo de PHP para obtener Zend Engine. Actualmente este es el núcleo de PHP4, la versión que popularizó finalmente a PHP. if (cond) { ... } else { ...} while (cond) { ... } for ($i=1; $i<=5; $i++) do{ { ... ... } while (cond) } En 2004 sale PHP5, con varias modificaciones, entre ellas un mejor modelo de objetos, deficiente en la versión anterior. Hoy es usado por muchos sitios gracias al desarrollo de varios productos, la mayoría GNU: phpBB, WordPress, MediaWiki, Joomla, Mambo, etc. Visitar: Probar, bajar, instalar!! © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS PHP PHP Si bien TODO el archivo es considerado “ejecutable”, las sentencias específicas de PHP se encierran con tags especiales. Todo código restante HTML se envía tal cual al cliente. Tag inicial Tag final <?php ?> <? ?> <script language=”php”> ?> <% %> <html> <head> <title>Ejemplo</title> </head> <body> <?php echo “Hola Mundo!"; ?> </body> </html> <html> <head> <title>Ejemplo</title> </head> <body> Hola Mundo! </body> </html> hola.php Resultado recibido por el cliente © Diego C. Martínez - DCIC-UNS http://ar.php.net/manual/es/ El script .php no necesariamente debe incluir código HTML... <?php echo "<HTML>"; echo "<TITLE>Ejemplo</TITLE>"; echo "<BODY>"; echo "Hola Mundo!"; if date('w')==6 { echo "Hoy es sabado"; } else { echo "Hoy Hoy no es sabado";} sabado ;} echo "</BODY></HTML>"; <HTML> <TITLE>Ejemplo</TITLE> <BODY> Hola Mundo! Hoy no es sabado </BODY> </HTML> Resultado recibido por el cliente ?> todophp.php El exceso de mezcla HTML-PHP en general no es adecuado para aplicaciones grandes, pues es dificil de mantener. Veremos luego qué técnicas se utilizan para poner orden en este sentido. © Diego C. Martínez - DCIC-UNS 6 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 PHP PHP PHP es muy flexible en la utilización de las variables, cuyo contenido puede ser interpretado como dato o parte de código. Debido a su tratamiento es que todas deben empezar con $. Pueden implementarse funciones... <?php function cuadrado($num) <?php function foo() { echo "Hola Foo!"; } function bar($arg = '') { echo "Hola Bar! El argumento es '$arg'"; } function echoit($string) { echo $string; } { return $num*$num; } $cartel1 = "El cuadrado de "; $cartel2 = " es "; $numero=4; echo echo echo echo $cartel1; $numero; $cartel2; cuadrado($numero); echo "<BR>"; $numero=10; echo $cartel1.$numero.$cartel2.cuadrado($numero); $func = 'foo'; $func(); // Esto invoca a foo() $func = 'bar'; $func('test'); // Esto invoca a $func = 'echoit'; $func('test'); // Esto invoca a ?> bar() echoit() ?> PHP posee varias operaciones para manipular strings y arreglos. Muchas paginas interesantes pueden hacerse con estos dos elementos solamente... © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS PHP PHP $arch = "accidentes.dat"; $archivo = file($arch); $cant = count($archivo); echo "<table border=0>"; $indice=0; while ($indice < $cant) { $reg = explode("|-|",$archivo[$indice]); /* [0]nombre - [1]sector - [2]accidentes */ Karl|-|7G|-|2 Lenny|-|7F|-|4 Smithers|-|1A|-|0 Homero|-|7G|-|723 accidentes.dat echo "<tr>"; echo "<td> $reg[0] </td><td> $reg[1] </td><td> $reg[2] </td>; echo "</tr>"; $indice++; } echo "</table>"; PHP provee soporte para accesos a bases de datos... $db = @mysql_connect($dbhost, $dbuser, $dbpass); $query="SELECT * FROM empleados ORDER BY legajo"; $result=mysql_query($query); if($result) { $cant = mysql_num_rows($result); for($j=0;$j<$cant;$j++){ $nombre=mysql_result($result,$j,'nombre'); $legajo=mysql_result($result,$j, $legajo=mysql result($result $j 'legajo'); legajo ); } } Existen muchas librerias gratuitas que pueden facilitar el acceso a una base de datos, encapsulándola en un objeto con una interfaz específica. También es fácil escribir en un archivo... $fh=fopen("unarchivo.dat","a"); fwrite($fh,"esto se escribe"); fclose($fh); © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 7 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 PHP - clases PHP Las clases se definen de manera similar a Java. <?php class A { public $var = ‘un valor'; function funcion1() //codigo } function funcion2() //codigo } { { } Los objetos se crean con la palabra reservada new y el acceso a los miembros de los objetos es por medio del operador -> Para referenciar el objeto actual se utiliza la pseudovariable $this. // Declaración de método public function displayVar(){ echo $this->var; } <?php include("simpleclass.php"); $a = new SimpleClass(); $a->displayVar(); $a->var = "Chau Mundo"; $a->displayVar(); ?> } ?> holachau.php No se aplican las reglas de ámbito tradicionales (como en Pascal). Debe indicarse explicitamente que datos pueden accederse globalmente: ?> <?php class SimpleClass { // Declaración de atributo public $var = ‘Hola Mundo!'; simpleclass.php En PHP4, solo las constantes se inicializaban en la declaración global $dato1; © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS PHP - $this PHP – objetos y asignaciones <?php class A { function foo() { if (isset($this)) { echo '$this is defined ('; echo get_class($this); echo ")<br>"; } else { echo "\$this is not defined."; } } } Al asignar un objeto ya creado a una nueva variable, está ultima estará asociada al objeto original. Así funciona también en el pasaje de parámetros. Esto es semántica por referencia. Esto ha causado algo de confusión. En PHP4 una asignación del tipo $objeto1 = $objeto2 Causa una clonación de objetos, puesto que la semántica de manipulación que prevalece es la de por valor. Para obtener el efecto “referencia” debe hacerse $ bj t 1 =& $objeto1 & $objeto2 $ bj t 2 class B { function bar() A::foo(); } } ... { Salida en el browser En PHP5 la asignación “=“ tiene un efecto igual a la asignación de Java. La asignación “=&” se interpreta como la definición de un alias para el mismo objeto (NO es una referencia!) $this is defined (a) $this is not defined. $this is defined (b) $this is not defined. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 8 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 PHP – objetos y asignaciones PHP - herencia Parte de la confusión inicial… La herencia se denota con la palabra reservada extends. PHP no admite herencia múltiple. <?php $instance = new SimpleClass() $assigned = $instance; $reference =& $instance; $instance->var = '$assigned will have this value'; $instance = null; // $instance and $reference become null var_dump($instance); var_dump($reference); var_dump($assigned); ?> Output en el browser NULL NULL object(SimpleClass)#1 (1) { ["var"]=>string(30) "$assigned will have this value" } Los métodos y miembros heredados pueden redefinirse, a menos que el ancestro incluya la palabra reservada final. Una clase también puede ser final. Es posible acceder a métodos de la clase padre por medio del prefijo parent:: <?php class SimpleClass { // Declaración de atributo public $var = 'Hola Mundo!'; // Declaración de método public function displayVar() { echo $this->var; } } ?> <?php class ExtClass extends SimpleClass { function displayVar(){ //redefinición echo “Heredando…\n"; parent::displayVar(); } } $extended = new ExtendClass(); $extended->displayVar(); ?> PHP también permite clases abstractas e interfaces. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS PHP - constructores PHP - atributos Los constructores deben tener el siguiente encabezado: Los atributos pueden ser públicos, privados o protegidos. void __construct ( [mixed args [, ...]] ) <?php class BaseClass { function __construct() { print "In BaseClass constructor\n"; } } class SubClass extends BaseClass { function __construct() { parent::__construct(); print "In SubClass constructor\n"; } } Los atributos privados no se heredan, por lo que un intento de acceso a ellos queda indefinido. Los métodos pueden tener los mismos modificadores de visibilidad, con el mismo significado significado. function echo echo echo } printHello() { $this->public; $this->protected; $this->private; } $obj = new MyClass(); echo $obj->public; // Funciona OK! echo $obj->protected; // Error fatal echo $obj->private; // Error fatal $obj->printHello(); // Muestra todos $obj = new BaseClass(); $obj = new SubClass(); ?> © Diego C. Martínez - DCIC-UNS <?php class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; ?> © Diego C. Martínez - DCIC-UNS 9 Aplicaciones Web UNPSJB - Sede Trelew PHP – accesos estáticos El operador :: ( פעמיים נקודתיים- Paamayim Nekudotayim) se utiliza para acceder entidades estáticas, constantes y métodos redefinidos estáticos (static). Primer cuatrimestre de 2014 PHP – comparaciones Existen dos operadores: <?php class MyClass { const CONST_VALUE = 'A constant value'; } == Los objetos son iguales si poseen los mismos atributos y son instancias de la misma clase. echo MyClass::CONST_VALUE; ?> === Las variables de objeto son idénticas si y sólo si refieren a la misma instancia de la misma clase. Las palabras self y parent, parent se usan para poder acceder a miembros o métodos desde dentro de una definición de clase <?php class OtherClass extends MyClass { public static $my_static = 'static var'; public static function doubleColon() { echo parent::CONST_VALUE . "\n"; echo self::$my_static . "\n"; } } © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS PHP – Acceso a variables de entorno Session tracking En PHP el acceso a algunos datos del entorno se realiza por medio de algunos arreglos especiales, denominados superglobales, entre ellos: Hemos mencionado que HTTP es un protocolo sin estado (stateless protocol). 1) El browser abre una conexión HTTP al servidor web. $_SERVER Variables del servidor. Algunos datos que contiene: PHP_SELF, SERVER_ADDR, SERVER_NAME, QUERY_STRING, REMOTE_ADDR, etc 2) El browser envía el pedido HTTP. $_ENV Similar al paso de datos en CGI. 4) La conexión entre el servidor y el browser se cierra. $_GET Información sobre los datos pasados al script desde HTTP GET GET. Esto significa que el servidor no puede reconocernos entre requerimientos múltiples. Sin embargo, es posible lograr una identificación gracias a algunas té i técnicas adicionales. di i l $_POST Información sobre los datos pasados al script desde HTTP POST. Esto se conoce como session tracking. $_FILES Información sobre los archivos pasados al script desde HTTP POST. 3) El servidor responde al pedido y envía la respuesta. La implementación depende de cada servidor en particular, y del lenguaje de programación asociado. $_SESSION Contiene las variables de sesión disponibles para el script actual. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 10 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Session tracking Session tracking Básicamente, consiste en asignar un identificador de sesión a cada requerimiento... Básicamente, consiste en asignar un identificador de sesión a cada requerimiento... El servidor asigna un identificador de sesión y lo comunica al cliente. Los clientes comunican su identificador de sesión al volver a requerir algo al servidor session_id: ABC request request 2 session_id: ABC session_id: DEF session_id: ABC session_id: ABC session_id: DEF response response © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Session tracking Session tracking Al identificar las sesiones, puede mantener datos relacionados con cada una, con los cuales el cliente puede interactuar. El servidor almacena localmente los identificadores de sesión y las variables asociadas. Se denominan variables de sesión. El cliente debe “recordar” de alguna forma su número de sesión si es que desea ser recordado por el servidor. Todo este proceso puede lograrse usando cookies o URL-rewriting. crea cant session_id: ABC cant: 1 cant = 1 session_id: DEF cant:2 COOKIES Una cookie es un fragmento de texto enviado desde el servidor al navegador del cliente. Este fragmento es almacenado del lado cliente y devuelto al servidor en cada consulta posterior. En general se usa para la autenticación, el rastreo de sesión, la personalización, etc. request response + cookie request + cookie © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 11 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Cookies Cookies Una cookie tiene un nombre que la identifica y el identificador de sesión correspondiente. Tienen también un tiempo de vida asociado. Desventajas generales de las cookies: HTTP/1.1 200 OK Server: Netscape-Enterprise/4.0 Date: Fri, 23 Mar 2003 02:06:48 GMT Set-Cookie: GXHC_gx_session_id_AppName=511f4caec5a335ee Content-type: Text/HTML; charset=Shift_JIS Connection: close ... GET /MyApplication/myPage.jsp HTTP/1.1 ... User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) Host: 127.0.0.1:8080 Cookie: GXHC_gx_session_id_AppName=511f4caec5a335ee ... Bajo nivel de identificación: las cookies se asocian a un browser y un servidor y son privadas a esa conexión. Intercambio de información sensible: los datos contenidos en la cookie son susceptibles al robo (i.e. sniffing) Cookie poisoning: modificación de los datos en la cookie por parte del cliente, que es interpretada naturalmente por el servidor. Estado inconsistente: la cookie no siempre refleja el estado de los datos comunicados por el cliente y el servidor (i.e. Back button). En PHP las cookies se acceden por medio de $_COOKIE © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS URL-rewrite File-uploads Es posible que el browser no admita cookies, lo que impide el modelo de rastreo de sesiones anterior. Para lograr el mismo objetivo, es necesario utilizar el URL. Lo que hace el servidor es agregar el identificador de sessión como parte del query string... <a href="pagina.php?PHPSESSID=F513fad624vDx3">Visita la siguiente página</a> Si la variable de PHP session.use_trans_sid tiene el valor “0”, entonces habrá que generar el query string explícitamente... <a href="pagina.php?<?echo session_name()."=".session_id()?>">Visita la siguiente página</a> © Diego C. Martínez - DCIC-UNS Otra variable superglobal comunmente utilizada es $_FILES, en donde se obtienen los datos de un archivo recientemente subido al servidor. <input type="file" name="file" id="file" /> <input type="submit" name="submit" value="Submit" /> De acuerdo al protocolo HTTP, el servidor almacenará temporalmente el archivo a medida que sea subido. El script es el responsable de retirar ese archivo del lugar temporal para ubicarlo en el directorio deseado. Archivo subido: $_FILES["file"]["name"] Tipo del archivo subido: $_FILES["file"]["type"] Tamaño del archivo subido: $_FILES["file"]["size"] (bytes) Almacenado temporalmente en: $_FILES["file"]["tmp_name"]; © Diego C. Martínez - DCIC-UNS 12 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Procesando XML PHP avanzado PHP es un lenguaje de script creado y orientado para la programación web. La especificación XML asume que el documento será procesado de manera especial Posee muchas librerías base y muchas extensiones que facilitan procesamientos comunes. Podemos examinar nuestra configuración usando: <?php phpinfo(); ?> PHP Core apache2handler Apache Environment HTTP Headers Information bcmath calendar com_dotnet ctype date dom exif filter ftp gd gettext hash iconv imap json lib l libxml mbstring mcrypt mime_magi c ming mssql mysql mysqli odbc paradox pcre pdf PDO pdo_mssql pdo_mysql pgsqll ps Reflection session SimpleXML soap sockets SPL SQLite standard tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl Zend Optimizer zip zlib Additional Modules Environment PHP Variables PHP License documento XML procesador XML aplicación tree-based processing event-based processing también conocido como DOM Parser también conocido como SAX Parser representación arbórea fácil read-write consumo de memoria operación secuencial menor consumo de memoria más fáciles de implementar más complejos y de mayor esfuerzo para el programador Veremos algunas funcionalidades interesantes para el desarrollo web... © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Procesando XML - SAX Procesando XML - SAX SAX significa Simple Acess for XML. Es un parser para XML basado en eventos. No existe una especificación formal, pero la implementación Java es referencial. SAX Parser aplicación SAX opera sobre el documento en forma secuencial. Notifica a la aplicación de eventos durante el procesado del XML. start document • Es más natural para aplicaciones no muy centradas en XML • Es más eficiente en recursos que la aproximación DOM start element • La aplicación puede comenzar a procesar el XML mientras el parser lo lee caracteres end element • No puede navegarse por el documento con la misma libertad que DOM end document • La aplicación debe registrar los eventos en los que está interesada. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 13 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Procesando XML - SAX <?xml version="1.0"?> <saludo> <texto> Hola Mundo! </texto> </saludo> PHP y DOM 1. start document 2. start element: saludo En PHP5 se incluye una extensión para usar una interfaz DOM. Es una mejora de la extensiòn domxml de PHP4. Es un API orientada a objetos. Implementa completamente DOM Core Level 2 y parcialmente DOM Core Level 3 3. start element: texto 4. characters: Hola Mundo! 5. end element: texto 6. end element: saludo 7. end document La aplicación debe registrar funciones call-back para atender estos eventos. public void startElement(String uri, String localName, String qName, Attributes attributes) public void endElement(String uri, String localName, String qName) public void characters(char[] ch, int start, int length) Ofrece las siguientes clases, entre otras: DOMDocument Representa el documento XML o HTML completo. DOMNodeList DOMN d Li t Contenedor de nodos, accesibles por nombre o indice DOMElement Representa un nodo XML. DOMText Representa dato en formato texto DOMAttr Representa un nodo atributo. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS PHP y DOM PHP y DOM El primer paso es crear el documento DOM: $midoc = new DOMDocument(”1.0”); Luego puede construirse un árbol via DOM API, o cargar un XML: $midoc->load(”datos.xml”,$opcionParser); $midoc->loadXML($stringXML,$opcionParser); Las opciones p p para el p parser p pueden ser,, entre otros: LIBXML_NOBLANKS, LIBXML_NOERROR, LIBXML_NOWARNING, LIBXML_DTDLOAD, LIBXML_NOENT, LIBXML_XINCLUDE La carga del documento XML implica un control de que el documento esté bien formado, por lo que cargar un HTML no necesariamente será exitoso. Para eso existe otra función: $midoc = new DOMDocument(); $midoc->loadHTMLFile('http://www.sitio.com/index.html'); $midoc = DOMDocument::loadHTMLFile('http://www.sitio.com/index.htm'); El documento está representado por un objeto DOMDocument. Para obtener el xml oculto puede utilizarse la operación saveXML(). XML() $xml_string = $midoc->saveXML() Para guardar el xml oculto puede utilizarse la operación save(). Otra forma es invocar estáticamente las funciones, generando un objeto DOMDocument: $midoc = DOMDocument::load($archivo,$opcs); $midoc = DOMDocument::loadXML($string,$opcs); © Diego C. Martínez - DCIC-UNS $bytes = $midoc->save(“archivo_nuevo.xml”) $html = $htmldoc->saveHTML(); $bytes = $htmldoc->saveHTMLFile('index.html'); © Diego C. Martínez - DCIC-UNS 14 Aplicaciones Web UNPSJB - Sede Trelew PHP y DOM Primer cuatrimestre de 2014 PHP y XML - Validación Dado que es una implementación del DOM, la forma de navegar el árbol cumple con los nombres de la interfaz. Es posible realizar una validación del documento XML cuando el DTD o XML Schema están disponibles. Si el DTD está en un documento aparte, debe indicarse explícitamente su carga. $raiz = $dom->documentElement; $nodo = $raiz->firstChild; $mixml->load("peliculas.xml", LIBXML_DTDLOAD); $esvalido = $mixml->validate(); $nombre = $nodo->nodeName; $contenido = $nodo->nodeValue; $nodo = $doc->getElementById($id); $nodos = $doc->getElementsByTagName($tag); $hijos = $nodo->childNodes; Para validar utilizando XML Schemas, es necesario proveer el esquema correspondiente, di t ya sea como archivo hi o como string ti $esvalido = $dom->schemaValidate($archivo_schema); $esvalido = $dom->schemaValidateSource($string_schema); $nodo->appendChild($otronodo); © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS PHP y XPath SimpleXML La extensión DOM de PHP permite también la utilización de XPath. La funcionalidad está provista por un objetode tipo DOMXPath $domxpath = new DOMXPath($docDOM); Otra forma de manipular un documento XML es por medio de SimpleXML. Es una extensión aparte de la DOM, más simple y directa de utilizar. La clase central se denomina SimpleXMLElement $sxmle = new SimpleXMLElement($string_xml); La operación query() permite obtener del documento una sequencia de nodos. Devuelve siempre un objeto DOMNodeList. $sxmle = simplexml_load_string($string_xml); $sxmle = simplexml_load_file($archivo); $list = $domxpath->query($un $domxpath->query($un_xpath); xpath); En contraste, la operación evaluate() permite obtener datos de tipo Boolean, Integer, String o DOMNodeList. Como nuevamene el XML se “esconde” dentro de un objeto, para obtenerlo se utiliza el método asXML(). $string_xml = $sxmle->asXML() $sxmle->asXML(“nuevo_archivo.xml”) $resultado = $domxpath->evaluate($un_xpath); © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 15 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 SimpleXML Transformaciones XSL El acceso a los elementos del XML es simple: $pelicula = $sxmle->film; Con PHP también es posible realizar transformaciones XSL. La transformación la realiza un objeto de tipo XSLTProcessor La transformación se aplica sobre objetos de tipo DOMDocument $titulo = $sxmle->film->titulo; Haciendo uso de sobrecarga de operaciones, los métodos accedidos del objeto SimpleXMLElement pueden ser un elemento o una colección de elementos. La simpleza de uso radica en esta característica. característica $xsltp = new XSLTProcessor(); $xsltp->importStylesheet( $xsl ); $transf = $xslt->transformToXML( $xml ); La transformación f anterior devuelve un string, pero también es posible transformar f a un objeto DOMDocument o a un URI $transf = $xslt->transformToDoc( $xml ); $transf = $xslt->transformToURI( $xml,”file:///tmp/out.html”); © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Procesando imágenes GD Library Muchas de las imágenes de un sitio web son estáticas. Para incluir en una página HTML una imagen generada dinámicamente, basta con mencionar el recurso que la genera: Sin embargo, es frecuente que sea necesario mostrar alguna imagen personalizada, o dinámica, producto de un cómputo previo de datos (gráficos, captcha, etc). <img src='mi_imagen.php'> PHP provee algunas facilidades para generar imágenes que serán enviadas luego al cliente como una imagen regular. El script creará la imagen por medio de la librería GD en un buffer temporal, que luego será volcado al cliente. La funcionalidad la provee la librería GD Library. Está incluida en PHP desde la versión 4.3 El navegador no distingue la imagen recibida como computada. Para generar una imagen es necesario crearla primero: GD es una librería open source para la creación dinámica de imágenes está escrita en el lenguaje C varios lenguajes poseen wrappers para GD crea imágenes PNG, JPG, GIF, TIFF se utiliza para crear gráficos, diagramas, cuadros y cualquier imagen on the fly. $image=imagecreate( $alto, $ancho ); Esta función devuelve una imagen en blanco como un recurso PHP. Luego se puede comenzar a “dibujar” en esta imagen. Antes de enviarla al cliente y liberar la memoria utilizada, es necesario indicarle al cliente que enviaremos una imagen: header("Content-type: image/png"); © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 16 Aplicaciones Web UNPSJB - Sede Trelew GD Library Algunas funciones comunes: $color = imagecolorallocate($imagen, $r, $g, $b) Crea el color que será utilizado en la imagen $imagen, según el esquema RGB imageline($imagen, $cx1, $cy1, $cx2, $cy2, $color) Dibuja una linea entre las coordenadas indicadas. imagestring($imagen, $font, $cx, $cy, $string, $color) Escribe $string en la coordenada indicada. imagepng($imagen) Devuelve una imagen png al cliente imagejpg($imagen) Devuelve una imagen jpg al cliente imagedestroy($imagen) Libera la memoria ocupada por la imagen durante su construcción Primer cuatrimestre de 2014 Java Java es un lenguaje de programación orientado a objetos, creado en 1990 por Sun Microsystems. Su escenario de trabajo es mayoritariamente el de las aplicaciones distribuídas y la programación en red. Sus premisas iniciales son: Uso de la metodología OO Ejecutar un mismo programa en diferentes SO Soporte para redes de computadoras Diseñado para ejecutar código remotamente con seguridad Fácil de usar Típicos Programas Java: Applets : se ejecutan en browsers, incrustados en páginas web. Applications : se ejecutan directamente sobre la Java Virtual Machine. Servlets: se ejecutan en un servidor que posee un Contenedor Web. Midlets: se ejecutan en la JVM para dispositivos móviles. Cada cual posee una estructura particular, con ciertos métodos específicos. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Plataformas Java2 Java2 Enterprise Edition Java agrupó sus tecnologías en tres ediciones: J2EE, J2SE y J2ME. J2EE se basa en una arquitectura multi-capa para el desarrollo de aplicaciones distribuídas. La división de capas propuesta es la siguiente: Nombre Capa Cliente Quiénes la componen Aplicaciones cliente, applets, aplicaciones y otras GUIs Capa de Presentación JSP, JSP Servlet y otras UIs © Diego C. Martínez - DCIC-UNS Dónde se ubica PC Cliente Servidor J2EE Capa de Negocios EJBs y otros objetos de negocios Servidor J2EE Capa de Integración JMS, JDBC Servidor J2EE Capa de Recursos Bases de Datos, Sistemas Externos Servidor BD © Diego C. Martínez - DCIC-UNS 17 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Vista por capas de una aplicación J2EE Componentes Web J2EE presenta los componentes Web (web components): servlets y Java Server Pages. Máquina cliente Servidor J2EE Servidor BD • Los servlets son clases en Java que procesan pedidos (requests) y construyen respuestas a esos pedidos. • Las páginas JSP son documentos de texto que se ejecutan como servlets pero permiten una aproximación más natural para presentar contenido estático. Enterprise Beans Application Client Dynamic HTML Pages Client Tier JSP Pages Enterprise Beans Web Tier Business Tier Los componentes de negocio (business components) contienen la lógica necesaria para resolver problemas específicos de un dominio de negocios determinado (banking, finanzas) y son implementados por enterprise beans ejecutados en lo que se llama capa de negocios (business tier). © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Java 2 Platform Servlets Los servlets son extensiones a la funcionalidad de un servidor, como un servidor Web. Son módulos de código Java corriendo en un servidor de aplicaciones. Si bien no necesariamente están asociados a un protocolo particular, suelen usarse bajo HTTP (Servlets HTTP) Un servlet está mapeado a uno o más URLs, y cuando el servidor recibe un pedido (request) un método especial en el servlet es invocado y responde a ese pedido. Al estar escrito en Java, puede recibir todos los beneficios del JAVA API y los elementos mencionados anteriormente para J2EE, como JDBC y EJB. Además es portable y altamente reusable. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 18 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Servlet Containers Servlets HTTP Los servlets se alojan e interactúan con un contenedor web (Web Container). Algunos usos típicos de un Servlet HTTP: • Procesar y/o almacenar datos recibidos desde un formulario HTML. Servlet Containers no comerciales: • Proveer contenido dinámico, por ejemplo, mostrar resultados de una consulta a una base de datos al cliente. Apache Tomcat, Enhydra, Java Mini Daemon, Jetty, Winstone • Administrar información de estado sobre las sesiones de los clientes en nuestro sitio, por ejemplo, shopping carts. Servlet Containers comerciales Actualmente existe mucho desarrollo en torno a esta tecnología, más el agregado de JSP. Algunos se encuadran dentro del Proyecto Jakarta, del Apache Group, como Struts. S us BEA WebLogic Server or Weblogic Express B l dE Borland Enterprise t i S Server Caucho Resin Server IBM's WebSphere iPlanet Sun/Netscape Sun Java System Web Server Oracle Application Server Commercial Open Source Servlet Containers Los servlets en realidad ofrecen varias ventajas sobre CGI: • Un servlet no corre en un proceso separado, eliminando el overhead de crear procesos ante pedidos. • Un servlet permanece en memoria entre pedidos. Apache Tomcat JBoss • Existe una única instancia que responde pedidos en forma concurrente. Esto ahorra memoria y permite administrar datos persistentes © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Servlets GenericServlets Un servlet es una instancia de una clase que implementa la interfaz javax.servlet.Servlet. GenericServlet La mayoría de los servlet en realidad extienden la funcionalidad de implementaciones estándar de servlets: javax.servlet.GenericServlet y javax.servlet.http.HttpServlet request service() response Ciclo de vida: Cliente 1. El servlet se inicializa ante el primer pedido (init) Servidor 2. El servlet atiende pedidos y genera respuestas (service). Esto puede provocar la creación de diferentes hilos de ejecución. 3. El servlet es destruido del servidor (destroy). Es fácil ver que un servlet es básicamente la implementación de un servidor en Java! © Diego C. Martínez - DCIC-UNS Para implementar un servlet genérico, basta con heredar de la clase GenericServlet y redefinir el método service() El método service() acepta dos parámetros: un objeto request que informa al servlet del pedido, y un objeto response usado para retornar respuestas. © Diego C. Martínez - DCIC-UNS 19 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 HttpServlets GenericServlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; Los servlets HTTP extienden la clase HttpServlet. Esta clase redefine el método service() para diferenciar entre las peticiones típicas recibidas desde un navegador Web cliente. public class Fecha extends GenericServlet { public void service( ServletRequest request, ServletResponse response ) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); java.util.Date fechita= new java.util.Date(); out.println(fechita); } } El protocolo HTTP define varios tipos de pedidos, pero los más comunes son get() (que obtiene información del servidor, como imágenes) y post() (que envía información al servidor, por ejemplo como resultado del submit de un formulario). La clase HttpServlet define los métodos doGet() y doPost() para responder a estos pedidos. Estos métodos son invocados por service(), el cual determina el tipo de pedido y deriva el flujo de control al método correspondiente. El método service() no debería redefinirse, a menos que debamos implementar pedidos adicionales. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS HTTPServlet Request & Response HttpServlet Servidor Servlet req request request service() service() response doGet() Cliente Servidor doPost() res Cliente Los objetos implementan la interfaz ServletRequest, ServletResponse, HttpServletRequest o HttpServletResponse Algunas operaciones de HttpServletRequest Para implementar un servlet HTTP, basta con heredar de la clase HttpServlet y redefinir los métodos doGet() y/o doPost() Nuevamente se aceptan dos parámetros en cada método: un objeto request que informa al servlet del pedido, y un objeto response usado para retornar respuestas. Cookie[] java.lang.String java.lang.String java.lang.String getCookies() getHeader(java.lang.String name) getQueryString() getMethod() Algunas operaciones de HttpServletResponse void void void java.io.PrintWriter © Diego C. Martínez - DCIC-UNS addCookie(Cookie cookie) addHeader(java.lang.String name, java.lang.String value) setStatus(int sc) getWriter() © Diego C. Martínez - DCIC-UNS 20 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Servlet HelloWorld Java Server Pages public class HelloWorldServlet extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String nombre = request request.getParameter("USER_NAME"); getParameter("USER NAME"); out.println("<html>"); out.println("<head>"); out.println("<title>Hola</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">"); out.println("<h1> Hola "+nombre+"</h1>"); out.println("</body>"); out.println("</html>"); La tecnología JSP (Java Server Pages) usa tags al estilo XML y scriptlets escritos en Java para encapsular la lógica que genera el contenido de la página. Al separar la lógica de el diseño y la presentación, JSP facilita la tarea de construir aplicaciones basadas en la web. Permiten incluir directamente código Java en un documento HTML, de la misma forma que lo permiten otros lenguajes como PHP. Forman una extensión natural a los servlets. De hecho, luego de un preprocesado, las páginas JSP terminan siendo nada más y nada menos que un servlet!. Desde el punto de vista del programador, Servlets y JSP son intercambiables, dependiendo del balance de carga estática y dinámica del documento a generar. } } © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Java Server Pages – pasos en la invocación Java Server Pages - ejemplo HolaVos.jsp Servidor Web request Página JSP <HTML> Hola <I> <%= request.getParameter("nombre") %> </I>! </HTML> Servlet Generado http://localhost/HolaVos.jsp?nombre=Homero Cliente Hola Homero! response © Diego C. Martínez - DCIC-UNS Servlet Compilado © Diego C. Martínez - DCIC-UNS 21 Aplicaciones Web UNPSJB - Sede Trelew Java Server Pages - ejemplo Primer cuatrimestre de 2014 Java Server Pages Además de HTML normal, podemos agregar otro tipo de elementos al documento: Hora.jsp <%@page import=“java.util.Date”%> <HTML> <BODY> Hora actual: <%= new Date().toString() %> </I>! </BODY> </HTML> • Elementos de Script (scriptlets): código Java que se convertirá en parte del servlet resultante luego del preprocesado. • Directivas: elementos que nos permiten controlar la estructura general del servlet resultante. Básicamente, son mensajes al contenedor de servlets. • Acciones: por medio de las cuales especificamos ciertos componentes que deben ser usados en el documento. http://localhost/Hora.jsp • Tags library: un mecanismo de extensión de marcas para crear tags personalizados. Hora actual: Mon Jul 31 10:55:54 GMT+01:00 2006 © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS Java Server Pages Java Server Pages – objetos implícitos Para simplificar los elementos se puede acceder a algunas variables predefinidas, como request en el ejemplo anterior. Existen otros objetos predefinidos o implícitos, con diferentes alcances o ámbitos: Alcance de aplicación application Representa el contenedor que ejecuta la JSP Alcance de página • Alcance de aplicación: Java Server Page y la aplicación contenedora tienen objetos de este ámbito. config Opciones de configuración de la JSP exception La excepción que se pasa a la JSP • Alcance de página: objetos que existen únicamente en la página en la que están declarados. q out Objeto JSPWriter para salida de texto page this p para la instancia actual de la JSP • Alcance de petición: existentes durante el tiempo de vida de una petición (request). pageContext Permite acceso a objetos implícitos response Representa la respuesta al cliente • Alcance de sesión: existentes durante toda la sesión de navegación del cliente. Alcance de petición request Representa la petición del cliente Alcance de sesión session © Diego C. Martínez - DCIC-UNS Representa la información de sesión del cliente © Diego C. Martínez - DCIC-UNS 22 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 JSP – Secuencias de comandos – scripting Las secuencias de comandos (scripting) permite incluir código Java en un documento JSP. Expresión JSP <%= expression %>: La Expresión es evaluada y situada en la salida. El equivalente XML es <jsp:expression> expression </jsp:expression>. Las variables predefinidas son request, response, out, session, application, config, y pageContext. Scriptlet JSP <% code %>: El código se inserta en el método service. El equivalente XML es: <jsp:scriptlet> code </jsp:scriptlet>. Declaración JSP <%! code %>: El código se inserta en el cuerpo de la clase del servlet, fuera del método service. El equivalente XML es: <jsp:declaration> code </jsp:declaration>. JSP – Secuencias de comandos – scripting … <body> <% // iniciar scriptlet String nombre = request.getParameter( "nombrePila" ); if ( nombre != null ) { %> <h1> Hola <%= nombre %>, <br /> ¡Bienvenido a las JavaServer Pages! </h1> <% // continuar scriptlet } // fin de instrucción if else { %> <form action = "bienvenida bienvenida.jsp jsp" method = "get"> get > <p>Escriba su nombre de pila y oprima Enviar</p> <p><input type = "text" name = "nombrePila" /> <input type = "submit" value = "Enviar" /> </p> </form> <% // continuar scriptlet } // fin de instrucción else %> </body> © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS JSP - Acciones JSP - Acciones Las acciones permiten el acceso a tareas comunes que se realizan en una JSP, como interactuar con JavaBeans, incluir contenido de otros recursos o derivar peticiones. Las acciones están delimitadas por los tags <jsp:acción> </jsp:acción> En donde acción es el nombre de la acción estándar. Si nada existe entre los dos tags puede usarse la sintaxis abreviada de XML de elemento e e e o vacío ac o <jsp:acción /> Existen acciones predefinidas (estándar)… © Diego C. Martínez - DCIC-UNS jsp:include <jsp:include page="relative URL" flush="true"/> Incluye un fichero en el momento en que la página es solicitada. En algunos servidores, el fichero incluido debe ser un fichero HTML o JSP, según determine el servidor. jsp:useBean <jsp:useBean att=val*/> <jsp:useBean att=val*> ... </jsp:useBean> Encuentra o construye un Java Bean. Los posibles atributos son: id="name" scope="page | request | session | application" class="package.class" type="package.class" beanName="package.class“ © Diego C. Martínez - DCIC-UNS 23 Aplicaciones Web UNPSJB - Sede Trelew JSP - Acciones jsp:setProperty <jsp:setProperty att=val*/> Selecciona las propiedades del bean, bien directamenteo o designando el valor que viene desde un parámetro de la petición. Los atributos legales son: name="beanName" property="propertyName|*" param="parameterName" value="val“ Primer cuatrimestre de 2014 AJAX AJAX es un término familiar en otros contextos... jsp:getProperty <jsp:getProperty name="propertyName" value="val"/> Recupera y obtiene las propiedades del Bean. jsp:forward <jsp:forward page="relative URL"/> Reenvía la petición a otra página. Equipo de Futbol Producto de Limpieza Videojuego de Konami Durante los ultimos años en computación también ha adquirido un significado especial. AJAX es un modelo de interacción para aplicaciones web, basado primordialmente en dos tecnologías: JavaScript y XML. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS AJAX El corazón de AJAX El término AJAX significa Asynchronous JavaScript and XML. Es básicamente una técnica para implementar ciertos comportamientos en aplicaciones web. La idea general es solicitar en background información a un servidor mientras el cliente opera sobre el navegador (por eso asincrónica). Si bien es muy popular actualmente, esta técnica existe hace varios años, pero su practicidad era relativa dado el estado de las tecnologías en esos días. En algun tiempo esta técnica se denominó Inner-Browsing. Ajax no es una tecnología, sino una agrupación de varias técnicas y tecnologías unidas para lograr un mismo efecto. Ajax incluye: Presentación basada en estándares: XHTML, CSS. Páginas dinámicas, utilizando DOM. Intercambio de datos, utilizando XML y XSLT (y JSON!) Recuperación asincrónica de datos, usando XMLHttpRequest Javascript para todo lo anterior! © Diego C. Martínez - DCIC-UNS Internet Explorer (Windows), Safari (Mac OS-X), Mozilla (todas), Konqueror (KDE) y otros proveen todos un método para que los scripts Javascript puedan realizar requerimientos HTTP. Se realiza por medio de un objeto denominado XMLHttpRequest (“XHR”) Aunque XML aparece en el nombre, no se limita sólo a ese formato. Dada la diferencia entre los browsers, existen varias formas de obtener este objeto… var req = new ActiveXObject("Microsoft.XMLHTTP") var req = new XMLHttpRequest() window.createRequest() Una vez obtenido el objeto, realizar un pedido HTTP es fácil. Hay que tener en cuenta que el pedido se realiza en background, en forma asincrónica, por lo que no “esperamos” por una respuesta... © Diego C. Martínez - DCIC-UNS 24 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Modelo Ajax Modelo tradicional Cliente Cliente Web Server Web Server Ajax Engine request request response response request request response response © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS XMLHttpRequest XMLHttpRequest en acción if (window.XMLHttpRequest){ // IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else { // IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open(metodo,URL,asyncronico); xmlhttp.send(); req.onreadystatechange = processReqChange; req.open("GET", url, true); req.send(null); onreadystatechange es una propiedad del objeto XMLHttpRequest que almacena la función que procesa la respuesta del servidor. Es el oyente de cambio de estado: la función se invoca cada vez que cambia la propiedad readyState. después de invocar a open, open readyState = 1. 1 después de invocar a send, readyState = 2. mientras se recibe la respuesta, readyState = 3 al finalizar la respuesta, readyState = 4. Sólo cuando readyState vale 4 debemos manipular la respuesta del servidor. Si el request es asincrónico, hay que indicar previamente qué sucederá cuando se complete la recepción de la respuesta del servidor... © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 25 Aplicaciones Web UNPSJB - Sede Trelew XMLHttpRequest en acción req.onreadystatechange = processReqChange; req.open("GET", url, true); req.send(null); La respuesta del servidor se almacena finalmente en un atributo del objeto XMLHttpRequest. Si la respuesta esperada es texto plano, se almacena en responseText req.onreadystatechange = function(){ if(req.readyState == 4){ document.getElementbyId(id).innerHTML = req.responseText; } } Primer cuatrimestre de 2014 XMLHttpRequest en acción req.onreadystatechange = processReqChange; req.open("GET", url, true); req.send(null); El atributo responseXML es similar, pero nos permite encapsular la información para ser interpretada como XML. Al ser un XML, tiene una representación DOM y podemos usar operaciones para obtener los datos contenidos en ese documento! req.onreadystatechange = function(){ if(req.readyState == 4){ var xmldoc = req.responseXML; var nodo = xmldoc.getElementsByTagName('root').item(0); } } © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS XMLHttpRequest en acción Ejemplo Ajax req.onreadystatechange = processReqChange; req.open("GET", url, true); req.send(null); Las operaciones open y send inician el proceso de pedido al servidor. open recibe como parámetros: el método (GET, POST, HEAD, etc), el URL (que puede ser absoluto o relativo) y un indicativo de si el pedido es asincrónico o no. El valor “true” como último argumento indica que el script no esperará la respuesta luego de la invocación a la operación send, la cual comienza el pedido antes configurado. Con lo visto hasta el momento es fácil crear una simple aplicación que utilice esta técnica. Del lado cliente, haremos pedidos HTTP a un servidor por medio del objeto XMLHttpRequest. Recibiremos la información y la procesamos. Del lado servidor, una aplicación (por ejemplo Java) o script (por ejemplo PHP) generará la respuesta solicitada por el cliente. Los dos extremos colaboran creando el efecto deseado. Es importante destacar que las tecnologías usadas tanto del lado cliente como del lado servidor son independientes y por lo tanto pueden cambiar. AJAX se refiere a JavaScript, pero pueden surgir nuevos lenguajes de scripting que interactúen con el XMLHttpRequest del lado cliente. Del lado servidor podemos usar Java2, .NET, PHP, Perl, etc. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 26 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Recordemos …. JSON Ejemplo Ajax – validación de datos En general, el formato de transmisión de datos es XML Dado el costo de traducir XML a objetos JavaScript, la tendencia ha sido utilizar formatos más cercanos al lenguaje. onkeyup JSON = JavaScript Object Notation validateUserID(){ controlar id } JSON es un subconjunto de la notación object literal. La Notación Literal de Objetos permite describir en forma simple y directa una estructura de datos compleja, principalmente objetos. validar php?userid= validar.php?userid=... XMLHTTPRequest XML Server de Validación var empleado={ nombre:'Homero', apellido:'Simpson', nombrecompleto:function(){ return this.nombre+' '+this.apellido; } function callback(){ actualizar DOM } } © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS JSON Algunos usos de Ajax La tendencia es utilizar JSON como estructura de datos, en lugar de XML: <albums> <album> <titulo> Master of Puppets </titulo> <artista> Metallica </artista> </album> <album> <titulo> The Division Bell </titulo> <artista> Pink Floyd </artista> </album> <albums> { 'album': [ { 'titulo' : 'Master of Puppets', 'artist' : 'Metallica', }, { 'titulo' : 'The Division Bell', 'artist' : 'Pink Floyd', ] } 117 bytes Validaciones de datos de formularios en tiempo real. Identificaciones de usuario, números de serie, códigos postales, y otros datos pueden ser validados en el formulario antes del envío de los datos. Autocompletamiento Algunos datos pueden ser autocompletados mientras el usuario escribe. Operaciones de detalles de datos Información detallada puede ser obtenida por medio de eventos simples del cliente. Controles de interfaz de usuario Arboles, menúes, barras de progreso se implementan sin necesidad de refresh de página completa. Refresh de datos en la página. Algunos datos son obtenidos del servidor y mostrados en la página. 171 bytes La principal ventaja es que al ser un formato de datos propio de JavaScript, es fácil interpretarlo. No hace falta parsing como en XML. © Diego C. Martínez - DCIC-UNS © Diego C. Martínez - DCIC-UNS 27 Aplicaciones Web UNPSJB - Sede Trelew Primer cuatrimestre de 2014 Algunas desventajas de Ajax Complejidad Se necesita lógica de presentación en el cliente y generación y envío de documentos XML en el servidor. Requiere conocimientos de JavaScript. Dependencia de versiones Javascript. El lenguaje no es el mismo en todos los navegadores. Depuración El proceso es complicado porque la lógica se distribuye en el cliente y en el servidor. Código expuesto Parte del código de la aplicación queda expuesto al ejecutarse en el cliente. Indexado Muchos web crawlers no encontrarán el contenido obtenido via AJAX. Bookmarks Probablemente los bookmarks no registren el último estado de la página © Diego C. Martínez - DCIC-UNS 28