跳轉到內容

Compojure/入門

來自華夏公益教科書

從原始碼構建

[編輯 | 編輯原始碼]

要下載和構建 Compojure,您需要 Git (git)、Leiningen (lein) 和 Java 執行時環境 (java)。

download latest release from git (ex https://github.com/weavejester/compojure.git)
cd compojure
lein deps
lein jar

這將生成compojure.jar檔案。將此檔案放到您的 Java 類路徑中。

depslein 目標將下載所需的依賴項。如果失敗,您可以從以下地址手動下載它們:

http://cloud.github.com/downloads/weavejester/compojure/deps.zip

compojure目錄中解壓縮該檔案並重新執行lein.

使用嵌入式 Jetty 的“Hello World”

[編輯 | 編輯原始碼]

建立一個名為“compojure”的 shell 指令碼,用於執行 Clojure,其中包含compojure.jar以及deps目錄在類路徑中

#!/bin/sh
CLASSPATH=compojure.jar
 
for f in deps/*.jar; do
    CLASSPATH=$CLASSPATH:$f
done
 
java -cp $CLASSPATH clojure.lang.Script $1

或者,對於 Windows

@echo off
SETLOCAL enabledelayedexpansion

FOR %%F IN (deps/*.jar) DO (
  SET cp=!cp!;deps/%%F%
)

java -cp "compojure.jar;%cp%" clojure.lang.Repl %1%

然後建立一個名為“hello.clj”的 Clojure 原始檔

(ns hello-world
  (:use compojure))

(defroutes greeter
  (GET "/"
    (html [:h1 "Hello World"])))

(run-server {:port 8080}
  "/*" (servlet greeter))

接下來,使用compojureshell 指令碼

./compojure hello.clj

您的 Web 應用程式現在應該可以訪問:https://:8080/

在 WAR 檔案中的“Hello World”

[編輯 | 編輯原始碼]

首先,建立您的 servlet 檔案

;; src/myapp/MyServlet.clj
(ns myapp.MyServlet
  (:use compojure)
  (:gen-class
    :extends javax.servlet.http.HttpServlet))

(defroutes greeter
  (GET "/"
    (html [:h1 "Hello world"])))

(defservice greeter)

接下來,建立您的 WEB-INF 目錄

mkdir -p WEB-INF/lib WEB-INF/classes

將 compojure.jar、clojure-contrib.jar 和 clojure.jar 複製到 WEB-INF/lib。

現在您需要建立 WEB-INF/web.xml

<web-app>
 <servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>myapp.MyServlet</servlet-class>
 </servlet>
 <servlet-mapping>
   <servlet-name>myservlet</servlet-name>
   <url-pattern>/*</url-pattern>
 </servlet-mapping>
</web-app>

最後,編譯 WAR 檔案。這是一個執行此操作的 Ant 構建指令碼

 <project name="myapp" basedir="." default="war">
   <property name="build.dir" value="WEB-INF/classes" />
   <property name="source.dir" value="src" />
   <property name="lib.dir" value="WEB-INF/lib" />
   <property name="servlet-api.jar" value="/usr/share/java/servlet-2.3.jar" />
   <property name="warfile" value="myapp.war" />

   <target name="compile">
     <java classname="clojure.lang.Compile">
       <classpath>
         <path location="${build.dir}"/>
         <path location="${source.dir}"/>
         <fileset dir="${lib.dir}">
           <include name="*.jar"/>
         </fileset>
         <path location="${servlet-api.jar}"/>
       </classpath>
       <sysproperty key="clojure.compile.path" value="${build.dir}"/>
       <arg value="myapp.MyServlet"/>
     </java>
   </target>

   <target name="war" depends="compile">
     <war warfile="${warfile}" webxml="WEB-INF/web.xml">
       <classes dir="${build.dir}"/>
     </war>
   </target>
 </project>

更詳細的示例

[編輯 | 編輯原始碼]

這是一個簡單的計算器示例。

(ns example 
  (:use compojure)) 

(defn html-doc 
  [title & body] 
  (html 
    (doctype :html4) 
    [:html 
      [:head 
        [:title title]] 
      [:body 
       [:div 
	[:h2 
	 ;; Pass a map as the first argument to be set as attributes of the element
	 [:a {:href "/"} "Home"]]]
        body]])) 


(def sum-form 
  (html-doc "Sum" 
    (form-to [:post "/"] 
      (text-field {:size 3} :x) 
      "+" 
      (text-field {:size 3} :y) 
      (submit-button "=")))) 

(defn result 
  [x y] 
  (let [x (Integer/parseInt x) 
        y (Integer/parseInt y)] 
    (html-doc "Result" 
      x " + " y " = " (+ x y)))) 

(defroutes webservice
  (GET "/" 
    sum-form) 
  (POST "/" 
    (result (params :x) (params :y)))) 

(run-server {:port 8080} 
  "/*" (servlet webservice))
華夏公益教科書