Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache >...

45
Clojure-Web-Applikationen für Beginner BOB 2016

Transcript of Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache >...

Page 1: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Clojure-Web-Applikationen für Beginner

BOB 2016

Page 2: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Michael Vitz

[email protected]

Consultant @ innoQ

@michaelvitz

Page 3: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

27.04.10 14:17http://upload.wikimedia.org/wikipedia/en/1/1a/Clojure-glyph.svg

Page 1 of 1

Page 4: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Clojure

> Lisp-Variante auf JVM

> Funktionale Sprache

> Dynamisch typisiert

> komplettes mächtiges Macrosystem

Page 5: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Datenstrukturen

“Hello World"

3 3.14 3/2

\a

:firstfoo

#“Ch.*se”

(“Hello”, :first)

[3 4 3]{ :name “Michael”,

:company “innoQ” } #{3 4 3}

Page 6: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Syntax

“You’ve just seen it” - Rich Hickey

Page 7: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Funktionen(+ 1 2) > 3

(:city {:name “innoQ” :city “Monheim”}) > “Monheim”

(map inc [1 2 3]) > (2 3 4)

Page 8: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Funktionen

(fn [x y] (+ x y))

(def add (fn [x y] (+ x y)))

(defn add [x y] (+ x y))

Page 9: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Links

> http://clojure.org

> blog.cognitect.com/blog/2016/1/28/state-of-clojure-2015-survey-results

> https://juxt.pro/radar.html

> http://www.clojure-toolbox.com

Page 10: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Web-Applikationen

Page 11: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Web-Applikation

AppRequest

Response

Page 12: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Web-Applikation

App(Request) = Response

Page 13: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Web-Applikation(defn greet-controller [request] {:status 200 :headers {“Content-Type” “text/plain”} :body “Hello, world!”})

Page 14: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring

https://github.com/ring-clojure/ring

Page 15: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring

Request

ResponseRing App

Page 16: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring: Handler(defn greet-controller [request] {:status 200 :headers {“Content-Type” “text/plain”} :body “Hello, world!”})

Page 17: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring: Middleware(defn wrap-logging [handler] (fn [request] (print request) (let [response (handler request)] (print response) response)))

Page 18: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring: Middleware

> https://github.com/ring-clojure/ring-defaults

> https://github.com/ring-clojure/ring-json

Page 19: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring: Adapter

> Jetty

> Servlet

> http-kit

> Tomcat

> …

Page 20: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring: Request{:uri “/greet” :query-string “name=Michael” :request-method :get :headers { … } …}

Page 21: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring: Response{:status 200 :headers { … } :body “Hello, Michael!”}

Page 22: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Ring

HTTP Request

HTTP Response

Adapter

Middlew

are 1

Middlew

are 2

Middlew

are n

Handler

Request

Response

Page 23: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Compojure

https://github.com/weavejester/compojure

Page 24: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Compojure

Request

ResponseRing

Compojure

App

Page 25: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Compojure: Handler(def handler (GET “/hello” [] “Hello, world!”))

(handler {:request-method :get, :uri “/hello”}) > {:body “Hello, world!”}

(handler {:request-method :post, :uri “/hello”}) > nil

Page 26: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Exkurs: Macros

Page 27: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Clojure: Macros

“(case 3 1 “one” 2 “two” “more”)”

ReaderText Data Structures

(case 3 1 “one” 2 “two” “more”)

Page 28: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Clojure: Macros

EvaluatorData Structures

(case 3 1 “one” 2 “two” “more”)

Data Structures

(if (= 3 1) “one” (if (= 3 2) “two” “more”))

Page 29: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Zurück zu Compojure…

Page 30: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Compojure: Macro

(GET “/hello” [] “Hello, world!”)

(fn [req] (if (and (= (:uri req) “/hello”) (= (:request-method req) :get)) {:body “Hello, world!”}))

Page 31: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Compojure: Path(GET “/hello/:name” [name] (str “Hello, ” name “!”))

Page 32: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Compojure: Routes(def my-routes (routes (GET “/hello” [] “Hello!”) (GET “/bye” [] “Bye!”)))

(defroutes my-routes (GET “/hello” [] “Hello!”) (GET “/bye” [] “Bye!”))

Page 33: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Compojure: Alternativen

> https://github.com/juxt/bidi

> http://clojure-liberator.github.io/liberator/

Page 34: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Hiccup

https://github.com/weavejester/hiccup

Page 35: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Hiccup

Request

ResponseRing

Compojure

App

Hiccup

Page 36: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Hiccup: Basics[:div {:id “foo”} [:span “bar”]]

<div id=“foo”> <span>bar</span> </div>

Page 37: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Hiccup: Shortcuts[:div#foo [:span “bar”]]

<div id=“foo”> <span>bar</span> </div>

Page 38: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Hiccup: Links(link-to “www.innoq.com” “innoQ”)

<a href=“www.innoq.com”> innoQ </a>

[:a {:href “www.innoq.com”} “innoQ”]

Page 39: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Hiccup: Formulare(form-to [:post “/login”] (text-field “Username”) (password-field “Password”) (submit-button “Login”))

Page 40: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Hiccup: Alternativen

> https://github.com/danlarkin/clabango

> https://github.com/plakat/clj-thymeleaf

> https://github.com/cgrand/enlive

> https://github.com/yogthos/Selmer

Page 41: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Fazit

Page 42: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Fazit

> Funktionale Sprache ideal für Web-App

> Verbreitung nimmt zu

> Libraries anstelle von Frameworks

> Community gesund und hilfsbereit

Page 43: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Interessante Libraries

> https://github.com/technomancy/leiningen

> https://github.com/weavejester/environ

> https://github.com/clojurewerkz/route-one

> https://github.com/krisajenkins/yesql

> https://github.com/seancorfield/clj-time

Page 44: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Frameworks

> https://github.com/weavejester/duct

> http://www.luminusweb.net

> https://github.com/otto-de/tesla-microservice

> https://github.com/metosin/compojure-api

Page 45: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem

Danke! Fragen?

Kommentare?

Michael Vitz | @michaelvitz

[email protected]

innoQ Deutschland GmbH

Krischerstr. 100 40789 Monheim am Rhein Germany Phone: +49 2173 3366-0

www.innoq.com

Ohlauer Straße 43 10999 Berlin Germany

Ludwigstraße 180 E D-63067 Offenbach Germany

Kreuzstr. 16 D-80331 München Germany

https://www.innoq.com/en/talks/2016/02/clojure-webapps/