Bachelorarbeit Till Theis Das Play-Framework und dessen Einsatz zur Entwicklung von Real-Time-Web-Anwendungen FakultätTechnikundInformatik FacultyofEngineeringandComputerScience StudiendepartmentInformatik DepartmentofComputerScience Till Theis Das Play-Framework und dessen Einsatz zur Entwicklung von Real-Time-Web-Anwendungen BachelorarbeiteingereichtimRahmenderBachelorprüfung imStudiengangBachelorofScienceAngewandteInformatik amDepartmentInformatik derFakultätTechnikundInformatik derHochschulefürAngewandteWissenschaftenHamburg BetreuenderPrüfer:Prof.Dr.FriedrichEsser Zweitgutachter:Prof.Dr.JuliaPadberg Eingereichtam:21.November2013 TillTheis ThemaderArbeit DasPlay-FrameworkunddessenEinsatzzurEntwicklungvonReal-Time-Web-Anwendungen Stichworte Play,Scala,Real-Time-Web,Reaktiv,FunktionaleProgrammierung,Iteratees Kurzzusammenfassung DieseArbeitstelltdasPlayFrameworkvorundlegtihrenSchwerpunktdabeiaufdieEntwick- lungvonReal-Time-Web-Anwendungen.DiessindinteraktiveAnwendungen,diedemNutzer Datenanzeigen,sobaldsiedemServerbekanntwerdenundnichterst,wennderNutzerdie Seiteneulädt.Umdieszuerreichen,stelltPlayeineIteratee-BibliothekzurVerfügung,die esermöglichtDatenströmereaktivundinkrementellzuverarbeiten.DieseIteratee-Streams werdenmitsamtihrenDesignentscheidungenundAnwendungsmöglichkeitenerläutert,um anschließendeineAnwendungaufBasisvonihnenzuentwickeln. TillTheis Titleofthepaper ThePlayFrameworkanditsUseforDevelopingReal-TimeWebApplications Keywords Play,Scala,Real-TimeWeb,Reactive,FunctionalProgramming,Iteratees Abstract ThisthesisisanintroductiontothePlayframeworkandfocusesonitsfeaturesfordeveloping real-timewebapplications. Real-timewebapplicationsareapplicationsthatpushinformation totheuserassoonastheserverreceivestheminsteadofrequiringtheusertomanuallyreload thepage. InordertoachievethatPlayshipswithanIterateelibrarythatmakesitpossible toreactivelyandincrementallyprocessdatastreams. TheseIterateestreamsaswellastheir design and application possibilities will be explained to finally develop an application that buildsonthem. Inhaltsverzeichnis 1. Einleitung 1 1.1. EntwicklungdesWebs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2. Real-Time-Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3. MotivationundZiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4. Themenabgrenzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.5. Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2. Grundlagen 4 2.1. Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2. ErstelleneinerAnwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3. Verzeichnisstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.4. StarteneinerAnwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.5. Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.6. Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.7. Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.8. View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.8.1. ViewsinPlay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.8.2. Altersstatistiken-View . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.9. SammelnderStatistiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.9.1. FormularinderView . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.9.2. EintraginderRouten-Datei . . . . . . . . . . . . . . . . . . . . . . . . 12 2.9.3. DynamischeStatistikenundFormularverarbeitungimController . . . 12 3. ReaktiveProgrammierung 15 3.1. Monaden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.1.1. MonadeninderKategorientheorie . . . . . . . . . . . . . . . . . . . . 15 3.1.2. Kleisli-TripelinderKategorientheorie . . . . . . . . . . . . . . . . . . 16 3.1.3. MonadeninScala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.4. BeispielefürMonaden . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.5. for-Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.1.6. Gesetze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.2. FuturesundPromises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.2.1. Futures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.2.2. Promises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2.3. ExecutionContexts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 iv Inhaltsverzeichnis 3.3. Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.3.1. DesignvonStreams . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.2. DesignvonInputs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.3. DesignvonIteratees . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3.4. DesignvonEnumerators . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3.5. DesignvonEnumeratees . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3.6. DesignvonKomposition . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3.7. AnwendungvonStreams . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.3.8. AnwendungvonIteratees . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.3.9. AnwendungvonEnumerators . . . . . . . . . . . . . . . . . . . . . . . 33 3.3.10. AnwendungvonEnumeratees . . . . . . . . . . . . . . . . . . . . . . . 37 3.3.11. AnwendungvonKomposition . . . . . . . . . . . . . . . . . . . . . . . 41 3.3.12. Gesetze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4. Real-Time-Web 49 4.1. Web-Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.1.1. Client-Seite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.1.2. Server-Seite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.1.3. Altersstatistiken-Anwendung . . . . . . . . . . . . . . . . . . . . . . . 50 4.2. ServerSentEvents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.1. Client-Seite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.2.2. Server-Seite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.2.3. Altersstatistiken-Anwendung . . . . . . . . . . . . . . . . . . . . . . . 54 4.3. WebSocketsvs.ServerSentEvents . . . . . . . . . . . . . . . . . . . . . . . . 56 5. Anwendung:TwitterNews 57 5.1. Idee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.2. Werkzeuge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3. Umsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.3.1. Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.3.2. DasTwitter-Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.3.3. DasTwitterNews-Model . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.3.4. DerApplication-Controller . . . . . . . . . . . . . . . . . . . . . . . . 64 5.3.5. DieClient-Seite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6. FazitundAusblick 65 6.1. Fazit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.2. Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 A. Vorbereitung 68 A.1. Entwicklungsumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 A.2. Software-Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 A.3. Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 v Inhaltsverzeichnis B. InhaltderbeiliegendenCD 70 Literaturverzeichnis 71 vi Listings 2.1. Dieroutes-Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2. DerAgeStatistics-Typ-Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3. DasAgeStatistics-Hilfsobjekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.4. DerApplication-Controllermitindex-Aktion . . . . . . . . . . . . . . . . . . . 8 2.5. EineinfachesView-Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.6. DasView-Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.7. DasView-TemplatemitFormular . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.8. DieRouten-EintragfürFormulareingaben . . . . . . . . . . . . . . . . . . . . 12 2.9. FormularverarbeitungimController . . . . . . . . . . . . . . . . . . . . . . . . 13 3.1. DieMonaden-OperationenderKategorientheorie . . . . . . . . . . . . . . . . 16 3.2. DieKleisli-Tripel-OperationenderKategorientheorie . . . . . . . . . . . . . . 16 3.3. DieMonaden-OperationeninScala . . . . . . . . . . . . . . . . . . . . . . . . 17 3.4. DieOption-Monade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.5. Monaden-Operationenmitfor-Comprehension . . . . . . . . . . . . . . . . . . 19 3.6. Futureskombinieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.7. Future-ErstellungmiteinemPromise . . . . . . . . . . . . . . . . . . . . . . . 22 3.8. DerInput-Datentyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.9. DerStep-Datentyp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.10. DerEnumerator-Datentyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.11. DerEnumeratee-Datentyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.12. DieSignaturvonfold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.13. ErstellungeinesIterateesdurchVererbung . . . . . . . . . . . . . . . . . . . . 30 3.14. ErstellungeinesIterateesdurcheineKonstruktormethode . . . . . . . . . . . 31 3.15. ErstellungeinesIterateesdurchKonstruktormethodeimCompanion-Objekt . 32 3.16. AusführungeinesIterateesdurchfolder-Funktion . . . . . . . . . . . . . . . . 32 3.17. ErstellungeinesEnumeratorsdurchVererbung . . . . . . . . . . . . . . . . . . 34 3.18. ErstellungeinesEnumeratorsdurchdieapply-Konstruktormethode . . . . . . 35 3.19. ErstellungeinesEnumeratorsdurchdiebroadcast-Konstruktormethode . . . . 36 3.20. AnwendungeinesEnumeratorsaufeinenIteratee . . . . . . . . . . . . . . . . 36 3.21. ExtrahierungdesErgebnissesauseinemIteratee . . . . . . . . . . . . . . . . . 37 3.22. AnwendungeinesEnumeratorsmitgleichzeitigerErgebnisextrahierung . . . 37 3.23. ErstellungeinesEnumerateesdurchVererbung. . . . . . . . . . . . . . . . . . 38 3.24. DieSignaturvonEnumeratee.map . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.25. DievereinfachteSignaturvonEnumeratee.map . . . . . . . . . . . . . . . . . 39 vii Listings 3.26. ErstellungeinesEnumerateesdurchdiemap-Konstruktormethode . . . . . . . 39 3.27. EnumerateeanwendungaufIteratees . . . . . . . . . . . . . . . . . . . . . . . 40 3.28. DieSignaturvoncompose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.29. EnumerateeanwendungaufEnumeratees . . . . . . . . . . . . . . . . . . . . . 41 3.30. SequentielleKompositionvonIteratees . . . . . . . . . . . . . . . . . . . . . . 42 3.31. SequentielleKompositionvonIterateesmitfor-Comprehension . . . . . . . . 42 3.32. DieSignaturvonEnumeratee.zip . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.33. ParalleleKompositionvonIterateesmiteinerQuelleundmehrerenSenken . . 43 3.34. ParalleleKompositionvonIterateesmitmehrerenQuellenaufeineSenke . . . 44 3.35. SequentielleKompositionvonEnumerators . . . . . . . . . . . . . . . . . . . . 44 3.36. DieSignaturvoninterleave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.37. ParalleleKompositionvonEnumerators . . . . . . . . . . . . . . . . . . . . . . 45 3.38. Typ-AliasederGesetze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.39. Kompositionsregel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.40. Verkettungsregel,wenneinIterateedieEingabeerkennt . . . . . . . . . . . . 46 3.41. Verkettungsregel,wenneinIterateedieEingabenichterkennt . . . . . . . . . 47 3.42. Nullelementregel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.43. Rechtsdistributivitätsregel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.44. IdempotenzeinesIteratees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.1. DasWebSocket-InterfaceinJavaScript . . . . . . . . . . . . . . . . . . . . . . 49 4.2. Web-Socketsinderroutes-DateiderAltersstatistiken-Anwendung . . . . . . . 50 4.3. Web-SocketsimControllerderAltersstatistiken-Anwendung . . . . . . . . . . 51 4.4. Web-SocketsinderViewderAltersstatistiken-Anwendung . . . . . . . . . . . 51 4.5. DasEventSource-InterfaceinJavaScript . . . . . . . . . . . . . . . . . . . . . . 53 4.6. ServerSentEventsaufServer-Seite . . . . . . . . . . . . . . . . . . . . . . . . 53 4.7. ServerSentEventsinderinput-ActionderAltersstatistiken-Anwendung . . . 54 4.8. ServerSentEventsinderroutes-DateiderAltersstatistiken-Anwendung . . . 54 4.9. ServerSentEventsimControllerderAltersstatistiken-Anwendung . . . . . . 55 4.10. ServerSentEventsinderViewderAltersstatistiken-Anwendung . . . . . . . 55 5.1. DieTwitterNews-Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.2. DieVerarbeitungeingehenderTweetsinderTwitterNews-Klasse . . . . . . . 61 5.3. DermostDiscussedEnumerator . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 viii 1. Einleitung IndiesemKapitelwirderläutert,wasdasReal-Time-WebausmachtundwasmitdemPlay- FrameworkunddieserArbeiterreichtwerdensoll.EswirdeinÜberblicküberdiebisherige EntwicklungdesWebsgegebenunddifferenziert,womitsichdieseArbeitgenaubeschäftigt und womit nicht. Anschließend wird beschrieben, wie die weitere Struktur dieser Arbeit aussieht. 1.1. Entwicklung des Webs NachTaivalsaariundMikkonen2011(S.1–3)wardasWorldWideWebder1990erJahreein Medium,beidemeinzelneDokumenteimVordergrundstanden.DasklassischeWebderersten HälftedesJahrzehntsbestandausDokumentenmitText,BildernundLinks.DiezweiteHälfte machte das Hybrid Web aus. Browsertechnologien, wie Javascript und CSS, sowie Plugins wieFlashundQuickTimewurdenentwickeltunderweitertendiestatischenDokumenteum interaktiveElemente. Inden2000ernverbreitetesichdasdynamischeSendenundAnfordernvonDatenunter demNamenAjax(AsynchronousJavaScriptandXML).GegenEndedesJahrzehntswurden dievorhandenenTechnologiengenutzt,umganzeAnwendungendamitzuschreiben,wiez.B. FacebookoderTwitter. 1.2. Real-Time-Web EineReal-Time-Web-AnwendungisteineWeb-Anwendung,dieautomatischneueDatenan den Client sendet, sobald diese dem Server bekannt werden. Dies unterscheidet sich vom klassischen Pull-Prinzip, in dem nur der Client per Anfrage eine neue Seite beim Server anfordernkann.BeiReal-Time-Eventsistesstattdessennotwendig,dassderServermittels Push-PrinzipneueInformationenandenClientsendet(vgl.Bozdagu.a.2007,S.1).Facebook beispielsweisezeigtneueStatusmeldungenvonFreundenan,ohnedassmanuelldieSeiteneu geladenwerdenmuss. 1 1. Einleitung 1.3. Motivation und Ziel WennmandieinAbschnitt1.1beschriebeneEntwicklungdesWebsbetrachtet,knüpftdasReal- Time-Webgenaudaranan.DerNachrichtenverkehrverläuftnichtmehrnurvomClientzum Server,sondernauchinumgekehrterRichtungvomServerzumClient.DasPlay-Framework wirdvonTypesafe,derFirmavonScalasBegründerMartinOdersky,unterstütztundwirbtda- mit,diepassendenWerkzeugezurEntwicklungmodernerWeb-Anwendungenzubesitzen(vgl. ZenexityundTypesafeInc.2013k).Kernpunkte,diePlayauszeichnen,sindstarkeTypsicherheit durchdieNutzungvonScala,sowieeineArchitektur,diemoderneclientseitigeTechnologien unterstützt(vgl.Hiltonu.a.2013,S.4).EsgibtzwarweitereWeb-FrameworksfürScala,diese sindallerdingswenigerbreitaufgebaut,weshalbPlaydasPotenzialbesitzt,dasFrameworkfür Scalazuwerden(vgl.Hiltonu.a.2013,S.8).ZieldieserArbeitistes,herauszufinden,obPlay diesenAnforderungengerechtwirdundwiedamitReal-Time-Web-Anwendungenentwickelt werdenkönnen.DazusollendiedafürbenötigtenKernkomponentenvorgestelltundanalysiert werden,umdamitschließlicheineeigeneReal-Time-Web-Anwendungzuentwickeln. 1.4. Themenabgrenzung DieseArbeitbeschäftigtsichinersterLiniemitdenTeilendesPlay-Frameworks,diebenötigt werden, um Real-Time-Web-Anwendungen damit zu entwickeln. Zusätzlich wird benötig- tes Hintergrundwissen, wie Architektur und Grundlagen des Frameworks zur Verfügung gestellt.EinigeThemenbereiche,diedafürnichtelementarsind,wiez.B.Datenbanken,wer- dennichtbehandelt.DesWeiterenwirdvorausgesetzt,dassder/dieLeserInbereitsmitden GrundtechnologienderWeb-Entwicklung,wieHTML,CSSundJavaScriptvertrautist.Ein JavaScript-Frameworkwirdabernichtverwendet,umkeinweiteresVorwissenvorauszusetzen. 1.5. Struktur ImzweitenKapitelwirdgezeigt,welchegrundlegendenWerkzeugedasFrameworkfürdie EntwicklungvonWeb-Anwendungenbesitztundwiediesezuverwendensind.Dazuwird zunächst erklärt, wie eine statische Website erstellt wird, um diese später um Real-Time- Komponentenzuerweitern.NachdemdieGrundtechnikenzurHandhabungdesFrameworks aufgezeigtwordensind,wirdimdrittenKapitelindiereaktiveProgrammierungeingeführt. Diese ist grundlegend, um Plays Stream-Bibliothek zu verstehen, die im Mittelpunkt der EntwicklungvonReal-Time-Web-Anwendungensteht.DasvierteKapitelerklärt,wieaufder Client-SeitemittelsJavaScriptmitdemServerkommuniziertwird.MitdiesemWissenwird 2
Description: