рдЖрдЬ рдореИрдВ рдХреНрд▓реВрдЬреБрд░ рднрд╛рд╖рд╛ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдХреЛрдИ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдФрд░ рдЯреНрд░реЗрдВрдбреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХрдИ рдЖрджрд┐рдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдорд╛рд░реНрдЧ, рдорд╛рдкрджрдВрдбреЛрдВ, рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдХреБрдЫ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдмрдирд╛рддрд╛ рд╣реИ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИред
рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдлреЙрд░реНрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдореВрд▓реНрдп рд▓реЗрдЧрд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рджреВрд╕рд░рд╛ рд▓реЗрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред рдореВрд░реНрдЦ, рдмреЗрдХрд╛рд░ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реНрдХ рдирд╣реАрдВ - рдореБрдЭреЗ рдкрддрд╛ рд╣реИред
рдХреНрд▓реЛрдЬрд░ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреНрд▓реЛрдЬрд░ рдФрд░ рдХрдИ рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
рдХреНрд▓реЛрдЬрд╝ ,
SUDDENLY ,
рд▓реЗрдирд┐рдВрдЧрди рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рджрд░рдЕрд╕рд▓, рдХреНрд▓реЙрдЬреНрдпреЛрд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рддреБрд░рдВрдд рдХреНрд▓реЙрдЬреБрд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдирд┐рдВрдЧрди рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛, рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╕рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╢реНрд░реЗрдгреА рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрдЬрд░ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП
, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреГрд╖реНрда рдпрд╛
рдПрд▓реЗрдХреНрд╕ рдУрдЯ рдХреЛ рднреЗрдЬреЗрдВред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
D:\dev\clojure>lein new web-clojure-demo Created new project in: D:\dev\clojure\web-clojure-demo
рдмрд╕ рдХреНрдпрд╛ рд╣реБрдЖ? рд▓реАрдирд┐рдВрдЧрди рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдпрд╛:
src/ web_clojure_demo/ core.clj test/ web_clojure_demo/ test/ core.clj .gitignore README project.clj
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо project.clj рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдЗрд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд▓реЛрдЬрд░ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ:
(defproject web-clojure-demo "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.1"]])
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирд┐рдВрдЧрди рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рдЖрдк рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬрдм
рд▓рд┐рдпрди рдбрд┐рдкреНрд╕ рдХрдорд╛рдВрдб рдХреЛ
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рд▓реЗрдирд┐рдВрдЧрди рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдм / рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
рд╣рдо рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
: рдирд┐рд░реНрднрд░рддрд╛рдПрдВ :
- clojure-contrib - рдорд╛рдирдХ рднрд╛рд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ: рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди, рд╕рдВрдЧреНрд░рд╣, рдореЛрдирд╛рдб, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рдиред
- рд░рд┐рдВрдЧ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ HTTP рдкрд░ рдХрдИ рд╕рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- compojure - рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд░рд┐рдВрдЧ рдХреЗ рдКрдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред
- clj-redis Redis рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдЗрд╕ NoSQL рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╕рдВрдмрдВрдзрдкрд░рдХ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдХреНрд▓реЛрдЭреБрд░реЗрд╕реЗрд▓ рдХреА рдУрд░ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
- enlive - рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП HTML рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕реЗ рддрд░реНрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд▓реЗрдирд┐рдВрдЧрди рдкреНрд▓рдЧрдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╕ project.clj рдореЗрдВ рдПрдХ рдФрд░ рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝реЗрдВ
: dev- рдирд┐рд░реНрднрд░рддрд╛рдПрдБ ред
рдЕрдм рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
(defproject web-clojure-demo "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.1"] [org.clojure/clojure-contrib "1.2.0"] [ring/ring-jetty-adapter "0.2.5"] [compojure "0.6.2"] [clj-redis "0.0.9"] [enlive "1.0.0-SNAPSHOT"]] :dev-dependencies [[lein-ring "0.4.0"]] :ring {:handler web-clojure-demo.core/engine})
рдЗрд╕рдХреЗ рдмрд╛рдж
src / web_clojure_demo / core.clj рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ ред рдЕрдм рддрдХ, рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдирд╛рдо рд╕реНрдерд╛рди рдХреА рдШреЛрд╖рдгрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдФрд░ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
(ns web-clojure-demo.core (:use compojure.core) (:use [ring.adapter.jetty :only [run-jetty]]) (:use [ring.util.response]) (:require [compojure.route :as route] [compojure.handler :as handler] [clj-redis.client :as redis] [net.cgrand.enlive-html :as html])) (def db (redis/init {:url "redis://127.0.0.1:6379"})) (defn parse-input [a] (Integer/parseInt a)) (html/deftemplate page-index "web_clojure_demo/index.html" [ctxt] [:title] (html/content "Awesome application") [:#old] (html/content (:old ctxt)) [:#msg2] (html/set-attr "style" "display: none")) (html/deftemplate page-summary "web_clojure_demo/index.html" [ctxt] [:title] (html/content "Awesome application") [:#old] (html/content (:old ctxt)) [:#msg2] (html/content (str "Summary is " (:sum ctxt)))) (defn summary [value] (let [old (redis/get db "value")] (redis/set db "value" value) (page-summary { :sum (+ (parse-input value) (parse-input old)) :old old}))) (defn index [] (let [old (redis/get db "value")] (page-index {:old old}))) (defroutes main-routes (GET "/" [] (index)) (POST "/some_action" [value] (summary value)) (route/not-found "Page not found")) (def engine (handler/site main-routes))
рдЖрдЧреЗ рд╣рдордиреЗ
index.html рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдбрд╛рд▓рд╛:
<html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <div> <div id="msg1">Old value: <span id="old" /></div> <div id="msg2" /> <form method="post" action="/some_action" > <input type="text" name="value" ></input><input type="submit" name="ok" ></input> </form> </div>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛, рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЯреИрдЧ рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд▓рд╛, рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдкрдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
D:\dev\clojure\web-clojure-demo>lein deps Copying 19 files to D:\dev\clojure\web-clojure-demo\lib Copying 17 files to D:\dev\clojure\web-clojure-demo\lib\dev D:\dev\clojure\web-clojure-demo>lein ring server 2011-03-31 22:23:25.125::INFO: Logging to STDERR via org.mortbay.log.StdErrLog 2011-03-31 22:23:25.125::INFO: jetty-6.1.14 2011-03-31 22:23:25.203::INFO: Started SocketConnector@0.0.0.0:3000 Started server on port 3000
рдпрджрд┐ рдЖрдк project.clj рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдордиреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝ рджреА рд╣реИ
: рд░рд┐рдВрдЧ {: рд╣реИрдВрдбрд▓рд░ рд╡реЗрдм-рдХреНрд▓реЛрдЬрд░-рдбреЗрдореЛ.рдХреЛрд░ / рдЗрдВрдЬрди} ред рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд▓реЗрдирд┐рдВрдЧрди рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЗрдирд┐рдВрдЧрди рдкреНрд▓рдЧрдЗрди рдХрдИ рд╕реНрдЯрдмреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рджреЗрдЦрддреЗ рд╣реИрдВ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
(def db (redis/init {:url "redis://127.0.0.1:6379"}))
рдпрд╣ рдХреЛрдб рд░реЗрдбрд┐рд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╣рдо рдХрд╛рдо рдХреЗ рд▓рд┐рдП DB рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред
(defroutes main-routes (GET "/" [] (index)) (POST "/some_action" [value] (summary value)) (route/not-found "Page not found")) (def engine (handler/site main-routes))
рдпрд╣ рдХреЛрдб рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкреЛрдЬрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдЗрдЯ рдореИрдХреНрд░реЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдЗрдЯреЛрдВ - рд╕рддреНрд░реЛрдВ, рдХреБрдХреАрдЬрд╝, рдорд╛рдкрджрдВрдбреЛрдВ рдЖрджрд┐ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдореБрдЦреНрдп-рдорд╛рд░реНрдЧ рд░реЗрдбрд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдХреЛрдИ рднреА рд╣реИрдВрдбрд▓рд░ рдЙрдкрдпреБрдХреНрдд
рдирд╣реАрдВ рд╣реИ ,
рдирд╣реАрдВ-рдкрд╛рдпрд╛ рдЯреНрд░рд┐рдЧрд░ рд╣реИред
(defn index [] (let [old (redis/get db "value")] (page-index {:old old}))) (defn summary [value] (let [old (redis/get db "value")] (redis/set db "value" value) (page-summary { :sum (+ (parse-input value) (parse-input old)) :old old})))
рдпреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреАрдврд╝реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдп рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
(html/deftemplate page-index "web_clojure_demo/index.html" [ctxt] [:title] (html/content "Awesome application") [:#old] (html/content (:old ctxt)) [:#msg2] (html/set-attr "style" "display: none")) (html/deftemplate page-summary "web_clojure_demo/index.html" [ctxt] [:title] (html/content "Awesome application") [:#old] (html/content (:old ctxt)) [:#msg2] (html/content (str "Summary is " (:sum ctxt))))
Deftemplate рдореИрдХреНрд░реЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ
ctxt рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, html рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рджрд┐рдП рдЧрдП рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдХрд╛рдо рд╣реИ рдпрд╛ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдмрджрд▓рд╛рд╡ рд╣реИред Enlive рдкреБрд╕реНрддрдХрд╛рд▓рдп HTML рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:






рдКрдкреНрд╕!
рдЗрд╕ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдареАрдХ рдХрд░реЛред рдХреЛрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
(html/deftemplate page-summary "web_clojure_demo/index.html" [ctxt] [:title] (html/content "Awesome application") [:#old] (html/content (:old ctxt)) [:#msg2] (html/content (if (:error ctxt) (:error ctxt) (str "Summary is " (:sum ctxt))))) (defn summary [value] (let [old (redis/get db "value")] (try (let [ a (parse-input value) b (parse-input old)] (redis/set db "value" value) (page-summary { :sum (+ ab) :old old})) (catch NumberFormatException e (page-summary {:old old :error "Number Format Exception"})))))
рдЕрдм рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрдЪрд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдЧрд░ рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ - рдореИрдВ рд▓реЗрдЦ рдХреЛ рдкреВрд░рдХ рдХрд░реВрдВрдЧрд╛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреГрдкрдпрд╛ рд╢рд░реНрдореАрд▓реА рди рд╣реЛрдВред рд╕реНрд╡рд╕реНрде рдФрд░ рдмрд╣реБрдд рдЖрд▓реЛрдЪрдирд╛ рднреА рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред