Hello Clojure!
GAEでClojureを使う場合、Compojureとappengine-cljを使って作るべきなのでしょうが、初めあえてスッピンのClojureでHello 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>