![Page 1: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/1.jpg)
WASH
Santiago Fernández Zumaquero Programación Internet con Lenguajes Declarativos Multiparadigma
Curso 2009/2010
![Page 2: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/2.jpg)
Introducción
Características de WASH
Componentes de WASH ◦ Wash2hs
◦ Wash/CGI
◦ Wash/HTML
◦ Wash/Mail
◦ WSP
◦ Wash/DB
◦ DBconnect
Sesiones
Gestión de Formularios
Conclusiones
Referencias
![Page 3: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/3.jpg)
Evolución de la Web: ◦ Web estática.
HTML
XHTML
◦ Web dinámica.
PHP
ASP
JSP
CGI -> Perl, C++ y WASH (con Haskell)
![Page 4: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/4.jpg)
WASH es una familia de lenguajes específicos de dominio embebidos utilizados para desarrollar aplicaciones Web.
Cada uno de estos lenguajes está integrado en el lenguaje funcional HASKELL.
![Page 5: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/5.jpg)
Librería basada en CGI (Common Gateway Interface):
Portabilidad. Facilidad de uso. Mantenibilidad.
Fuertemente tipado. Las páginas se construyen bajo la noción de
sesión y de estado de la sesión.
Permite la construcción de interacciones Web complejas entre formularios de una manera limpia y elegante.
![Page 6: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/6.jpg)
Wash2hs ◦ Preprocesador para incluir fragmentos de código XHTML en
HSP (Haskell Server Pages).
Wash/CGI ◦ Para la creación de scripts del lado del servidor.
Wash/HTML ◦ Para la creación dinámica de HTML y XHTML.
Wash/Mail ◦ Utilizado para el procesamiento de emails
![Page 7: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/7.jpg)
WSP ◦ Servidor con soporte para Wash Server Pages.
Wash/DB ◦ Interfaz transaccional para bases de datos SQL.
DBconnect ◦ Interfaz para PostgreSQL (en desuso).
![Page 8: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/8.jpg)
Lenguaje específico de dominio del lado del servidor utilizado para crear scripts para controlar sesiones, formularios y gráficos.
Características: ◦ Las páginas web son representadas mediante estructuras
de datos. ◦ Control total de la sesión. ◦ Control total de los gráficos. Cada píxel de una imagen
puede realizar una acción distinta. ◦ No son necesarias urls explícitas. Salvo las referencias a
páginas externas. ◦ Los scripts compilados son reubicables. ◦ Persistencia. A través de variables transaccionales.
![Page 9: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/9.jpg)
Sintaxis: ◦ $: Aplicación de funciones que permite asociatividad por la
derecha sin usar paréntesis “f $ a” equivale a “f(a) o “f a” “f $ g $ a” equivale a “f(g a)”
◦ standarPage: Es un documento parametrizado de tipo String -> WithHTML CGI a -> WithHTML CGI a
◦ ask: Mapea un documento a una acción CGI
Ask :: WithHTML CGI() -> CGI()
◦ run: Función que mapea una acción CGI a una acción I/O Run :: CGI () -> IO()
◦ main: Acción I/O de tipo IO()
![Page 10: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/10.jpg)
Para implementar un programa ejecutable en Haskell, es necesario definir una función main::IO() que debe exportarse.
Para ello, se define la siguiente línea:
module Main(main) where
import System (getEnv) -- Para usar la función (getEnv)
main :: IO ()
-- main = ... programa que corresponda
Ejemplo (HolaText). El siguiente CGI devuelve la cadena de texto "Hola“:
mainHola =
do { putStrLn "content-type: text/plain";
putStrLn "";
putStrLn "Hola" }
![Page 11: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/11.jpg)
Ejemplo:
main = run (ask (standarPage “Hola planeta” myinfo))
myinfo =
do p (text “Este es mi segundo programa CGI”)
p(do text “Mis series son:”
ul (do li (text “House”)
li (Text “Anatomía de Grey”)
li (text “CSI”)))
standarPage ttl nodes =
html (do head (title (textttl))
body (h1 (text ttl) >> nodes))
Hola planeta
Este es mi segundo programa CGI
Mis series son:
· House
· Anatomía de Grey
· CSI
![Page 12: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/12.jpg)
Generación de HTML dinámico.
Combina flexibilidad y seguridad.
Aporta potencial para la generación y la parametrización de los documentos.
Por otra parte, la biblioteca garantiza código HTML bien formado y válido.
Proporciona alto nivel de abstracción.
![Page 13: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/13.jpg)
Ejemplo:
do p (text “Este es mi primer programa CGI”)
p (do text “Ejemplo de enumeración”
ul (do li (text “primero”)
li (text “segundo”)
li (text “tercero”)))
<p>Este es mi primer programa CGI</p>
<p>Ejemplo de enumeración
<ul>
<li>primero</li>
<li>segundo</li>
<li>tercero</li>
</ul>
</p>
![Page 14: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/14.jpg)
WASHMail es una colección de módulos para lectura y procesamiento de emails.
Se incluye con WashNGo.
![Page 15: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/15.jpg)
Versión ampliada del servidor web de Simon Marlow (HWS) que permite la ejecución de módulos WASH como servlets.
Los módulos WASH son compilados de forma transparente y cargados dinámicamente en el servidor.
Existen tres modos de ejecución:
◦ LogOnly: Se utiliza un log para reconstruir el estado actual.
◦ StateIDOnly: Se asigna un hilo a cada sesión y se utiliza este mismo hilo tras el envío de un formulario.
◦ LogAndState: Usa un hilo por eficacia y un log para garantizar la robustez.
![Page 16: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/16.jpg)
WASHDB proporciona un API para tener acceso a una base de datos tradicional utilizando una interfaz transaccional.
Se utiliza HDBC para proporcionar conectividad con la base de datos.
Actualmente solo está testeado con base de datos PostgreSQL.
![Page 17: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/17.jpg)
Colección de módulos para utilizar PostgreSQL desde Haskell.
Este conjunto de módulos se distribuye junto a WashNGo.
Prerrequisitos: ◦ Motor PostgreSLQ.
◦ c2hs (Generador de interfaces basado en librerías C).
![Page 18: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/18.jpg)
Conjunto de interacciones entre un servidor y un cliente Web.
Implementación habitual: ◦ Sesiones mantenidas en el servidor. ◦ El servidor mapea testigos con sesiones. ◦ Los testigos se almacenan en cliente (cookies,
parametros URL, campos ocultos…).
Problemas: ◦ Si se duplican las ventanas del navegador se duplican las
sesiones. ◦ Ficheros en caché. ¿Cuándo se borra la información del
servidor?
![Page 19: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/19.jpg)
WASH mantiene la sesión almacenando toda la información en campos ocultos.
Ventajas: ◦ No es necesario almacenar información en cliente. ◦ Ningún estado de la sesión puede ser accedido
directamente por una petición de cliente. ◦ Permite a los usuarios utilizar el botón “Atrás” del
navegador sin perder la sesión.
Inconveniente: ◦ La información necesaria para almacenar el estado de la
sesión puede ser grande. Esto puede afectar al rendimiento.
![Page 20: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/20.jpg)
WASH permite la creación fácil y rápida de formularios y elementos de interacción.
Existen dos métodos para realizar programas interactivos que contengan formularios. ◦ GET.
◦ POST.
![Page 21: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/21.jpg)
El método GET:
◦ Utilizado por defecto.
◦ Añade el carácter ? a la dirección URL especificada en el atributo action y adjunta los valores de los campos codificados.
◦ Codificación: nombre1=valor1&nombre2=valor2&...nombreN=valorN
◦ El contenido de los datos también se asocia a la variable
QUERY_STRING
![Page 22: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/22.jpg)
El método GET: ◦ Ejemplo (Formulario simple) El siguiente programa muestra la
variable QUERY_STRING y solicita el nombre y apellidos. Obsérvese cómo se modifica el valor de dicha variable.
mainAsk =
do { putHeaderHtml; putStrLn "<html><head><title>Ask Nombre</title>"; putStrLn "<body>"; thisUrl <- getUrl; queryStr <- getEnvSafe "QUERY_STRING"; putStrLn ("QUERY_STRING = " ++ queryStr ++ "<br/>"); putStrLn ("<form action=\"" ++ thisUrl ++ "\" >"); putStrLn "Nombre: <input type=\"text\" name=\"nombre\" />"; putStrLn "Apellidos: <input type=\"text\" name=\"apellidos\" />"; putStrLn "<INPUT type=\"submit\" value=\"Enviar\"> "; putStrLn "<INPUT type=\"reset\" value=\"Borrar\"></form>"; putStrLn "</body>" > }
![Page 23: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/23.jpg)
El método POST debe especificarse mediante el atributo method.
Los valores del formulario son accedidos a través de la entrada estándard del programa CGI.
En la variable CONTENT_TYPE se indica el tipo de contenido y en CONTENT_LENGTH el número de bytes que se envían
![Page 24: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/24.jpg)
Este tipo de programación se utiliza sobre todo en el ámbito de la investigación.
Lenguaje poco extendido en la industria.
No existe un conjunto de herramientas que facilite el desarrollo y la depuración.
El uso de base de datos está acotado a PostgreSQL.
El código generado está más estructurado.
![Page 25: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/25.jpg)
Es un lenguaje robusto. Lo que da seguridad ante sentencias mal formadas y problemas de tipado.
Las librerías disponen de una gran cantidad de componentes Web.
Aporta potencia a la hora de trabajar con sesiones y formularios.
La forma de tratar las sesiones puede ocasionar problemas de rendimiento.
![Page 26: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/26.jpg)
La potencia de HSP viene dada por la utilización de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script.
Uno de los pasos a dar en este lenguaje es la creación de librerías. El resto de lenguajes aporta más librerias que facilitan su uso.
![Page 27: “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones, formularios y gráficos. Características: Las páginas web son representadas mediante estructuras](https://reader033.vdocuments.site/reader033/viewer/2022042208/5eac0831e908a45c834f462d/html5/thumbnails/27.jpg)
http://www.informatik.uni-freiburg.de/~thiemann/WASH/
www.haskell.org
http://www.di.uniovi.es/~labra/PLF/apuntes/cgi.html
http://www.haskell.org/haskellwiki/WaSh
http://www.lcc.uma.es/~blas/apuntes/PDAv/p2005-2006/HSP.ppt
Martínez, Jonatan: “Programación Internet con Haskell”. Mayo 2007.