成熟したClojure Webフレームワークの現在の選択肢は何ですか?私は、人気のあるフレームワークが何をサポートしているのか、どの程度サポートしているのかを示す、ある種の機能マトリックスを探しています。
おそらく 私の答え からClojureでRESTful Webサービスを開発するための良い出発点は何ですか?の質問SOが役立つかもしれません。Clojureのいくつかの重要なWebライブラリに言及しています(リンクと短い要約付き)。ここで繰り返し述べたい要点は、その回答の最初の段落に記載されています。
まず、Clojureでこれをすべて行うための単一のシュリンクラップされたソリューションを見つけることはほとんどないと思います(Javaライブラリを相互運用機能で使用するための形式を除く))。 Clojureの標準のWebスタックは、人々がさまざまな方法で混合して一致する多数のライブラリで構成されています(完全に互換性がある傾向があるため)。
これに加えて、Javaからわかるような「アプリケーションフロー」のようなものを処理することをおそらく期待しないでください(または、本当に必要であると確信している場合は、おそらくそれをサポートするには、独自のlibをロールバックする必要があります!)しかし、リングのハンドラーは関数であり、高次のミドルウェアフレンドリーなアプローチに非常に満足しているようです。
弾丸に対処するには:
応答テンプレート:
Enlive および Hiccup を含むClojure固有のソリューションがいくつかあります(Enliveは非常に強力なHTMLスクレイピング/テンプレート/変換エンジンです; HiccupはClojureでHTMLを作成するためのDSLであり、レンダリングするNiceプロパティを備えていますfast)。また、これはおそらくJavaにドロップして、たとえば StringTemplate のようなものを使用することは完全に理に適った場所です。テンプレートとロジックの混在!(スチュアートハロウェイは、Relevance(彼の会社)がこの戦略を仕事で使用しており、大きな成功を収めていると述べています)
HTTPセッション
それは Sandbar になると思います。著者は 一連のブログ投稿 について始めました。これは非常に有望に見えます。
URLをアクション関数とパラメーターに自動マッピングするREST
それは Ring & Compojure または Moustache です。下記参照。
HTMLフォーム(マップ、エラー処理、検証として使用可能なパラメーター)
上記のように。
アプリケーションフロー(Javaフレームワークから知られている-要求ハンドラは、レンダラーによって最終的に処理されるアクション識別子を返す)
上記のように、Clojureで実際に行われる傾向のあるものではありません。
ClojureのWebスタックについて学ぶ際の出発点として、 このリングのチュートリアルRing の作者であるMark McGranaghanが非常に役立ちます。 Compojure の作者James ReevesがCompojureについて 一部のドキュメント を公開しています。たぶん 私の最近の回答 からCompojureルートの背後にある「大きなアイデア」は何ですか?質問も役に立ちます。 Ringのソースには、優れたSPECドキュメントも含まれています。
この質問はもともと質問/回答されていたため、 Noir Webフレームワーク は有望な解決策として浮上しています。
テンプレート部分にhiccupを使用しますが、その周りにさらに完全なフレームワークを提供します。
Noirメインページの基本的なコードサンプル:
(ns my-app
(:use noir.core)
(:require [noir.server :as server]))
(defpage "/welcome" []
"Welcome to Noir!")
(server/start 8080)
Luminus を使用することをお勧めします。これは、そのすばらしい名前のためではなく、その機能のためです。
そして、Noirはもうメンテナンスされていないので、それを使用することはお勧めしません。独自のフレームワークを構築するために、最初からring&Compojureから始めることも良い選択です。
高速なウェブ開発のためのロードフレームワークを試す 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}))
あなたは間違った質問をしているかもしれません。私の質問には、「ClojureフレームワークはJava慣れ親しんだオブジェクト指向フレームワーク?)のようなものです」と表示されます。ステートフルなサーバー側のアプローチ(GrailsやTapestryなど)に慣れているなら、おそらくそこに留まり、バックエンドの一部をClojureに実装する方法を見つける必要があります。
一方、Clojureにより忠実なものを構築したい場合は、独自のミックスを見つけたい場合があります。私はクライアントでAngularJSとCoffeeScriptを使用し、サーバーでClojure(RingとBishopを使用)を使用して成功しました(ただし、BishopからLiberatorに移行しています)。いずれの場合でも、「単一ページ」のWebアプリアプローチを採用し、サーバー側をデータのソースおよびシンクとして扱うことを開始すると、Clojureが非常にうまく機能することがわかります。