Как подключить веб-приложение к Hunchentoot

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


person Community    schedule 20.06.2009    source источник
comment
Чего вам не хватает в примерах? Если вы не скажете, скорее всего, вы получите больше ссылок на примеры, в которых нет того же самого.   -  person John Saunders    schedule 21.06.2009
comment
Что ж, я хотел бы более четко увидеть, как подключить остальной код приложения к hunchentoot; как приложение должно разговаривать с hunchentoot.   -  person    schedule 21.06.2009
comment
Ссылка мертва, да здравствует новая ссылка: newartisans.com/2007/ 11 / a-quick-hunchentoot-primer   -  person tjb    schedule 10.10.2012


Ответы (2)


Мне интересно, как мое приложение, написанное на 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*)))

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

person Svante    schedule 20.06.2009
comment
Я не могу обслуживать статический html, связанный с файлом css, используя create-static-file-dispatcher-and-handler для файла html. Что я должен делать? - person sçuçu; 10.03.2014
comment
@FSC: Похоже, у вас новый вопрос. Опубликуйте это как таковое и укажите необходимый контекст, пожалуйста. - person Svante; 10.03.2014

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

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

person js.    schedule 13.07.2009