断断续续学习了很久的Clojure,对语法也半生不熟的了,不过基本可以使用了,写点web的项目锻炼一下Clojure的熟练度。

背景介绍

CompojureRing的中间件,实现了request的路由功能。

建立项目

开发Clojure项目标配的Lein,使用Lein命令 lein new compojure-example,建立项目。

添加依赖

初步建立项目之后,项目中只有Clojure-core的依赖,想要使用Compojure还需要添加相关的依赖。在project.clj中新增依赖:

[org.clojure/clojure "1.6.0"]
[compojure "1.1.6"]
[ring/ring-core "1.2.1"]
[ring/ring-jetty-adapter "1.2.1"]

增加完依赖,需要增加ring的一些插件,便于使用一些命令

  :plugins [[lein-ring "0.8.10"]]

完成了上述配置之后,project.clj文件如下:

(defproject compojure-example "0.1.0"
  :description "Example Compojure project"
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [compojure "1.1.6"]
                 [ring/ring-core "1.2.1"]
                 [ring/ring-jetty-adapter "1.2.1"]
                 [hiccup "1.0.0"]]
  :plugins [[lein-ring "0.8.10"]]
  :ring {:handler compojure.example.routes/app})

routes

先写一个简单的hello world。

增加引用

(ns compojure.example.routes
   (:gen-class)
  (:use compojure.core
        ring.adapter.jetty
        compojure.example.views
        [hiccup.middleware :only (wrap-base-url)]
        ring.adapter.jetty)
  (:require [compojure.route :as route]
            [compojure.handler :as handler]
            [compojure.response :as response]))

ring.adapter.jetty为了将应用跑在jetty上,当然如果不需要运行在jetty上也可以不增加。

(defroutes app-routes
           (GET "/" [] ("hello world")
           (route/resources "/")
           (route/not-found "Page not found")))
(run-jetty main-routes {:port 5050})              

静态资源

通过

(route/resources "/")

的方式可以访问项目中的静态文件(如js,css,html,img)等。

run

默认ring启动

现在使用命令

lein ring server

就可以运行项目,web项目将默认以3000启动。

jetty 启动

使用如下命令:

lein deps
lein compile
lein uberjar

如上之后,在项目的target目录下会有XX-standalone.jar,使用命令

java -jar XX-standalone.jar

就可以在jetty中启动项目。

Reference

Compojure wiki
Compojure API
Ring Spec
Clojure-doc Basic web Development