Compojure nie jest już kompletnym środowiskiem do tworzenia aplikacji internetowych. Od wydania wersji 0.4 komponowanie zostało podzielone na kilka projektów.
Pierścień stanowi podstawę, wyodrębniając proces żądania i odpowiedzi HTTP. Pierścień przeanalizuje przychodzące żądanie i wygeneruje mapę zawierającą wszystkie części żądania, takie jak nazwa użytkownika, nazwa serwera i metoda żądania. Aplikacja obsłuży następnie żądanie i na podstawie żądania wygeneruje odpowiedź. Odpowiedź jest reprezentowana jako mapa zawierająca następujące klucze: status, nagłówki i treść. Prosta aplikacja wyglądałaby następująco:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Inną częścią Ringa jest koncepcja oprogramowania pośredniego. Jest to kod umieszczony między modułem obsługi i przychodzącym żądaniem i / lub odpowiedzią wychodzącą. Niektóre z wbudowanych programów pośrednich obejmują sesje i stacktrace. Oprogramowanie sesji doda klucz: sesja do mapy żądań, która zawiera wszystkie informacje o sesji dla użytkownika wysyłającego żądanie. Jeśli klucz sesji: jest obecny na mapie odpowiedzi, zostanie zapisany dla następnego żądania złożonego przez bieżącego użytkownika. Podczas gdy oprogramowanie pośredniczące śledzenia stosu przechwytuje wszelkie wyjątki występujące podczas przetwarzania żądania i generuje dane śledzenia stosu, które są odsyłane jako odpowiedź, jeśli wystąpią jakiekolwiek wyjątki.
Bezpośrednia praca z Pierścieniem może być żmudna, dlatego Compojure jest zbudowany na Pierścieniu , który usuwa szczegóły. Aplikacja może być teraz wyrażona w kategoriach routingu, dzięki czemu możesz mieć coś takiego:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure nadal pracuje z mapami zapytań / odpowiedzi, więc zawsze możesz uzyskać do nich dostęp w razie potrzeby:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
W tym przypadku część {uri: uri} uzyskuje dostęp do klucza: uri w mapie żądań i ustawia wartość uri na tę wartość.
Ostatnim komponentem jest czkawka, która ułatwia generowanie html. Różne znaczniki html są reprezentowane jako wektory, przy czym pierwszy element reprezentuje nazwę znacznika, a pozostała część jest znacznikiem. "<h2>A header</h2>"
staje się [:h2 "A Header"]
. Atrybuty znacznika znajdują się na opcjonalnej mapie. "<a href='/login'>Log In Page</a>"
staje się [:a {:href "/login"} "Log In Page"]
. Oto mały przykład użycia szablonu do wygenerowania 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)))
Oto link do wstępnego szkicu pewnej dokumentacji obecnie pisanej przez autora kompozycji, która może być dla Ciebie pomocna: Dokument Compojure