ClojureでWebアプリケーションを作り始める #2

URLの扱い

ルートの定義

;; (http-method route-path bindings & body)
(GET "/" [] "index page")

これは、ローカルで起動した時にはhttp://locahost:8080/にアクセスした際に"index page"をステータス200で返します。

で、ルートのパターンにはパラメータを含むことができます。

(GET "/page/:name" [name] (str "You reached page/" name))

リクエストされたURIが"/page/**"にマッチすると、"**"の値が引数としてnameに格納されます。この場合、http://localhost:8080/page/testにアクセスすれば"You reached page/test"と表示されるようになります。


ルートパスの部分にはワイルドカード正規表現も使えます。正規表現を使う場合にはclout.coreを:useしておきます(route-compile関数のため)。

(GET (route-compile "/article/:n" {:n #"[0-9]+"})
  [n]
  (str "You reached " n "th article."))

(GET "/other/*" [] "You reached somewhere nice.")

【追記】
ワイルドカードを使った時のパラメータ取得

(GET "/other/*" {params :params} (str "Hello " (params "*")))

HTMLの出力

HTMLを出力する場合、hiccupというライブラリを使えばベクタでHTMLのタグ、マップで属性を表現しながら出力することが出来ます。

hiccupは、Compojureを:dependenciesに書いておけば勝手に入ってくれます。

% tree lib
lib
|-- clj-stacktrace-0.1.0.jar
|-- clojure-1.1.0.jar
|-- clojure-contrib-1.1.0.jar
|-- clout-0.2.0.jar
|-- commons-codec-1.4.jar
|-- commons-fileupload-1.2.1.jar
|-- commons-io-1.4.jar
|-- compojure-0.4.1.jar
|-- hiccup-0.2.6.jar   <-これ
.
.
.

hiccupもringと同様にCompojure-0.4.0から別ライブラリになったみたいなので、"(:use hiccup.core)"しておきます。

(defn layout-index
  [title]
  (html
    (page/doctype :html5)
    [:html {:lang "ja"}
      [:head
        [:title title]]
      [:body
        [:header.body
         [:h1 title]]
        ;; CSSぽくID,Classの指定もできる
        [:div#main
         [:h1.greet "Welcome!"]
         [:nav
          [:ul
            [:li "list1"]
            [:li "list2"]
            [:li "list3"]]]]
        [:footer.body
          [:p "copyright..."]]]]))

(defroutes serve
  (GET "/" [] (layout-index "index")))

各種doctypeがhiccup.page_helpers.clj内でdoctypeというマップで宣言されているので、こいつを(:require [hiccup.page-helpers :as page])して使いたい文書型宣言のキーを指定しています。


page_helpers.clj

(def doctype
  {:html4
   (str "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" "
        "\"http://www.w3.org/TR/html4/strict.dtd\">\n")
   :xhtml-strict
   (str "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" "
        "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n")
   :xhtml-transitional
   (str "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
        "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n")
   :html5
   "<!DOCTYPE html>"})


これで、http://localhost:8080/にアクセスすれば、生成したHTMLが返ってきます(HTMLのソースを改行する方法がよくわかりませんでした)

<!DOCTYPE html>
<html lang="ja">
<head>
  <title>index</title>
</head>
<body>
<header class="body">
  <h1>index</h1>
</header>
<div id="main">
<h1 class="greet">Welcome!</h1>
  <nav>
    <ul>
      <li>list1</li>
      <li>list2</li>
      <li>list3</li>
    </ul>
  </nav>
</div>
<footer class="body">
  <p>copyright...</p>
</footer>
</body>
</html>

多分HTML関連は、fleetEnliveみたいなテンプレートを使った方が良さそう。

まだ静的ファイルの配置がよくわかってないので、ソースを解読中・・・