Compojure không còn là một khung hoàn chỉnh để phát triển các ứng dụng web. Kể từ khi phát hành 0.4, compojure đã được chia thành nhiều dự án.
Ring cung cấp nền tảng bằng cách trừu tượng hóa quá trình yêu cầu và phản hồi HTTP. Ring sẽ phân tích yêu cầu đến và tạo một bản đồ chứa tất cả các phần của yêu cầu như uri, tên máy chủ và phương thức yêu cầu. Sau đó, ứng dụng sẽ xử lý yêu cầu và dựa trên yêu cầu tạo ra phản hồi. Một phản hồi được thể hiện dưới dạng bản đồ chứa các khóa sau: trạng thái, tiêu đề và nội dung. Vì vậy, một ứng dụng đơn giản sẽ trông như sau:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Một phần khác của Ring là khái niệm về kho trung gian. Đây là mã nằm giữa trình xử lý và yêu cầu đến và / hoặc phản hồi đi. Một số được xây dựng trong kho trung gian bao gồm các phiên và stacktrace. Phần giữa phiên sẽ thêm khóa: phiên vào sơ đồ yêu cầu chứa tất cả thông tin phiên cho người dùng thực hiện yêu cầu. Nếu khóa: phiên có mặt trong bản đồ phản hồi, nó sẽ được lưu trữ cho yêu cầu tiếp theo được thực hiện bởi người dùng hiện tại. Mặc dù kho trung gian theo dõi ngăn xếp sẽ nắm bắt bất kỳ trường hợp ngoại lệ nào xảy ra trong khi xử lý yêu cầu và tạo ra dấu vết ngăn xếp được gửi lại dưới dạng phản hồi nếu có bất kỳ ngoại lệ nào xảy ra.
Làm việc trực tiếp với Ring có thể rất tẻ nhạt, vì vậy Compojure được xây dựng trên đỉnh của Ring trừu tượng hóa các chi tiết. Bây giờ ứng dụng có thể được thể hiện dưới dạng định tuyến để bạn có thể có một cái gì đó như thế này:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure vẫn hoạt động với các bản đồ yêu cầu / phản hồi để bạn luôn có thể truy cập chúng nếu cần:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
Trong trường hợp này, phần {uri: uri} truy cập khóa: uri trong bản đồ yêu cầu và đặt uri thành giá trị đó.
Thành phần cuối cùng là Hiccup giúp tạo html dễ dàng hơn. Các thẻ html khác nhau được biểu diễn dưới dạng vectơ với phần tử đầu tiên đại diện cho tên thẻ và phần còn lại là phần thân của thẻ. "<h2>A header</h2>"
trở thành [:h2 "A Header"]
. Các thuộc tính của thẻ nằm trong một bản đồ tùy chọn. "<a href='/login'>Log In Page</a>"
trở thành [:a {:href "/login"} "Log In Page"]
. Đây là một ví dụ nhỏ sử dụng mẫu để tạo 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)))
Đây là một liên kết đến một bản thảo sơ bộ của một số tài liệu hiện đang được viết bởi tác giả của compojure mà bạn có thể thấy hữu ích: Compojure Doc