Breaking changes in compojure 0.6.0

在compojure 0.6.0里,默认的middleware被移除了。因为还没有正式发布,所以网上几乎没有相关的文档说明,而0.5.x的例子已经没能正常工作了。

;...
(defroutes root
    (GET "/" {params :params} (str params)))

(run-jetty root {:port 8080}))

这样在0.5.x中可以正确运行的代码,在0.6.0中params变成了空的map。

在0.6.0中,compojure引入了一个新的ns叫做compojure.handler,其中包含两个function, api和site,它们包含了一些默认的middleware,适合相应的开发场景。为了让代码能够工作,在新版本中:

;...
(use 'compojure.handler)
(defroutes root
    (GET "/" {params :params} (str params)))

(def app (site root))

(run-jetty root {:port 8080}))

详细可以在这里找到
https://groups.google.com/group/compojure/browse_thread/thread/4f8574d808ddf53e

My First Hello World Web App Using Compojure

Compojure是一个用Clojure写成的类似Sinatra的Web框架。Leiningen是一个新的Clojure构建工具,它用Maven来处理依赖管理,而通过封装Lancet(基于Ant)来实现build-in的task。

以上是背景介绍。以下是HelloWorld。

创建一个目录作为工程目录

mkdir compojure-app
cd compojure-app

像创建build.xml和pom.xml一样创建project.clj

(defproject info.sunng/compojure-app "0.0.1"
        :description "A demo app running on compojure framework"
        :dependencies [[org.clojure/clojure "1.1.0"]
                        [org.clojure/clojure-contrib "1.1.0"]
                        [compojure "0.3.2"]]
        :dev-dependencies [[leiningen/lein-swank "1.1.0"]]
        :main info.sunng.compojureapp.helloworld)

首行定义了项目的groupId, artifactId和version,其后的是maven风格的依赖定义,最后我们还定义了程序的主类。

这个helloworld只有一个文件,被放在src/info/sunng/compojureapp/目录下

(ns info.sunng.compojureapp.helloworld (:gen-class) (:use compojure))

(defroutes example-routes
    (GET "/" "Hello W0rld")
    (ANY "*" [404 "Page Not Found"]))

(defn -main []
    (run-server {:port 8080} "/*" (servlet example-routes)))

中间就是Sinatra风格的URL映射定义,最后在主类中通过一个run-server方法以嵌入式的方式运行一个jetty

回到工程目录,执行构建

lein deps
lein compile
lein uberjar

通过uberjar可以将依赖通通打入一个jar包中,接着就可以通过
java -jar compojure-app-standalone.jar
启动你的Web程序了,很酷吧

除了这种方式,还可以通过
lein swank
启动一个swank server(project.clj中定义了dev-dependency),再用Emacs的SLIME交互式地运行程序。

参考