Compojure hello world

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

###背景介绍
CompojureRing的中间件,实现了request的路由功能。

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
(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。

####增加引用

1
2
3
4
5
6
7
8
9
10
(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上也可以不增加。

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

####静态资源
通过

1
(route/resources "/")

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

###run

####默认ring启动
现在使用命令

1
lein ring server

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

####jetty 启动
使用如下命令:

1
2
3
lein deps
lein compile
lein uberjar

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

1
java -jar XX-standalone.jar

就可以在jetty中启动项目。

###Reference

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