2
; 一些辅助函数
(require :asdf)
(defun loadlib (mod)
  (asdf:oos 'asdf:load-op mod))

(defun reload ()
  (load "web.lisp"))
(defun restart-web ()
  (progn
    (reload)
    (start-web)))

; load 需要的库  
(loadlib :html-template)
(loadlib :hunchentoot)

; 设置 hunchentoot 编码
(defvar *utf-8* (flex:make-external-format :utf-8 :eol-style :lf))
(setq hunchentoot:*hunchentoot-default-external-format* *utf-8*)
; 设置url handler 转发表
(push (hunchentoot:create-prefix-dispatcher "/hello" 'hello) hunchentoot:*dispatch-table*)

; 页面控制器函数
(defun hello ()
  (setf (hunchentoot:content-type*) "text/html; charset=utf-8")
  (with-output-to-string (stream)
    (html-template:fill-and-print-template
     #p"index.tmpl"
     (list :name "Lisp程序员")
     :stream stream)))
; 启动服务器
(defun start-web (&optional (port 4444))
  (hunchentoot:start (make-instance 'hunchentoot:acceptor :port port)))

模板索引.tmpl:</p>

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">  
<html>  
  <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
    <title>Test Lisp Web</title>  
  </head>  
  <body>  
    <h1>Lisp web开发实例&lt;/h1>  
    hi, <!-- TMPL_VAR name -->  
  </body>  
</html>  

我访问http://localhost:4444/hello时 老是报500错误,怀疑是模板路径,我的操作系统是windows,不知道怎么写这个path.web.lisp跟下面的index.tmpl就一样目录

4

1 回答 1

0

显而易见的问题是“你评估了start-web吗”?这可能是“是”,但请注意,您确实需要调用start才能让您的服务器侦听适当的端口。如果您收到 Hunchentoot 错误页面,这不是问题所在。

如何fill-and-print-template定义?如果它需要一个绝对路径名,您可能需要做(merge-pathnames "index.tmpl")而不是传递相对路径。

一般来说,你可以做一些事情来让 lisp web 开发对你来说更容易。

  • 考虑给自己定义一个包。这将允许您有选择地导入符号,而不是在每个外部符号前面加上其源包。它还可以让您更轻松地加载自己的项目。

  • 考虑使用quicklisp而不是定义自己的load-lib. 它使您可以轻松安装和加载外部库(AFAIK,如果您指定的库已经安装,ql:quickload无论如何asdf:load-op都会失败)

  • 看看cl-who,我发现它比 HTML 模板更友好,就像你正在做的那样

  • 考虑使用hunchentoot:easy-acceptoranddefine-easy-handler来定义你的页面(它是一种语法糖,让你定义一个处理函数并同时将适当的调度程序推送到*dispatch-table*

  • 在调试 Hunchentoot 应用程序时,它有助于(setf hunchentoot:*catch-errors-p* nil)(或(setf hunchentoot:*show-lisp-errors-p* t),取决于您的偏好)以获得更好的调试信息。

于 2012-04-13T15:54:00.037 回答