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)))

テンプレート index.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-acceptordefine-easy-handlerてページを定義することを検討してください (ハンドラー関数を定義し、同時に適切なディスパッチャーを にプッシュできるようにするのは、ちょっとした構文糖衣です*dispatch-table*) 。

  • Hunchentoot アプリをデバッグするときは、より良いデバッグ情報を取得するために(setf hunchentoot:*catch-errors-p* nil)(または(setf hunchentoot:*show-lisp-errors-p* t)、好みに応じて) 役立ちます。

于 2012-04-13T15:54:00.037 に答える