Как подключить веб-приложение к Hunchentoot - PullRequest
4 голосов
/ 21 июня 2009

Я пишу веб-приложение, которое требует веб-сервера hunchentoot. У меня почти нет практических знаний о hunchentoot или любом другом веб-сервере, и мне интересно, как мое приложение, написанное на Common Lisp, будет обслуживать страницы для веб-клиента. Я видел несколько отличных примеров (например, Hunchentoot Primer , Lisp для Интернета) esp. тот, что указан на странице Hunchentoot. Вы знаете, где я могу найти больше таких примеров? Спасибо.

Ответы [ 2 ]

8 голосов
/ 21 июня 2009

Мне интересно, как мое приложение, написанное на Common Lisp, будет обслуживать страницы для веб-клиента.

Hunchentoot обслуживает все, что находится в его *dispatch-table*, который является просто списком обработчиков отправки.

Самое простое, что нужно сделать, это обработать статический файл. Типичным примером будет файл CSS:

(push (create-static-file-dispatcher-and-handler "/example.css"
                                                 "example.css")
      *dispatch-table*)

Для веб-приложения вы, скорее всего, захотите динамически создать веб-страницу. Вы делаете это, определяя функцию, которая возвращает страницу в виде строки (например, с CL-WHO), затем создавая обработчик для этой функции:

(defun foo ()
  (with-html-output-to-string ; ...
  ))

(push (create-prefix-dispatcher "/foo.html" 'foo)
      *dispatch-table*)

Вы можете избавиться от большого количества шаблонов с помощью макросов, например:

(defmacro standard-page ((title) &body body)
  `(with-html-output-to-string (*standard-output* nil :prologue t :indent t)
     (:html :xmlns "http://www.w3.org/1999/xhtml"
          :xml\:lang "de"
          :lang "de"
          (:head 
           (:meta :http-equiv "Content-Type" 
                      :content "text/html;charset=utf-8")
           (:title ,title)
               (:link :type "text/css" 
              :rel "stylesheet"
              :href "/example.css"))
              (:body
               ,@body))))

(defmacro defpage (name (title) &body body)
  `(progn
     (defmethod ,name ()
       (standard-page (,title)
         ,@body))
     (push (create-prefix-dispatcher ,(format nil "/~(~a~).html" name) ',name)
           *dispatch-table*)))

Найденных вами примеров должно быть достаточно, чтобы начать, а если вы столкнетесь с проблемами, прочитайте руководство и задайте конкретные вопросы.

2 голосов
/ 14 июля 2009

define-easy-handler регистрирует определяемый вами обработчик автоматически в глобальной переменной, которая проверяется при поступлении HTTP-запроса (переменная называется *easy-handler-alist*). Так что об этом позаботятся автоматически. Вы хотите использовать обработчик другой формы, чем тот, который определен в руководстве?

Я думаю, что есть пример использования Hunchentoot в дистрибутиве Elephant ( Elephant - это база данных постоянных объектов для Common Lisp.)

...