(eval-when (:compile-toplevel :load-toplevel :execute)
(require 'hunchentoot)
(require 'cl-who)
(require 'html-template))
(defpackage :simple-web
(:use :common-lisp :hunchentoot :html-template)
(:export :start :stop))
(in-package :simple-web)
(defvar *server* nil "웹서버 인스턴스")
(defun start (&key (port 8080))
"웹서버 시작"
(when *server* (error "already started"))
(setf *server* (start-server :port port)
*default-content-type* "text/html; charset=utf-8"
*dispatch-table* (list (create-prefix-dispatcher "/foo" 'foo)
(create-prefix-dispatcher "/bar" 'bar)
(create-prefix-dispatcher "/baz" 'baz)
'default-dispatcher))
*server*)
(defun stop ()
"웹서버 종료"
(stop-server *server*)
(setf *server* nil))
(push (create-prefix-dispatcher "/test" 'foo) *dispatch-table*)
(defun foo ()
"한글(유니코드)출력을 하려면 어래이 형태로 리턴해주면 된다"
(sb-ext:string-to-octets
"한글"))
(defun bar ()
"html-template 를 써봤다. 이놈으로 한글을 리턴해주려면
이스케이프되는것을 막아야 하는데 *string-modifier* 를 적당히 다른걸로
바꿔치면 된다. 어떤걸로 써야 할지는 아직 잘 모르겠는데.. 문서
참고하세... 흠 html-template 가 스트림에 바로 쓰는 함수는 있는데
스트링으로 리턴해주는 함수가 없네. 못찾은건가.. 그래서
with-output-to-string 으로 스트링으로 받아내고 이중에 유니코드가
껴있으니 다시 string-to-octets 으로 어래이 형태로 변환을 했다."
(sb-ext:string-to-octets
(with-output-to-string (s)
(let ((*string-modifier* #'escape-string-minimal-plus-quotes))
(fill-and-print-template (create-template-printer "안녕 <!-- TMPL_VAR world -->")
'(:world "세상")
:stream s)))))
(defun baz ()
"이건 fill-and-print-template 에 바로 스트림을 넘기기 위해서
send-headers 로 스트림을 가져온것."
(let ((s (send-headers)))
(fill-and-print-template (create-template-printer "안녕 <!-- TMPL_VAR world -->")
'(:world "세상")
:stream s)))
그래서 위 코드를 적용하고 나니 위의 foo 와 baz 가 이렇게 간단히 변했다.
댓글 없음:
댓글 쓰기