Я пишу веб-приложение, для которого потребуется веб-сервер hunchentoot. У меня почти нет практических знаний о hunchentoot или любом другом веб-сервере в этом отношении, и мне интересно, как мое приложение, написанное на Common Lisp, будет обслуживать страницы для веб-клиента. Я видел несколько отличных примеров (например, Hunchentoot Primer, Lisp для Интернета) особенно. тот, что указан на странице Hunchentoot. Вы знаете, где я могу найти больше таких примеров? Спасибо.
Как подключить веб-приложение к Hunchentoot
Ответы (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*)))
Найденных примеров должно быть достаточно для начала, и если вы столкнетесь с проблемами, прочтите руководство, а затем задайте конкретные вопросы.
create-static-file-dispatcher-and-handler
для файла html. Что я должен делать?
- person sçuçu; 10.03.2014
define-easy-handler
регистрирует обработчик, который вы определяете автоматически, в глобальной переменной, которая проверяется при поступлении HTTP-запроса (переменная называется *easy-handler-alist*
). Так что об этом позаботятся автоматически. Вы хотите использовать обработчик другой формы, чем тот, который определен в руководстве?
Я думаю, что есть пример использования Hunchentoot в дистрибутиве Elephant (Elephant является постоянной объектной базой данных для Common Lisp.)