hunchentoot Web サーバーを必要とする Web アプリを作成しています。私は hunchentoot や Web サーバーに関する実用的な知識がほとんどなく、Common Lisp で記述された私のアプリがどのように Web クライアントにページを提供するのか疑問に思っています。私はいくつかの優れた例を見てきました (例: Hunchentoot Primer、Web 用 Lisp) esp. Hunchentoot のページにリストされているもの。そのような例をもっと見つけることができる場所を知っていますか? ありがとう。
2 に答える
Common Lisp で書かれた私のアプリが Web クライアントにどのようにページを提供するのか疑問に思っています。
*dispatch-table*
Hunchentoot は、ディスパッチ ハンドラの単なるリストである にあるすべてのものを提供します。
最も簡単な方法は、静的ファイルを提供することです。典型的な例の 1 つは、CSS ファイルです。
(push (create-static-file-dispatcher-and-handler "/example.css"
"example.css")
*dispatch-table*)
Web アプリケーションの場合、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 (*標準出力* nil :prologue t :indent t) (:html :xmlns "http://www.w3.org/1999/xhtml" :xml\:lang "de" :lang "デ" (:頭 (:meta :http-equiv "Content-Type" :content "text/html;charset=utf-8") (:タイトル、タイトル) (:link :type "text/css" :rel "スタイルシート" :href "/example.css")) (:体 、@体)))) (defmacro defpage (name (title) &body body) `(プログ (定義方法、名前 () (標準ページ (,title) 、@体)) (push (create-prefix-dispatcher ,(format nil "/~(~a~).html" name) ',name) *発送表*)))
あなたが見つけた例は、始めるのに十分なはずです。問題が発生した場合は、マニュアルを読み、具体的な質問をしてください。
define-easy-handler
定義しているハンドラーを、HTTP 要求が到着したときにチェックされるグローバル変数に自動的に登録します (変数は と呼ばれます*easy-handler-alist*
)。そのため、自動的に処理されます。チュートリアルで定義されているものとは異なる形式のハンドラーを使用しますか?
Elephant ディストリビューションで Hunchentoot を使用した例があると思います ( Elephantは Common Lisp の永続オブジェクト データベースです)。