Compojureは、Webアプリケーションを開発するための完全なフレームワークではなくなりました。0.4リリース以降、compojureはいくつかのプロジェクトに分割されています。
Ringは、HTTP要求と応答プロセスを抽象化することで基盤を提供します。Ringは着信リクエストを解析し、uri、server-name、request-methodなどのリクエストのすべての部分を含むマップを生成します。次に、アプリケーションは要求を処理し、要求に基づいて応答を生成します。応答は、ステータス、ヘッダー、本文のキーを含むマップとして表されます。したがって、単純なアプリケーションは次のようになります。
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Ringのもう1つの部分は、ミドルウェアの概念です。これは、ハンドラーと着信要求および/または発信応答の間に位置するコードです。一部の組み込みミドルウェアには、セッションとスタックトレースが含まれます。セッションミドルウェアは、リクエストを行うユーザーのすべてのセッション情報を含むリクエストセッションマップに:sessionキーを追加します。:sessionキーが応答マップに存在する場合、現在のユーザーが次に行う要求のために保存されます。スタックトレースミドルウェアは、要求の処理中に発生した例外をキャプチャし、例外が発生した場合に応答として返されるスタックトレースを生成します。
Ringを直接操作するのは面倒な場合があるため、CompojureはRingの上に構築され、詳細を抽象化しています。これでアプリケーションをルーティングの観点から表現できるので、次のようなものを作成できます。
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojureはまだ要求/応答マップを処理しているので、必要に応じていつでもアクセスできます。
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
この場合、{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)))
以下は、compojureの作成者が現在作成している、参考になる可能性があるいくつかのドキュメントのラフドラフトへのリンクです。CompojureDoc