El servidor Web Área de Ingeniería Telemática Dpto. Automática y Computación http://www.tlm.unavarra.es/ Server-side Área de Ingeniería Telemática Dpto. Automática y Computación http://www.tlm.unavarra.es/ Server-side web 80 server pro st a tus statusprog Son las 10:21 status prog 13 personas han visitado la pagina GET / ej: envia la hora actual envia las visitas que ha habido a la pagina envia los mensajes de otros usuarios .... GE T/ ‣ del servidor En lugar de enviar el contenido El fichero contiene un programa que genera el objeto g ‣ Un URI que hace referencia a un fichero Son las 10:23 14 personas han visitado la pagina Common Gateway Interface (RFC-3875) GET /prog.cgi?x=32?nombre=mikel web server La salida del programa se envia al cliente Variables del servidor en variables de entorno QUERY_STRING="x=32&nombre=mikel" Datos de POST a la entrada estandar prog.cgi Content-type: text/html <pre> Hola, soy un CGI </pre> ‣ El servidor web lanza un nuevo proceso ‣ Le pasa información del servidor y de la petición en variables de entorno ‣ Le pasa los datos recibidos (POST o PUT) en la entrada estandar ‣ El resultado del programa se envía al cliente ‣ El CGI es responsable de enviar la separación de fin de la cabecera... con lo que puede enviar cabeceras (p.ej: Content-type) Ejemplos CGIs #!/usr/bin/env python from os import environ from sys import stdin from time import * print('Content-type: text/html') print('\n') print('<pre>') print(strftime("%F %T",localtime(time()))) print('</pre>') import java.util.Date; public class jcgi { public static void main(String[] args) { System.out.printf("Content-type: text/html\n\n"); System.out.printf("<pre>"); System.out.printf(new Date().toString()); System.out.printf("</pre>"); } } Evolucion ‣ FastCGI ‣ Un único proceso va procesando las peticiones ‣ Separado del servidor web, comunicación por un socket ‣ Módulos del servidor que le permiten ejecutar programas ‣ mod_perl, mod_php, mod_python, mod_ruby ‣ Lenguajes muy orientados a procesar paginas: PHP ‣ ASP .NET VBScript en IIS ‣ Servlets ‣ Servidor en Java ‣ Se construyen objetos para servir las peticiones pero no procesos ‣ JSP Java Server Pages Ejemplo PHP <!DOCTYPE html> <html> <head> <title>Probando PHP</title> </head> <body> <h1> <?php echo "Hola SWS"; ?> </h1> </body> </html> <!DOCTYPE html> <html> <head> <title>Probando PHP</title> </head> <body> <h1> <?php echo date("l, j F Y, G:i"); </body> </html> ?> </h1> Ejemplos ASP <!DOCTYPE html> <html> <body> <% response.write("Hello World!") %> </body> </html> <!DOCTYPE html> <html> <body> Today's date is: <%response.write(date())%>. <br> The server's local time is: <%response.write(time())%>. </body> </html> Ejemplo Servlet import import import import java.io.*; javax.servlet.*; javax.servlet.http.*; java.util.Date; public class HelloWWW extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>\n<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n"); out.println("<BODY>\n<PRE>\n"); out.println(new Date().toString()); out.println("</PRE>\n</BODY></HTML>"); } } Ejemplos JSP <html> <body> <% out.print("Hello World!"); %> </body> </html> <%@ page language="java" import="java.util.*" errorPage="" %> <html> <body> Current Date time: <%=new java.util.Date()%> </body> </html> PHP Área de Ingeniería Telemática Dpto. Automática y Computación http://www.tlm.unavarra.es/ PHP ‣ PHP (Personal Home Page ... PHP Hypertext Preprocesor) ‣ Server-side ‣ Lenguaje que genera la página ... preprocesando una plantilla <!DOCTYPE html> <html> <head> <title>Probando PHP</title> </head> <body> <h1> <?php echo date("l, j F Y, G:i"); </h1> </body> </html> index.php PHP ?> mod_php <!DOCTYPE html> <html> <head> <title>Probando PHP</title> </head> <body> <h1>Monday, 25 February 2013, 19:02 </h1> </body> </html> se envia al cliente PHP ‣ Open source ‣ Simple para el principiante pero con muchas características ‣ ‣ ‣ ‣ avanzadas Soporta la gran mayoría de servidores web Permite generar HTML pero también cualquier imagenes, Flash, XML... Soporta gran numero de bases de datos Oracle, mSQL, MySQL, ODBC, Sybase... Soporta un gran número de servicios y protocolos: LDAP, IMAP, SNMP, NNTP, POP3, HTTP... ‣ Muy extendido ‣ LAMP (Linux, Apache, MySQL, PHP) Tambien hay WAMP, MAMP, DAMP, XAMP... Configuración del servidor ‣ Normalmente la extension .php indica que debe pasarse por el preprocesador PHP AddType application/x-httpd-php .php AddType application/x-httpd-php5 .php PHP Tags de inserción ‣ La más estandar y compatible con XHTML y XML <?php codigo php ?> ‣ Como script <script language="php"> codigo php </script> ‣ Se puede habilitar esta <? codigo php ?> <?=expresion php ?> ‣ Y tipo ASP <% codigo php %> <%=expresion php %> PHP instrucciones y comentarios ‣ ‣ ‣ ‣ Instrucciones separadas por ; Las variables se marcan con $ Comentarios con // # o /* comentario */ La instrucción básica de imprimir es echo <!DOCTYPE html> <html> <head> <title>Probando PHP</title> <body> <h1> <?php // Lee la fecha $fecha=date("l, j F Y, G:i"); # Imprime la fecha echo $fecha; /* como puedes ver los comentarios se pueden poner de varias formas en PHP */ ?> </h1> </body> </html> </head> Modo PHP avanzado ‣ Se puede entrar y salir del modo PHP en medio de una instrucción condicional o bucle <!DOCTYPE html> <html> <head> <title>Probando PHP</title> </head> <body> <?php if ( $usuario_valido ) { ?> <h1>Bienvenido <?php echo $nombre_usuario; ?></h1> <?php } else { ?> <h1>NO AUTORIZADO</h1> <?php } ?> ... Cuidado con las cabeceras... ‣ Se pueden enviar cabeceras para HTTP siempre que no se haya enviado nada antes... <?php // Vamos a mostrar un PDF header('Content-type: application/pdf'); echo "..."; ?> ‣ Pero enviar cualquier cosa incluso un salto de linea antes del <?php es enviar <?php // Vamos a mostrar un PDF header('Content-type: application/pdf'); echo "..."; ?> Error al enviar la cabecera En resumen ‣ Funcionamiento básico de programas server-side ‣ Primera idea: CGI ‣ Evolución: PHP / ASP / Servlets ‣ Generación por preprocesado ‣ y PHP ‣ Ejemplos simples ‣ Inserción ‣ Instrucciones ‣ Más en próximas clases