无法在LISP hunchentoot中获得该帖子

时间:2015-02-11 11:06:52

标签: post lisp common-lisp hunchentoot

我尝试实现一个基于Hunchentoot的简单帖子示例。

以下是代码:

(define-easy-handler (test :uri "/test") () 
  (with-html-output-to-string (*standard-output* nil :prologue t :indent t)
    (:html 
     (:body
      (:h1 "Test")
      (:form :action "/test2" :method "post" :id "addform"
     (:input :type "text" :name "name" :class "txt")
     (:input :type "submit" :class "btn" :value "Submit"))))))

(define-easy-handler (test2 :uri "/test2") (name)
  (with-html-output-to-string (*standard-output* nil :prologue t :indent t)
    (:html 
     (:body
      (:h1 name)))))

我可以正确连接到http://127.0.0.1:8080/test并查看文字输入表单。但是当我提交文本时,我得到一个空白页面,我希望在文本输入中给出一个带有标题的页面。

不确定有什么问题,有人可以提出建议吗?

1 个答案:

答案 0 :(得分:5)

将处理程序更改为此

(define-easy-handler (test2 :uri "/test2") (name)
  (with-html-output-to-string (*standard-output* nil :prologue t :indent t)
    (:html 
     (:body
     (:h1 (str name))))))

然后它应该工作。阅读cl-who文档。 特别是有关本地宏的信息。 我在这里提供相关文件。

既不是字符串也不是关键字的表单,也不是以关键字开头的列表,除了以下本地宏外,将保留原样:

  • 看起来像(str格式)的表单将替换为

    (let ((result form)) (when result (princ result s)))
    
    (loop for i below 10 do (str i)) =>
    (loop for i below 10 do
      (let ((#:result i))
        (when #:result (princ #:result *standard-output*))))
    
  • 看起来像(fmt form *)的表单将替换为

    (format s form*)
    
    (loop for i below 10 do (fmt "~R" i)) => (loop for i below 10 do (format s "~R" i))
    
  • 看起来像(esc形式)的表单将替换为

    (let ((result form)) (when result (write-string (escape-string result s))))
    
  • 如果表单看起来像(htm form *)那么每个表单都将受到我们刚刚描述的转换规则的约束,即这是用另一个WITH-HTML-OUTPUT调用包装的主体

    (loop for i below 100 do (htm (:b "foo") :br))
    => (loop for i below 100 do (progn (write-string "<b>foo</b><br />" s)))