“Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones,...

Post on 30-Apr-2020

3 views 0 download

Transcript of “Web Authoring System Haskel” · utilizado para crear scripts para controlar sesiones,...

WASH

Santiago Fernández Zumaquero Programación Internet con Lenguajes Declarativos Multiparadigma

Curso 2009/2010

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

Evolución de la Web: ◦ Web estática.

HTML

XHTML

◦ Web dinámica.

PHP

ASP

JSP

CGI -> Perl, C++ y WASH (con Haskell)

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.

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.

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

WSP ◦ Servidor con soporte para Wash Server Pages.

Wash/DB ◦ Interfaz transaccional para bases de datos SQL.

DBconnect ◦ Interfaz para PostgreSQL (en desuso).

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.

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()

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" }

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

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.

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>

WASHMail es una colección de módulos para lectura y procesamiento de emails.

Se incluye con WashNGo.

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.

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.

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).

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?

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.

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.

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

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>" > }

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

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.

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.

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.

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.