小试牛刀:用clojure做了一个web framework

88 views
Skip to first unread message

Jinxian Zhu

unread,
Feb 25, 2015, 6:14:50 AM2/25/15
to cn-cl...@googlegroups.com
思路是这样的:

用clojure实现java servelet filter, 过滤器拦截http request, 通过路由表路由到相应的方法handler, 根据handler函数及其参数的tag确定参数类型,然后从request 和 url 中解析相应的参数,处理后的结果,由hiccup渲染到对应的模版

详见

https://github.com/zhujinxian/road.git

Mingli Yuan

unread,
Feb 25, 2015, 7:50:56 AM2/25/15
to cn-cl...@googlegroups.com
参考一下 Ring 的架构会更好。 Servlet 的抽象机制,比起 Ring 要复杂很多。

其实 Ring 的架构来自于 Python 的 wsgi ,我曾经写过一个简单的介绍:


--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛上的“CN-Clojure”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到cn-clojure+...@googlegroups.com
要发帖到此群组,请发送电子邮件至cn-cl...@googlegroups.com
访问此群组:http://groups.google.com/group/cn-clojure
要查看更多选项,请访问https://groups.google.com/d/optout

Jinxian Zhu

unread,
Mar 13, 2015, 4:16:53 AM3/13/15
to cn-cl...@googlegroups.com

(defn render-test [ret tmt]
  (-> (resp/response "------render----test------") 
    (#(resp/content-type %1 "text/plain"))))

(defn foo
  "I don't do a whole lot."
  [x]
  (str "来自源码目录的参数:" x))

(defn handler [^Integer x]
    {:$r render-test :text (str "hello world, road goes sucess!" (foo x))})

(defn home [req content ^Integer num]
    {:hiccup "home.clj" :content (str "home" content) :num num})

(defroad road (GET "/web-test-0.1.0-SNAPSHOT-standalone/main" handler) 
              (GET "/web-test-0.1.0-SNAPSHOT-standalone/home/:num{\\d+}" home))

(defn -main [& args]
  (log/info "---------log4j test-------")
  (jetty/run-jetty road {:port 3000}))

 可以将http参数直接路由到相应的处理函数,处理函数的结果可以制定模版渲染器
Reply all
Reply to author
Forward
0 new messages