変態なWebで入力してみる
このエントリは変態アドベントカレンダー11/28のエントリです。
なんか、アドベントカレンダーが途切れそうなので、やっつけですが投稿します。
前々回に作った変態Webにフォームを付けてみました。
これで、POSTやGETの入力を取得して、動的にページに反映させることが出来ます。
ということで、さっそくindexのテンプレートはこんな感じ
index.html.fleet
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Input your name</title> </head> <body> <form action="./hentai" method="POST"> 名前を入力してください。<input type="text" name="user" /><br /> <input type="submit" /> </form> </body> </html>
ユーザに入力を促して、入力されるとページが遷移するとてもシンプルなページです。
一応fleetのテンプレートとして作りましたが、動的な処理は行っていないので、テンプレートの意味はありません。
で、これを受けて表示されるのが次のテンプレート
hentai.html.fleet
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>This is Hentai web</title> </head> <body> <h1><(data :user-name)>さん。あなたは変態です</h1> <img src="<(data :link)>" /> </body> </html>
前回のとおり、fleetでは<( )>の中にclojureのコードを埋め込めるので、入力されたuser-nameと前回同様のリンクを取得して、htmlを生成します。
で、肝になるcompojureの処理はこちら
hentai/core.clj
(ns hentai.core (:use compojure.core compojure.response fleet [ring.util.response :only (response content-type)]) (:require [compojure.route :as route] [compojure.handler :as handler])) (fleet-ns templates "templates" [:fleet :bypass]) (extend-protocol Renderable fleet.util.CljString (render [this _] (-> (response (.toString this)) (content-type "text-html; charset=UTF-8")))) (def hentai-link ["http://fs.plaync.jp/UF/image/6344/01/23/13/842/seigetsu_32446/854674_photo0.jpg" "http://yipev.com/data/img2/20110408084405/thumb_e1r73nh7fv301cd1uweinzjw.jpg" "http://fs.plaync.jp/UF/image/6344/01/23/13/842/seigetsu_32446/854662_photo0.jpg"]) (defn get-img [] (rand-nth hentai-link)) (defroutes main-routes (GET "/" _ (templates/index)) (POST "/hentai" {params :params} (templates/hentai {:link (get-img) :user-name (params :user)})) (GET "/ikemen" _ "You are ikemen") (route/resources "/") (route/not-found "Page not found")) (def app (handler/site main-routes))
肝になるのは、この部分↓
(POST "/hentai" {params :params} (templates/hentai {:link (get-img) :user-name (params :user)}))
{params :params}のところで、POSTされた値を受け取ってます。
受け取ってしまえば、後は前回の画像をテンプレートに渡すのと一緒で、
{:link (get-img) :user-name (params :user)}
を、テンプレートに渡してやればOKです。
このMapを渡すあたりが、clojureっぽいですね。
と、これだけでちょっとインタラクティブな感じになりました。
Webページにあなたの名前が乗るだけで、罵られ度が増しました。
デモはこちら↓
http://kuchitama.ddo.jp