成熟的Clojure Web框架?

时间:2010-08-23 21:22:32

标签: frameworks clojure web-frameworks

成熟的Clojure Web框架目前有哪些选择?我正在寻找某种特征矩阵,告诉我流行的框架支持什么程度,包括:

  • 响应模板(用Clojure或其他一些标记编写的响应 - 例如像带有Tiles的JSP)
  • HTTP会话
  • REST自动将URL映射为action-functions和params
  • HTML表单(params可用作地图,错误处理,验证)
  • 应用程序流(从Java框架中获知 - 请求处理程序返回最终由呈示器处理的操作标识符)

5 个答案:

答案 0 :(得分:33)

或许 在Clojure中开发RESTful Web服务的良好起点是什么?关于SO的问题可能对您有所帮助。它提到了Clojure的一些重要的Web库(带有链接和简短的摘要)。我想在此重申的关键点在答案的第一段中说明:

  

首先,我认为你不太可能在Clojure中找到一个单独的收缩包解决方案(除了通过互操作使用的Java库的形式)。什么成为Clojure的标准Web堆栈包含许多人们以各种方式混合和匹配的库(因为他们很乐意与之完全兼容)。

为此,我想补充一点,你可能不应该期望用Java可能知道的那种“应用程序流”来处理事情(或者如果你认为你真的需要它,你可能不得不推出自己的lib支持它!)。不过,没关系,因为人们似乎对Ring的处理程序非常满意,这是一种功能更高,中间件更友好的方法。


解决你的子弹问题:

  • 响应模板:
    有许多特定于Clojure的解决方案,包括my answerEnlive(Enlive是一个非常强大的HTML抓取/模板/转换引擎; Hiccup是一个用于在Clojure中编写HTML的DSL,具有很好的属性它呈现快速)。此外,这可能是下载到Java并使用类似Hiccup之类的东西的完美意义的地方。这甚至可以阻止模板和逻辑的混合! (我相信Stuart Halloway已经提到Relevance - 他的公司 - 在他们的工作中使用这个策略并且在它上面取得了很大的成功。)

  • HTTP会话
    我想这将是StringTemplate。作者已经开始Sandbar,看起来很有希望。

  • REST,自动将URL映射为动作 - 函数和参数
    这是a series of blogposts& Ring和/或Compojure。见下文。

  • HTML表单(params可用作地图,错误处理,验证)
    如上所述。

  • 应用程序流程(从Java框架中获知 - 请求处理程序返回最终由呈示器处理的操作标识符)
    如上所述,并不是人们在Clojure中所做的事情。


作为了解Clojure网络堆栈的起点,Moustache的作者Mark McGranaghan this Ring tutorial非常有帮助。 Ring的作者James Reeves在Compojure上Compojure。也许some documentation对于组合路线背后的“大创意”是什么?问题可能也有帮助。 Ring的资料还包括一份很棒的SPEC文件。

答案 1 :(得分:14)

由于最初询问/回答了这个问题,Noir web framework已成为一种很有前景的解决方案。

它使用打嗝作为模板部分,但提供了一个更完整的框架。

Noir主页的基本代码示例:

(ns my-app
  (:use noir.core)
  (:require [noir.server :as server]))

(defpage "/welcome" []
    "Welcome to Noir!")

(server/start 8080)

答案 2 :(得分:8)

我建议你使用Luminus,不是因为它的名字很棒,而且还有它的功能。

由于Noir不再维护,我不建议您使用它。 从戒指和戒指入手也是一个不错的选择。从一开始就构建自己的框架。

答案 3 :(得分:1)

你可能会问错误的问题。我在你的问题中看到的是“Clojure框架最像我习惯的Java面向对象框架?”。对此没有好的答案;如果你只对状态良好的服务器端方法(例如Grails或Tapestry)感到满意,那么也许你应该留在那里,并找到一种在Clojure中实现你的后端的方法。

另一方面,如果你想为Clojure建立更真实的东西,你可能想要找到自己的混合物。我在客户端上使用AngularJS和CoffeeScript以及在服务器上使用Clojure(使用Ring和Bishop)取得了一些成功(尽管我们正在从Bishop迁移到Liberator)。无论如何,一旦你采用“单页”Web应用程序方法并开始将服务器端视为数据源和接收器,你会发现Clojure工作得非常好。

答案 4 :(得分:1)

尝试快速网络开发https://github.com/zhujinxian/road

的道路框架
(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}))