跳转到内容

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://127.0.0.1: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))
华夏公益教科书