如何将Web应用程序连接到Hunchentoot

时间:2009-06-20 20:24:36

标签: common-lisp hunchentoot

我正在编写一个需要hunchentoot Web服务器的Web应用程序。我几乎没有关于hunchentoot或任何网络服务器的工作知识,我想知道我在Common Lisp中编写的应用程序如何将页面提供给Web客户端。我已经看到了一些很好的例子(例如Hunchentoot Primer,网络的Lisp)。 Hunchentoot页面上列出的那个。你知道我在哪里可以找到更多这样的例子吗? 感谢。

2 个答案:

答案 0 :(得分:8)

  

我想知道我在Common Lisp中编写的应用程序如何将页面提供给Web客户端。

Hunchentoot服务于*dispatch-table*中的所有内容,这只是调度处理程序列表。

最简单的方法是提供静态文件。一个典型的例子是CSS文件:

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

对于Web应用程序,您很可能希望动态创建网页。您可以通过定义一个将页面作为字符串返回的函数(例如使用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*)))

您找到的示例应足以让您入门,如果您遇到问题,请阅读手册,然后提出具体问题。

答案 1 :(得分:2)

define-easy-handler将自动定义的处理程序注册到一个全局变量中,该变量在HTTP请求到达时被检查(该变量被称为*easy-handler-alist*)。所以它会被自动处理。是否要使用与教程中定义的表单不同的处理程序?

我认为在大象发行版中有一个使用Hunchentoot的例子(Elephant 是Common Lisp的持久对象数据库。)