Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Play Framework, MySQL, JPA, HQL, HTML, jQuery, ….

Ähnliche Präsentationen


Präsentation zum Thema: "Play Framework, MySQL, JPA, HQL, HTML, jQuery, …."—  Präsentation transkript:

1 Play Framework, MySQL, JPA, HQL, HTML, jQuery, …

2

3

4

5

6 WerMit wemResultat 1. KundeSchalter: BibliothekarinBestimmt, welcher Archivar die Zeitschrift holen geht 2. Schalter: BibliothekarinArchivarKontrollübergabe 2.1 ArchivarZeitschriften ArchivGewünschte Zeitschrift 2.2 ArchivarKopiergerätKopien der gewünschten Seiten an Bibliothekarin übergeben 3 Schalter: BibliothekarinKundeÜbergabe der kopierten Seiten an Kunde

7 WerMit wemResultat 1. KundeSchalter: BibliothekarinBestimmt, welcher Archivar die Zeitschrift holen geht 2. Schalter: BibliothekarinArchivarKontrollübergabe 2.1 ArchivarZeitschriften ArchivGewünschte Zeitschrift 2.2 ArchivarKopiergerätKopien der gewünschten Seiten an Bibliothekarin übergeben 3 Schalter: BibliothekarinKundeÜbergabe der kopierten Seiten an Kunde Wir müssen für unsere Webapplikation programmieren: 1 – «Archivar», der die Kontrolle inne hat 2 – «Archiv», die Anbindung an die Datenbank 3 – «Kopiergerät», das sich um Darstellung kümmert

8 «Controller» Archivar «Controller» Archivar «Model» Zeitschriften Archiv «Model» Zeitschriften Archiv «View» Kopiergerät «View» Kopiergerät

9 Client Der Browser Firefox Chrome Safari Internet Explorer… Client Der Browser Firefox Chrome Safari Internet Explorer… Server Apache Tomcat Play Microsoft IIS … Server Apache Tomcat Play Microsoft IIS … Internet URL Die darzustellende Webseite HTML

10 Datei conf/routes #URLMethode, die ausgeführt werden soll GET /controllers.Application.actors(f ?= "") GET/actorscontrollers.Application.actors(f ?= "") GET/actorcontrollers.Application.actor(id:Long) GET/moviescontrollers.Application.movies(f ?= "") GET/moviecontrollers.Application.movie(id:Long) Mit dieser Datei teilen wir dem Play Controller mit, wer die Anfrage einer URL beantworten soll. Datei conf/routes #URLMethode, die ausgeführt werden soll GET /controllers.Application.actors(f ?= "") GET/actorscontrollers.Application.actors(f ?= "") GET/actorcontrollers.Application.actor(id:Long) GET/moviescontrollers.Application.movies(f ?= "") GET/moviecontrollers.Application.movie(id:Long) Mit dieser Datei teilen wir dem Play Controller mit, wer die Anfrage einer URL beantworten soll. Browser: ?f=Redford

11 Klasse = true) public static Result actors(String name) { List actors = Actor.findActorsByName(name); // 1 return ok(views.html.actors.render(actors)); // 2 } Mit dieser Methode definieren wir, wie die Anfrage beantwortet werden soll. Eine Controller-Methode geht typischerweise zweistufig vor. 1.Wir suchen die angeforderten Daten («Archiv»). 2.Wir stellen die gefundenen Daten dar («Kopiergerät»). Klasse = true) public static Result actors(String name) { List actors = Actor.findActorsByName(name); // 1 return ok(views.html.actors.render(actors)); // 2 } Mit dieser Methode definieren wir, wie die Anfrage beantwortet werden soll. Eine Controller-Methode geht typischerweise zweistufig vor. 1.Wir suchen die angeforderten Daten («Archiv»). 2.Wir stellen die gefundenen Daten dar («Kopiergerät»). Play Server: Aufruf von Application. actors("Redford")

12 Application.actors: Aufruf von Actor.findActors ByName("Redford") Klasse models.Actor Diese Klasse hat zwei Aufgaben. 1. Sie beschreibt die Tabelle «actors» in der MySQL- = "actors") // der Name der Tabelle public class Actor implements Serializable public Long actorid; // d.h. actorid ist Primärschlüssel public String name; public String sex; // … } Klasse models.Actor Diese Klasse hat zwei Aufgaben. 1. Sie beschreibt die Tabelle «actors» in der MySQL- = "actors") // der Name der Tabelle public class Actor implements Serializable public Long actorid; // d.h. actorid ist Primärschlüssel public String name; public String sex; // … }

13 Meta-Informationen im Java-Code Die sog. Annotationen beinhalten Informationen, die den Code beschreiben. Das Java Persistence API (JPA) ordnet Java-Klassen Tabellen in relationalen Datenbanken = "actors") // der Name der Tabelle public class Actor implements Serializable public Long actorid; // d.h. actorid ist Primärschlüssel public String name; // d.h. es gibt eine Spalte name in DB public String sex; // d.h. es gibt eine Spalte sex in DB // … } Siehe auch de.wikipedia.org/wiki/Java_Persistence_API Meta-Informationen im Java-Code Die sog. Annotationen beinhalten Informationen, die den Code beschreiben. Das Java Persistence API (JPA) ordnet Java-Klassen Tabellen in relationalen Datenbanken = "actors") // der Name der Tabelle public class Actor implements Serializable public Long actorid; // d.h. actorid ist Primärschlüssel public String name; // d.h. es gibt eine Spalte name in DB public String sex; // d.h. es gibt eine Spalte sex in DB // … } Siehe auch de.wikipedia.org/wiki/Java_Persistence_API

14 Aufruf von Actor.findActors ByName("Redford") Klasse models.Actor Diese Klasse hat zwei Aufgaben. 2. Sie hat Methoden, um Daten zu = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Klasse models.Actor Diese Klasse hat zwei Aufgaben. 2. Sie hat Methoden, um Daten zu = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); }

15 findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir definieren Methode, die einen String als Input erhält und eine Liste von Actor-Objekten zurückliefert. findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir definieren Methode, die einen String als Input erhält und eine Liste von Actor-Objekten zurückliefert.

16 findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Falls der Input name vorhanden und nicht-leer ist: findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Falls der Input name vorhanden und nicht-leer ist:

17 findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir definieren Abfrage. Da wir die JPA-Umsetzung Hibernate verwenden, müssen wir die Hibernate Queery Language (HQL) verwenden. Siehe de.wikipedia.org/wiki/Hibernate_(Framework). findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir definieren Abfrage. Da wir die JPA-Umsetzung Hibernate verwenden, müssen wir die Hibernate Queery Language (HQL) verwenden. Siehe de.wikipedia.org/wiki/Hibernate_(Framework).

18 findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir bereiten die Hibernate-Anfrage vor. Wir geben mit Actor.class an, dass wir als Resultat der Anfrage eine Liste von Actor-Objekten erwarten. findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir bereiten die Hibernate-Anfrage vor. Wir geben mit Actor.class an, dass wir als Resultat der Anfrage eine Liste von Actor-Objekten erwarten.

19 findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir legen fest, dass Hibernate den Platzhalten «:name» durch den Wert ersetzen soll, der durch den Ausdruck "%" + name + "%" entsteht (in unserem Beispiel %Redford%. findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir legen fest, dass Hibernate den Platzhalten «:name» durch den Wert ersetzen soll, der durch den Ausdruck "%" + name + "%" entsteht (in unserem Beispiel %Redford%.

20 findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir lassen Hibernate die Query ausführen. Unsere Methode liefert die Resultat-Liste von Actor-Objekten zurück, die uns Hibernate gibt. findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Wir lassen Hibernate die Query ausführen. Unsere Methode liefert die Resultat-Liste von Actor-Objekten zurück, die uns Hibernate gibt.

21 findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Falls der Input name nicht vorhanden oder leer ist: Liefere leere Liste von Actor-Objekten zurück. findActorsByName: Schritt für = "actors") // der Name der Tabelle public class Actor implements Serializable { public static List findActorsByName(String name) { if (name != null && !name.equals("")) { // Achtung, Abfrage ist HQL, nicht SQL! String hql = "SELECT a FROM actors a WHERE name LIKE :name"; TypedQuery query = JPA.em().createQuery(hql, Actor.class); query = query.setParameter("name", "%" + name + "%"); return query.getResultList(); } return new ArrayList (); } Falls der Input name nicht vorhanden oder leer ist: Liefere leere Liste von Actor-Objekten zurück.

22 Application.actors: Aufruf von views.html.actor. render(actors) Template views/movie.scala.html Das Template gibt an, wie die Daten dargestellt werden. Teil 1: Definition der View; = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen Template views/movie.scala.html Das Template gibt an, wie die Daten dargestellt werden. Teil 1: Definition der View; = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen

23 movie.scala.html Schritt für = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen Hinter kommt jeweils ein Scala-Ausdruck. In dieser Zeile definieren wir, dass diese View als Input die Variable «actors» erhält, die eine Liste von Actor-Objekten ist. movie.scala.html Schritt für = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen Hinter kommt jeweils ein Scala-Ausdruck. In dieser Zeile definieren wir, dass diese View als Input die Variable «actors» erhält, die eine Liste von Actor-Objekten ist.

24 Scala

25 movie.scala.html Schritt für = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen Hier rufen wir das Template main.scala.html auf. Das Template stellt das Gerüst einer Seite dar (Header, Menü, Footer). Wir übergeben diesem Template als Inhalt der Seite alles, was zwischen den geschweiften Klammern steht. movie.scala.html Schritt für = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen Hier rufen wir das Template main.scala.html auf. Das Template stellt das Gerüst einer Seite dar (Header, Menü, Footer). Wir übergeben diesem Template als Inhalt der Seite alles, was zwischen den geschweiften Klammern steht.

26 movie.scala.html Schritt für = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen Hier definieren wir das Eingabe-Formular. «input» ist ein Eingabefeld vom Typ «text» und hat den Namen «f». Dieser Name ist wichtig: Der muss gleich sein wie in der Konfigurations-Datei routes. movie.scala.html Schritt für = "IMDB-Webapplikation: Suche nach Schauspielern") { Schauspieler suchen Hier definieren wir das Eingabe-Formular. «input» ist ein Eingabefeld vom Typ «text» und hat den Namen «f». Dieser Name ist wichtig: Der muss gleich sein wie in der Konfigurations-Datei routes.

27 Template views/movie.scala.html Teil 2: Darstellung der { Name <- } } Template views/movie.scala.html Teil 2: Darstellung der { Name <- } }

28 movie.scala.html Schritt für { Name <- } } Falls die Liste von Actor-Objekten nicht leer ist (der Benutzer also eine erfolgreiche Suche durchgeführt hat): movie.scala.html Schritt für { Name <- } } Falls die Liste von Actor-Objekten nicht leer ist (der Benutzer also eine erfolgreiche Suche durchgeführt hat):

29 movie.scala.html Schritt für { Name <- } } Dann zeige eine Tabelle an. Erste Zeile enthält die Spaltentitel. movie.scala.html Schritt für { Name <- } } Dann zeige eine Tabelle an. Erste Zeile enthält die Spaltentitel.

30 movie.scala.html Schritt für { Name <- } } Fülle die Tabelle mit weiteren Zeilen: Erstelle eine Tabellenzeile für jedes Actor-Objekt in der Liste der actors. movie.scala.html Schritt für { Name <- } } Fülle die Tabelle mit weiteren Zeilen: Erstelle eine Tabellenzeile für jedes Actor-Objekt in der Liste der actors.

31 movie.scala.html Schritt für { Name <- } } Zeige einen Link auf die Detailansicht von Schauspielern an. Wir können den Link von Play abfragen über routes.Application.actor – genauso, wie es in der Konfigurationsdatei routes definiert ist. movie.scala.html Schritt für { Name <- } } Zeige einen Link auf die Detailansicht von Schauspielern an. Wir können den Link von Play abfragen über routes.Application.actor – genauso, wie es in der Konfigurationsdatei routes definiert ist.

32 movie.scala.html Schritt für { Name <- } } Beschrifte den Link mit dem Namen des Schauspielers. Hier können wir einfach alle Felder der Klasse Actor für die Anzeige verwenden. movie.scala.html Schritt für { Name <- } } Beschrifte den Link mit dem Namen des Schauspielers. Hier können wir einfach alle Felder der Klasse Actor für die Anzeige verwenden.

33 movie.scala.html Schritt für { Name <- } } Zeige in der nächsten Spalte das Geschlecht des Schauspielers / der Schauspielerin an. Hier können wir einfach alle Felder der Klasse Actor für die Anzeige verwenden. movie.scala.html Schritt für { Name <- } } Zeige in der nächsten Spalte das Geschlecht des Schauspielers / der Schauspielerin an. Hier können wir einfach alle Felder der Klasse Actor für die Anzeige verwenden.

34 WerMit wemResultat 1. Browser: localhost:9000Play Server: ControllerAction bestimmen, die für Anfrage zuständig ist 2. Play Server: Controller mit Konfiguration in routes Unsere Controller-Action: Application.actors Kontrollübergabe 2.1 Unsere Controller-Action: Application.actors Unsere Model-Klasse: Actor.findActorsByName Liste von Actor-Objekten, zwischengespeichert in Variable actors 2.2 Controller: Unsere Action: Application.actors Unser View-Template: views. html.actors.render(actors) Aufbereitete HTML-Seite mit Eingabeformular für Suche, mit Liste von Schauspielern, übergeben an Play Controller 3 Play Server: ControllerBrowserÜbermittlung und Anzeige der aufbereiteten HTML-Seite

35 «Controller» Application.actors «Controller» Application.actors «Model» Klasse Actor «Model» Klasse Actor «View» views/movie.scala.html «View» views/movie.scala.html

36 Das Play Framework basiert (wie viele andere Frameworks für Web- Applikationen) auf dem Design Pattern «Model, View, Controller» bzw. auf dem verwandten Design Pattern «Front Controller». Siehe auch de.wikipedia.org/ wiki/Model_View_Controller


Herunterladen ppt "Play Framework, MySQL, JPA, HQL, HTML, jQuery, …."

Ähnliche Präsentationen


Google-Anzeigen