; 一些辅助函数
(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)))
模板index.tmpl:
<!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开发实例</h1>
hi, <!-- TMPL_VAR name -->
</body>
</html>
当我访问http://localhost:4444/hello时 总是报告500错误,我怀疑是模板路径, 我的操作系统是windows, 不知道如何在同一目录下用index.tmpl编写这个path.web.lisp
答案 0 :(得分:0)
显而易见的问题是“你评价start-web
”吗?这可能是“是”,但请注意,您确实需要调用start
以使服务器侦听相应的端口。如果你收到Hunchentoot错误页面,这不是问题。
fill-and-print-template
如何定义?如果它需要绝对路径名,您可能需要执行(merge-pathnames "index.tmpl")
而不是传递相对路径。
通常,您可以做一些事情来使lisp网站开发变得更容易。
考虑defining yourself a package。这将允许您有选择地导入符号,而不是使用其源包为每个外部符号添加前缀。它还可以让您更轻松地加载自己的项目。
考虑使用quicklisp而不是定义自己的load-lib
。它允许您轻松安装和加载外部库(AFAIK,如果已经安装了您指定的库,ql:quickload
在任何情况下均为asdf:load-op
)
看看cl-who,我发现它比HTML模板更加友好,正如你正在做的那样
考虑使用hunchentoot:easy-acceptor
和define-easy-handler
来定义您的页面(让您定义处理程序函数并同时将适当的调度程序推送到*dispatch-table*
,这是一些语法糖)
在调试Hunchentoot应用时,为了获得更好的调试信息,(setf hunchentoot:*catch-errors-p* nil)
(或(setf hunchentoot:*show-lisp-errors-p* t)
,根据您的偏好)很有帮助。