我想这对于每天使用Java工作的绝大多数程序员来说都是一个奇怪的问题.我不.我知道Java-the-language,因为我从事过Java项目,但不是Java-the-world.我从未在Java中从头开始创建Web应用程序.如果我必须使用Python,Ruby,我知道去哪里(Django或Rails),但如果我想在Clojure中创建一个Web应用程序,不是因为我被迫生活在Java世界中,而是因为我喜欢语言,我想尝试一下,我应该使用哪些库和框架?
Ros*_*ard 178
Compojure不再是开发Web应用程序的完整框架.自0.4发布以来,compojure已被分解为几个项目.
Ring通过抽象出HTTP请求和响应过程来提供基础.Ring将解析传入的请求并生成包含请求的所有部分的映射,例如uri,server-name和request-method.然后,应用程序将处理该请求,并根据请求生成响应.响应表示为包含以下键的映射:status,headers和body.所以一个简单的应用程序看起来像:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Run Code Online (Sandbox Code Playgroud)
Ring的另一部分是中间件的概念.这是位于处理程序与传入请求和/或传出响应之间的代码.一些内置的中间件包括会话和堆栈跟踪.会话中间件将向请求映射添加:会话密钥,其中包含发出请求的用户的所有会话信息.如果:会话密钥存在于响应映射中,则它将被存储以用于当前用户发出的下一个请求.堆栈跟踪中间件将捕获处理请求时发生的任何异常,并生成堆栈跟踪,如果发生任何异常,则将其作为响应发回.
直接使用Ring可能很繁琐,因此Compojure构建在Ring之上,抽象出细节.现在可以用路由表示应用程序,这样你就可以得到这样的东西:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Run Code Online (Sandbox Code Playgroud)
Compojure仍然使用请求/响应映射,因此您可以随时访问它们:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,{uri:uri}部分访问请求映射中的:uri键并将uri设置为该值.
最后一个组件是Hiccup,这使得生成html更容易.各种html标记表示为向量,第一个元素表示标记名称,其余元素是标记的主体."<h2>A header</h2>"成为[:h2 "A Header"].标记的属性位于可选地图中."<a href='/login'>Log In Page</a>"成为[:a {:href "/login"} "Log In Page"].这是一个使用模板生成html的小例子.
(defn layout [title & body]
(html
[:head [:title title]]
[:body [:h1.header title] body]))
(defn say-hello [name]
(layout "Welcome Page" [:h3 (str "Hello " name)]))
(defn hiccup-routes
(GET "/user/:name" [name] (say-hello name)))
Run Code Online (Sandbox Code Playgroud)
以下是一篇关于compojure作者目前正在撰写的一些文档草稿的链接,您可能会发现这些文档很有帮助:Compojure Doc
小智 103
到目前为止,我遇到的最好的Clojure Web框架是Compojure:http://github.com/weavejester/compojure/tree/master
它体积小但功能强大,语法优美.(它在引擎盖下使用Jetty,但除非你需要它,否则它会隐藏你的Servlet API,这不会经常发生).去查看该URL的README,然后下载快照并开始播放.
eli*_*rar 48
还有"Noir"(http://www.webnoir.org/),这是一个新的Clojure Web框架(所以新的文档还没有).来自Django/Rails,我挖掘了简单,直接的语法,它非常精简.
nha*_*nha 20
我现在的网络图书馆现在是yada.
如果您刚刚开始,介绍服务器是Compojure.我认为它是apacheClojure世界中的Web服务器(在这种情况下,yada/aleph将是nginx).您可以将其Luminus用作模板.有它的变种,比如compojure-api.
我试过了,Pedestal并对它感到满意.我没有声称掌握它,但它具有令人愉快的语法,感觉非常有凝聚力,并且看起来确实具有很好的性能.它也得到了Cognitect(Rich Hickey工作的Clojure/Datomic公司)的支持.
我发现Aleph了一个有趣的抽象,内置的背压似乎很有趣.我还没有玩它,但它肯定在我的名单上.
在使用各种Web服务器播放之后,这是我的快速Pro/Cons列表:
简短的回答:看看Luminus快速入门,或许随着你的需求的变化继续前进(Yada也许).
优点(1):
缺点(2):
优点(3):
缺点(4):
专业(3):
缺点(1):
专业(3):
缺点(1):
专业(2):
缺点(2):
注意:我没有玩过它,主要是因为缺少文档.虽然它看起来很有趣,但性能非常好.
优点(2):
缺点(1):
注意:我没玩过它.
优点:
缺点:
注意:虽然文档看起来很棒,但我还没有玩过它.我可能会接下来尝试一下.有一些示例聊天项目看起来很有趣,他们大量使用协议使我最初成为新手Clojure dev.
优点(6):
缺点(2):
注意:如果原始性能非常重要,可以使用Clojure Web服务器的基准测试.
小智 8
Compojure是我用来构建一个小型博客应用程序的东西.它以Sinatra为蓝本,它是Ruby的最小,轻量级Web框架.我大多只使用路由,这就像Sinatra的.看起来像:
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
Run Code Online (Sandbox Code Playgroud)
没有ORM或模板库,但它确实具有将向量转换为HTML的功能.