lispmxEn 2017-12-26 12:17:40

#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 WARNING: Coercing "/home/ikki/src/lisp/ucw-basics-tutorial" to directory
"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   :license "BSD 2 Clause (http://opensource.org/comment/1294"
  :depends-on (#:ucw-core
               #:ucw
               #:iolib
           #:parenscript)
  :serial t
  :components ((:file "package")
                               (:file "ucw_bt_server_init")

                              (:file "ucw_basics_tutorial")))


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


Veremos la pantalla de inicio de nuestro tutorial:



Y también podemos ver el código html generado:




Hasta aquí llegamos por esta ocasión.

Continuaremos en la siguiente parte de nuestro tutorial, agregando un poco mas de funcionalidades.

Si tienen dudas planteenlas en los comentarios y tratare de responderlas de la mejor manera y a la brevedad posible.

Happy Hacking!

Autor: Erick "ikki" López





También te puede interesar
lisp codeEn 2022-07-13 13:12:00