目前成熟的Clojure Web框架有哪些选择?我希望能得到一种功能矩阵,告诉我流行框架支持什么程度的功能,包括:
- 响应模板(响应以Clojure或其他标记语言编写 -例如类似于具有Tiles的JSP)
- HTTP会话
- REST自动映射URL到操作函数和参数
- HTML表单(参数可用作映射,错误处理,验证)
- 应用程序流程(来自Java框架 -请求处理程序返回最终由渲染器处理的操作标识符)
目前成熟的Clojure Web框架有哪些选择?我希望能得到一种功能矩阵,告诉我流行框架支持什么程度的功能,包括:
或许我在SO上回答的“Clojure开发RESTful Web服务的好起点是什么?”问题的答案可以帮到你。它提到了一些重要的Clojure Web库(附有链接和简短概述)。我想在这里重申的关键点在于该回答的第一段:
首先,我认为你不太可能找到一个单一的解决方案来处理所有这些问题(除非通过interop使用Java库的形式)。正在成为Clojure标准Web堆栈的是由多个库组成的,人们可以以各种方式混合和匹配(因为它们通常是完全兼容的)。
此外,我会补充说,你可能不应该期望使用类似于Java的“应用程序流程”来处理事务(如果你确实需要,你可能需要自己编写支持它的库!)。但没关系,因为人们似乎非常喜欢Ring的“处理程序是函数”,高阶中间件友好的方法。
回答您的问题:
响应模板:
有许多Clojure特定的解决方案,包括Enlive和Hiccup(Enlive是一个非常强大的HTML抓取/模板/转换引擎;Hiccup是用Clojure编写HTML的DSL,具有渲染快速的优点)。此外,这可能是一个完美的地方,可以转到Java并使用类似StringTemplate的东西。这甚至有一个好的副作用,防止了模板和逻辑混合!(我相信Stuart Halloway已经提到过Relevance-他的公司-正在使用这种策略,并且取得了巨大的成功。)
HTML表单(可用作map的参数,错误处理,验证)
如上所述。
应用程序流程(从Java框架中知道-请求处理程序返回最终由渲染器处理的操作标识符)
如上所述,这不是人们倾向于在Clojure中做的事情。
.setAttribute
,这足够简单,可以与Clojure中的doseq
和映射一起使用)。 - Michał Marczyk(ns my-app
(:use noir.core)
(:require [noir.server :as server]))
(defpage "/welcome" []
"Welcome to Noir!")
(server/start 8080)
尝试使用Road框架进行快速Web开发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}))