Hello Clojure!

GAEでClojureを使う場合、Compojureとappengine-cljを使って作るべきなのでしょうが、初めあえてスッピンのClojureHello Worldを表示してみます。

new_project_templateのコピー

適当な場所にnew_project_templateをコピーし、適当な名前を変更します。ここでは"hello-clojure"という名前に変更したとします。

clojure.jar

http://code.google.com/p/clojure/から、clojure-1.1.0.zipをダウンロードします。clojure-1.1.0.zipを解凍した中にあるclojure.jarを適当な場所においておきます。

HelloClojureServlet.clj

hello-clojure\src\org\exampleにHelloAppEngineServlet.javaというソースファイルがあります。

//HelloAppEngineServlet.java
package org.example;

import java.io.IOException;
import javax.servlet.http.*;

public class HelloAppEngineServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		resp.setContentType("text/plain");
		resp.getWriter().println("Hello, world");
	}
}

これと同じ事をClojureで書いてみます。

;HelloClojureServlet.clj
(ns org.example.HelloClojureServlet
  (:gen-class
   :extends
   javax.servlet.http.HttpServlet))

(defn -doGet [this req resp]
  (do
    (.setContentType resp  "text/plain")
    (.println (.getWriter resp) "Hello, Clojure!")))

このHelloClojureServlet.cljを、HelloAppEngineServlet.javaと同じ、
hello-clojure\src\org\exampleにおいておきます。

build.xml

<!--location="../.."を、appengine-java-sdkの場所に書き換る -->
<property name="appengine.sdk" location="C:\Program Files\appengine-java-sdk"/>

<!-- clojrue.jarのある場所のプロパティを追加 -->
<property name="clojure.lib" location="C:\Program Files\clojure\lib"/>

  ・・・

  <target name="compile"
          description="Compile the application servlet code">

        ・・・
     
     <!-- HelloClojureServlet.cljをコンパイルするコードを追加-->
     <java classname="clojure.lang.Compile" failonerror="true">
       <classpath>
        <fileset dir="${appengine.sdk}/lib/user">
          <include name="*.jar"/>
        </fileset>
        <fileset dir="${appengine.sdk}/lib/shared">
          <include name="*.jar"/>
        </fileset>
        <fileset dir="${clojure.lib}">
          <include name="*.jar"/>
        </fileset>
        <path location="${war.dir}/WEB-INF/classes"/>
        <path location="src"/>
       </classpath>
       <sysproperty key="clojure.compile.path" value="${war.dir}/WEB-INF/classes"/>
       <arg value="org.example.HelloClojureServlet"/>
     </java>
  </target>

        ・・・
</project>

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5"> 
  <display-name>New Project Template</display-name>
  
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>org.example.HelloAppEngineServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/helloappengine</url-pattern>
  </servlet-mapping>
  
  <!--HelloClojureServletへのマッピングを追加 -->
  <servlet>
    <servlet-name>clojure</servlet-name>
    <servlet-class>org.example.HelloClojureServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>clojure</servlet-name>
    <url-pattern>/clojure</url-pattern>
  </servlet-mapping>
</web-app>

Antの実行

$> ant runserver

http://localhost:8080/clojure
を開くと、「Hello, Clojure!」が表示されるはずです。