#ucw #lisp #tutorial #UnCommonWeb #CommonLisp
Introducción
Vamos a iniciar un tutorial para aprender lo esencial del Framework para desarrollo de aplicaciones Web UnCommonWeb, o simplemente UCW, el cual nos permite desarrollar paginas y/o aplicaciones web de una manera sencilla y poderosa.
Antecedentes
Te recomiendo mucho que antes leas los siguientes tutoriales:
Creación del Proyecto
En el REPL, carga primero quickload y luego usalo para crear el esqueleto de nuestro proyecto:
CL-USER> (ql:quickload :quickproject)
To load "quickproject":
Load 1 ASDF system:
quickproject
; Loading "quickproject"
(:QUICKPROJECT)
CL-USER> (quickproject:make-project "/home/ikki/src/lisp/ucw-basics-tutorial" :name "ucw_basics_tutorial" :author "Erick Lopez
"ucw_basics_tutorial"
Inicialización del servidor de aplicaciones UCW
Procedamos a crear el archivo de inicialización del servidor UCW, con el siguiente código:
emacs ucw_bt_server_init.lisp
;;; -*- lisp -*-
(in-package #:ucw_basics_tutorial)
(defvar *ucw-bt-server* (make-instance 'standard-server))
(defclass ucw-bt-application (static-roots-application-mixin
standard-application)
())
(defvar *wwwroot*
(merge-pathnames #P"wwwroot/"
(asdf:component-pathname (asdf:find-system :ucw_basics_tutorial))))
(defvar *js*
(merge-pathnames #P"wwwroot/js/"
(asdf:component-pathname (asdf:find-system :ucw_basics_tutorial))))
(defvar *css*
(merge-pathnames #P"wwwroot/css/"
(asdf:component-pathname (asdf:find-system :ucw_basics_tutorial))))
(defvar *img*
(merge-pathnames #P"wwwroot/img/"
(asdf:component-pathname (asdf:find-system :ucw_basics_tutorial))))
(defvar *ucw-bt-application*
(make-instance
'ucw-bt-application
:url-prefix "/"
:debug-on-error t
:static-roots (list (cons "wwwroot/" *wwwroot*)
(cons "css/" *css*)
(cons "js/" *js*)
(cons "img/" *img*))))
;;;Two functions to ease to start and stop our application
(defun start-ucw-bt-server ()
(setf (server.backend *ucw-bt-server*)
(make-backend :httpd :port 8080))
(register-application *ucw-bt-server* *ucw-bt-application*)
(startup-server *ucw-bt-server*))
(defun stop-ucw-bt-server ()
(shutdown-server *ucw-bt-server*))
Modificar la definición del Sistema
Agreguemos el archivo de inicialización del servidor y las dependencias de ucw, iolib y parenscript.
emacs ucw_basics_tutorial.asd
;;;; ucw_basics_tutorial.asd
(asdf:defsystem #:ucw_basics_tutorial
:description "Describe ucw_basics_tutorial here"
:author "Erick Lopez
:depends-on (#:ucw-core
#:ucw
#:iolib
#:parenscript)
:serial t
:components ((:file "package")
(:file "ucw_bt_server_init")
En la definición del sistema y sus componentes, el orden de los archivos (:files) es relevante, por ejemplo, en este caso es importante poner primero ucw_bt_server_init y luego ucw_basics_tutorial debido a que una variable global (*ucw-bt-application*) que se define en la inicialización del servidor es luego usada en el entry point que declaramos para nuestra pagina de inicio.
Modificar la definición del paquete
Modifiquemos la definición del paquete para especificar los otros paquetes que usaremos y hacer shadow de algunos simbolos, ademas de agregar un nickname mas corto para nuestro paquete.
emacs package.lisp
;;;; package.lisp
(defpackage #:ucw_basics_tutorial
(:shadowing-import-from #:ucw-core #:parent)
(:shadowing-import-from :ucw-standard :call)
(:shadowing-import-from :ucw-core :cookie-value)
(:nicknames "ucw-bt")
(:use #:cl
#:ucw-core
#:ucw
#:parenscript))
Cargar el sistema
Ahora podemos cargar nuestro sistema para verificar que todo va bien, lo hacemos con:
(ql:quickload "ucw_basics_tutorial")
Pagina de inicio
Ahora es momento de programar nuestra página de inicio.
emacs ucw_basics_tutorial.lisp
;;;; ucw_basics_tutorial.lisp
(in-package "ucw-bt")
;;; "ucw_basics_tutorial" goes here. Hacks and glory await!
;;; The entry point of home page
(defentry-point "index.ucw" (:application *ucw-bt-application*)
()
;;(defparameter *path-query-test* nil)
;;(setf *path-query-test* (parameters (context.request *context*)))
(call 'ucw-bt-window
:body (make-instance 'ucw-bt-comp-01)
:title "UCW Basics Tutorial - Home page"
:icon "/img/favicon.png"))
(defcomponent ucw-bt-window (standard-window-component)
()
(:default-initargs
:title "UCW Basics Tutorial -- Home Page "
:icon "/img/favicon.png"
:body (make-instance 'ucw-bt-comp-01))
(:documentation "Huuii notes application window"))
(defcomponent ucw-bt-comp-01 ()
())
(defmethod render ((obj01 ucw-bt-comp-01))
(<:h2 "UCW Basics Tutorial")
(<:h3 "Index"))
Iniciar nuestra aplicación
Ahora podemos iniciar nuestra aplicación con:
|ucw-bt|> (start-ucw-bt-server)
Y podremos ver la aplicación corriendo apuntando nuestro navegador web a:
http://localhost:8080/index.ucw