68
Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje The Play Framework bazirano na verziji 1.2.5 Igor Dejanović Fakultet tehničkih nauka u Novom Sadu Katedra za informatiku Dokument kreiran 12.11.2012 u 18:06. 1 / 68

Moje Uputstvo Ya Play

  • Upload
    mirkons

  • View
    18

  • Download
    2

Embed Size (px)

DESCRIPTION

Moje Uputstvo Ya Play

Citation preview

Page 1: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

The Play Frameworkbazirano na verziji 1.2.5

Igor Dejanović

Fakultet tehničkih nauka u Novom SaduKatedra za informatiku

Dokument kreiran 12.11.2012 u 18:06.

1 / 68

Page 2: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Šta je Play

Okvir (framework) za razvoj web aplikacija.Lightweight - izbegava zamoran cikluskodiranje-izgradnja-instalacija-testiranje. Promene su odmahvidljive u okviru razvojnog web servera. Uglavnom je potrebnosamo osvežiti prikaz u web browser-u.Urađen po ugledu na popularne web okvire kod dinamičkihjezika kao što su Python (Django, pyramide...) i Ruby (Rubyon Rails).Adresa projekta je http://www.playframework.org/

2 / 68

Page 3: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Instalacija na Windows-u

Raspakovati arhivu i podesiti putanju okruženja (varijabluPATH) na folder play instalacije.

Napomena

Ukoliko koristite bash komandni interpreter (npr. koji stiže uz gitinstalaciju) potrebno je još podesiti putanju i na folder<PLAY_INSTALL>\python

3 / 68

Page 4: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Kreiranje projekta

Administrativne operacije se obavljaju komandom play.Kreiranje projekta se obavlja na sledeći način:# Iza komande play new zadaje se folder u kome će# se kreirati inicijalna verzija projekta$ play new LetsPlay~ _ _~ _ __ | | __ _ _ _| |~ | ’_ \| |/ _’ | || |_|~ | __/|_|\____|\__ (_)~ |_| |__/~~ play! 1.2.5, http://www.playframework.org~~ The new application will be created in /home/igor/Nastava/RKS/LetsPlay~ What is the application name? [LetsPlay] Let’s Play~~ OK, the application is created.~ Start it with : play run LetsPlay~ Have fun!

4 / 68

Page 5: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Pokretanje aplikacije

Play stiže sa integrisanim razvojnim web serverom.Aplikacija se pokreće sa:# Prelazak u folder projekta$ cd LetsPlay# Pokretanje$ play run~ _ _~ _ __ | | __ _ _ _| |~ | ’_ \| |/ _’ | || |_|~ | __/|_|\____|\__ (_)~ |_| |__/~~ play! 1.2.5, http://www.playframework.org~~ Ctrl+C to stop~Listening for transport dt_socket at address: 800015:46:03,222 INFO ~ Starting /home/igor/Nastava/RKS/LetsPlay15:46:04,735 WARN ~ You’re running Play! in DEV mode15:46:04,933 INFO ~ Listening for HTTP on port 9000

(Waiting a first request to start) ...

5 / 68

Page 6: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Pristup iz browser-a

A to se u browser-u, na adresi http://localhost:9000 vidi ovako:

6 / 68

Page 7: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Obrada zahteva

Preuzeto sa http://www.playframework.org/documentation/1.2/images/diagrams_path

7 / 68

Page 8: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Struktura projekta

Struktura direktorijuma je sledeća:app – Izvorni kod aplikacije. Korenskifolder za java pakete.conf – Konfiguracija aplikacije.lib – Dodatne biblioteke u vidu .jarfajlova.public – Statički resursi (slike, css,javascript i sl.).test – Jedinični testovi.

Enkoding fajlovaPlay koristi isključivo UTF-8 enkoding. Obavezno podesite editoreili IDE da koristi ovaj enkoding.Detaljniji opis strukture možete pronaći na adresihttp://www.playframework.org/documentation/1.2.5/main#application

8 / 68

Page 9: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Rutiranje zahteva

Rutiranje je opisano u fajlu conf/routes čiji je početnisadržaj:# Routes# This file defines all application routes (Higher priority routes first)# ~~~~

# Home pageGET / Application.index

# Ignore favicon requestsGET /favicon.ico 404

# Map static resources from the /app/public folder to the /public pathGET /public/ staticDir:public

# Catch all* /{controller}/{action} {controller}.{action}

Detalje sintakse routes fajla možete naći na adresi

http://www.playframework.org/documentation/1.2.5/routes#syntax

9 / 68

Page 10: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Kontroleri

URL zahteva se uparuje sa definicijama u routes fajlu.Kada se pravilo poklopi poziva se metoda odgovarajućegkontrolera. U slučaju da se pristupa korenskom kontekstupoziva se index metoda kontrolera Application.Kontroler Application je definisan na sledeći način:package controllers;import play.mvc.*;

public class Application extends Controller {

public static void index() {render();

}

}

10 / 68

Page 11: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Pogledi - Views

render metoda je metoda Controller klase koja će izvršitirenderovanje odgovarajućeg šablona iz foldera /app/views.

11 / 68

Page 12: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Šabloni

Sadržaj šablona Application/index.html je sledeći:

#{extends ’main.html’ /}#{set title:’Home’ /}

#{welcome /}

12 / 68

Page 13: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Korenski šablon - main.html

Šablon index.html nasleđuje main.html (extends tag).Sadržaj main.html je sledeći:

<!DOCTYPE html>

<html> <head> <title>#{get 'title' /}</title> <meta charset="${_response_encoding}"> <link rel="stylesheet" media="screen" href="@{'/public/stylesheets/main.css'}"> #{get 'moreStyles' /} <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}"> <script src="@{'/public/javascripts/jquery-1.5.2.min.js'}" type="text/javascript" charset="${_response_encoding}"></script> #{get 'moreScripts' /} </head> <body> #{doLayout /} </body></html>

13 / 68

Page 14: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Integracija sa Eclipse IDE

Play projekat ćemo “pretvoriti” u eclipse projekat sa sledećomkomandom:$ play eclipsify LetsPlay~ _ _~ _ __ | | __ _ _ _| |~ | ’_ \| |/ _’ | || |_|~ | __/|_|\____|\__ (_)~ |_| |__/~~ play! 1.2.5, http://www.playframework.org~~ OK, the application is ready for eclipse~ Use File/Import/General/Existing project to import

/home/igor/Nastava/RKS/LetsPlay into eclipse~~ Use eclipsify again when you want to update eclipse configuration files.~ However, it’s often better to delete and re-import the project intoyour workspace since eclipse keeps dirty caches...

~

14 / 68

Page 15: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Integracija sa Eclipse IDE - plugin

Plugin za eclipse se nalazi u folderu$PLAY_HOME/support/eclipse.Potrebno ga je iskopirati u odgovarajući dropins folder. Naprimer:# Kreiramo odgovarajući folder$ mkdir -p “~/.eclipse/org.eclipse.platform_3.7.0_1543616141/

dropins/play-1.2.5/eclipse/plugins”# Kopiramo plugin$ cp “/usr/share/playframework-1.2.5/support/

eclipse/org.playframework.playclipse_0.7.0.jar” “~/.eclipse/org.eclipse.platform_3.7.0_1543616141/dropins/play-1.2.5/eclipse/plugins/”

Plugin, između ostalog, omogućava sintaksno bojenje šablona iroutes fajla.

15 / 68

Page 16: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Fajlovi koji se ignorišu u VCS-u

Određeni fajlovi i folderi su privremene prirode i imaju smislasamo u okruženju tekućeg korisnika pa ih ne treba čuvati usistemu za kontrolu verzija.Potrebno je ignorisati sledeće fajlove i foldere.# Ovo može biti sadržaj .gitignore fajla kod Git VCS-a/tmp/modules/lib/test-result/logs/eclipse/.project/.classpath

16 / 68

Page 17: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Play moduli

Predstavljaju reusable play aplikacije.Iz repozitorijuma se mogu instalirati putem komande:$ play install <ime_modula>-<verzija># ili samo$ play install <ime_modula>

Ukoliko se verzija izostavi podrazumeva se poslednja stabilna.Ukoliko se kao verzija navede head tada se instalira poslednjarazvojna (nestabilna) verzija.

17 / 68

Page 18: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Upravljanje međuzavisnostima

Fajl conf/dependencies.yml predstavlja specifikacijumeđuzavisnosti modula.Inicijalni sadržaj je:require:

- play

Ako dodamo novu zavisnost, na primer:require:

- play- play -> db 1.1.1- org.apache.poi -> poi 3.7

Play će automatski prilikom startovanja instalirati potrebnemodule u modules direktorijum, odnosno biblioteke u libdirektorijum aplikacije.

Napomena

Play automatski razrešava zavisnosti i preuzima iz udaljenih repozitorijuma potrebnemodule i biblioteke tako da foldere modules i lib ne treba čuvati u repozitorijumuVCS-a.

18 / 68

Page 19: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Upravljanje međuzavisnostima

Ukoliko se nalazite iza proxy-ja kod komande dependenciespotrebno je dodati podešavanje proxy-ja na sledeći način:$ play dependencies --verbose-Dhttp.proxyHost=proxy.uns.ac.rs-Dhttp.proxyPort=8080

19 / 68

Page 20: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Konfiguracija baze

Podrazumevano se koristi H2 baza.Brza konfiguracija baze za razvoj podrazumeva definisanjeparametra db u conf/application.conf

db=mem #Ukoliko nam je potrebna H2 baza u memoriji ilidb=fs #Ukoliko nam je potrebna H2 baza na disku

H2 bazi se može pristupiti eksternim alatima u ciljuadministracije i ažuriranja podataka. Problem je što će bazabiti zaključana ukoliko je play aplikacija pokrenuta jer sepodrazumevano koristi embedded mod rada...

20 / 68

Page 21: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Pokretanje H2 baze i web konzole

...zbog toga ćemo bazu pokrenuti u Server modu.H2 implementira web baziranu konzolu za administraciju kojase, zajedno sa bazom, može pokrenuti na sledeći način.# Switch -web pokreće web konzolu a -tcp otvara TCP port.# Switch -baseDir definiše folder gde su smeštene baze# Za pomoć prosledite switch -helpjava -cp "<PLAY>/framework/lib/h2-1.3.149.jar" org.h2.tools.Server-web -tcp -tcpSSL -baseDir <PLAY_PROJEKAT>/db/h2

Baza podrazumevano sluša na portu 9092 a web konzola naportu 8082.

Napomena-baseDir parametar je putanja do baze. To može u ovojkonfiguraciji biti proizvoljno mesto ali je ovde prikazana lokacijakoja se koristi kada se kao konfiguracija u application.confpodesi db=fs.

21 / 68

Page 22: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Pristup H2 web konzoli

H2 Konzoli za bazu koja radi u server modu se pristupanavođenjem parametara sa slike.

22 / 68

Page 23: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Konfiguracija konekcije u server modu

Posle pokretanja baze u server modu play aplikacija se možezakačiti na bazu navođenjem sledeće konfiguracije uconf/application.conf

db.url=jdbc:h2:ssl://localhost/playdb.driver=org.h2.Driverdb.user=sadb.pass=

Play aplikacija će se na ovaj način konektovati na H2 serverčije startovanje je opisano na prethodnim slajdovima.

23 / 68

Page 24: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Dijagram klasa Let’s Play aplikacije

U nastavku ćemo koristiti sledeći primer.

title : Stringteaser : Stringbody : Stringtime : DatecommentsEnabled : BooleancommentsModerated : Boolean

BlogPost

name : Stringcomment : Stringapproved : Boolean

Comment

firstName : StringlastName : StringuserName : Stringpassword : String

User

name : String

Tagtags

*

posts

*posts

*

user

comments *

post

24 / 68

Page 25: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Play i JPA

Play koristi JPA (Java Persistance API) i Hibernate kaonjegovu implementaciju.Play modeli su entiteti JPA.Play automatski startuje Hibernate Entity Manager kadapronađe klase anotirane sa @javax.persistance.Entity.Entity Manager se može dobiti putem JPA helper klase:public static index() {

Query query = JPA.em().createQuery("select * from Post");List<Post> posts = query.getResultList();render(posts);

}

25 / 68

Page 26: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Play modeli

Play modeli su standardni JPA entiteti. Na primer.package models;import javax.persistence.Column;import javax.persistence.Entity;import play.data.validation.Max;import play.db.jpa.Model;

@Entitypublic class User extends Model {

public String firstName;public String lastName;

@Column(unique=true, nullable=false)public String userName;

@Column(nullable=false)public String password;

public User(String firstName, String lastName, String userName, String password) {super();this.firstName = firstName;this.lastName = lastName;this.userName = userName;this.password = password;

}

}

26 / 68

Page 27: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Play modeli

S tom razlikom što su atributi javni (public)!Pa ipak na bytecode nivou se prati JavaBeans specifikacija.Play prilikom kompajliranja dinamički kreira get i set metode.Nije potrebno da ih pišete. Ali, ako želite, možete i tada će sekoristiti ručno pisana get/set metoda.Zbog toga što get/set metode ne postoje u vremekompajliranja, iskaz tipa:

Post p = new Post();p.setTitle("Nešto veoma pametno");

nije moguće pisati a da se IDE ne pobuni. Zbog toga seatributi koriste jednostavno ovako:

Post p = new Post();p.title = "Nešto veoma pametno"; // Poziva se set metodaString t = p.title; // Poziva se get metoda

a Play će na bytecode nivou generisati odgovarajuće get i setpozive.

27 / 68

Page 28: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Play modeli

Ako JPA entitet nasledi play.db.jpa.Model ima pristuphelper metodama koje pojednostavljuju JPA operacije.Na primer, finder metode:Post aPost = Post.findById(5L);List<Post> posts = Post.findAll();List<Post> posts = Post.all().fetch();List<Post> posts = Post.all().from(50).fetch(100);

Takođe svaki entitet automatski dobija primarni ključ publicLong id. Nije ga potrebno definisati u modelima.

28 / 68

Page 29: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Pojednostavljeni upiti

Play modeli takođe mogu da koriste pojednostavljene upiteoblika:Post.find("byTitle", "My first post").fetch();Post.find("byTitleLike", "%hello%").fetch();Post.find("byAuthorIsNull").fetch();Post.find("byTitleLikeAndAuthor", "%hello%", connectedUser).fetch();

Svaki upit je oblika “by[Property][Comparator]And?” gdeComparator može biti: LessThan, LessThanEquals,GreaterThat, GreaterThanEquals, Like, ILike,ELike, NotEqual, Between (zahteva dva argumenta),IsNotNull (ne zahteva argument), IsNull (ne zahtevaargument).

29 / 68

Page 30: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Kreiranje šeme baze

Konfiguracioni parametar jpa.ddl omogućava automatskoažuriranje šeme baze od strane JPA ukoliko se postavi naupdate. Podrazumevana vrednost je update ukoliko seaplikacija nalazi u DEV modu odnosno none ukoliko je u PRODmodu.Ukoliko radimo nad živom bazom, sa podacima, potrebno ješemu evoluirati uz očuvanje tekućih podataka.Ovo se može potrebno je postaviti ovaj parametar na none abazu migrirati upotrebom evolution modula.

30 / 68

Page 31: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Evolucija šeme baze

Ukoliko radimo nad živom bazom, sa podacima, potrebno ješemu evoluirati uz očuvanje tekućih podataka.Konfiguracioni parametar jpa.ddl u tom slučaju postavljamona none.Evolucija podrazumeva pisanje SQL skripti za migraciju šemebaze sa jedne verzije na drugu.Primena ovih skripti može se obavljati na dva načina:

Ručno.Automatizovano - upotrebom evolution modula.

31 / 68

Page 32: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Automatizovana evolucija šeme baze

Upotreba sledećih konvencija:Skripte se smeštaju u db/evolutions folderu, imaju .sqlekstenziju i numerisane su rednim brojem (npr. 1.sql, 2.sqlitd.)Svaka skripta ima dva dela:

Ups - za prelazak na sledeću verziju (upgrade),Downs - poništavanje prelaska na sledeću verziju (Undo,Downgrade).

32 / 68

Page 33: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Primer skripte za evoluciju

# Users schema # --- !Ups CREATE TABLE User ( id bigint(20) NOT NULL AUTO_INCREMENT, email varchar(255) NOT NULL, password varchar(255) NOT NULL, fullname varchar(255) NOT NULL, isAdmin boolean NOT NULL, PRIMARY KEY (id)); # --- !Downs DROP TABLE User;

1

1Izvor: Play dokumentacija33 / 68

Page 34: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Evolucija baza na puppet serveru

Obavljaće se ručno kroz H2 konzolu.Skripte za evoluciju voditi u repozitorijumu git-a.evolution.enabled u application.conf postaviti nafalse.Napraviti mehanizam praćenja verzije šeme baze.

34 / 68

Page 35: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Kreiranje DDL skripte

Prvo je potrebno aktivirati db modul u fajluconf/dependencies.ymlrequire:

- play- play -> db 1.1.1

U conf/application.conf definisati SQL dijalekt.jpa.dialect=org.hibernate.dialect.H2Dialect

Zatim se može kreirati SQL DDL skripta sa:$ play db:export

A skript se direktno može izvršiti nad bazom sa:$ play db:export ––export

35 / 68

Page 36: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Fixture fajlovi

Prilikom kreiranja baze često je potrebno kreirati inicijalnepodatke bez kojih aplikacija ne može da radi. Na primer,inicijalni admin korisnik.Podaci se mogu definisati putem YAML fajla.Na primer, možemo kreirati fajl conf/initial-data.ymlsledeće sadržine:User(pera):firstName: PeralastName: PerićuserName: perapassword: perinalozinka

Napomena

Tab karakteri su zabranjeni u YAML fajlovima (videtihttp://www.yaml.org/faq.html). Osim fixture fajlova ovo važi i zaostale play fajlove koji koriste ovaj format (npr.conf/dependencies.yml).

36 / 68

Page 37: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Inicijalizacija baze sa fixture fajlom

Fixture fajl možemo učitati na sledeći način:Kreiramo fajl app/Bootstrap.java koji će definisati posao(job) sledeće sadržine:

@OnApplicationStartpublic class Bootstrap extends Job { public void doJob() { if(User.count() == 0) { Fixtures.loadModels("initial-data.yml"); } }}

37 / 68

Page 38: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Play kontroleri

Kontroler je Java klasa koja nasleđuje play.mvc.Controller.public static metode kontrolera nazivamo akcijama.Akcije vrše procesiranje HTTP zahteva i kreiranje odgovora.HTTP zahtevi se mapiraju na akcije putem conf/routes fajla.

package controllers;

import models.User;import play.mvc.Controller;

public class Users extends Controller { public static void show(Long id) { User user = User.findById(id); render(user); } public static void delete(Long id) { User user = User.findById(id); user.delete(); }}

38 / 68

Page 39: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Preuzimanje HTTP parametara u akcijama

Postoje tri načina prosleđivanja parametara sa HTTPzahtevom:

Kroz URI: /posts/563 – 563 je dinamički deo.Kroz HTTP query parametre: /posts?id=563 – sve iza ? jedinamički deo.Kroz telo HTTP zahteva (ovako se šalje sa HTML forme).Parametri su enkodovani kao x-www-urlform-encoded.

U svakom slučaju Play će kreirati mapu Map<String,String[]> kojoj se, iz akcije, može pristupiti na sledeći način:public static void show() {String id = params.get("id");

}

ili sa konverzijom tipova:public static void show() {Long id = params.get("id", Long.class);

}

39 / 68

Page 40: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Preuzimanje HTTP parametara u akcijama

...a može i jednostavnije.Ukoliko se prati jednostavna konvencija imenovanjaparametara akcija, Play može direktno mapirati HTTPparametre na parametre akcije.Na primer sledeći URL-ovi:/posts/563/posts?id=563

mogu biti mapirani na akciju:public static void show(String id) {System.out.println(id);

}

ili sa automatskom konverzijom tipa:public static void show(Long id) {System.out.println(id);

}

40 / 68

Page 41: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Mapiranje HTTP parametara na POJO

Play može automatski da instancira POJO na osnovu HTTPparametara.Na primer:

public static void createUser(User user) { user.save(); showUser(user.id); }

Ovaj primer instancira User model, perzistira ga u bazi i radiredirekciju na show akciju (više o redirekcijama u nastavku).

41 / 68

Page 42: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Mapiranje HTTP parametara na POJO

Sa HTML forme POST-om stižu user.firstName,user.lastName, user.userName, user.password nasledeći način:

<form id="createUser" action="@{Users.createUser}" method="POST" accept-charset="${_response_encoding}"> <p> <label>First name</label> <input type="text" name="user.firstName" /> </p> <p> <label>Last name</label> <input type="text" name="user.lastName" /> </p> <p> <label>User name</label> <input type="text" name="user.userName" /> </p> <p> <label>Password</label> <input type="password" name="user.password" /> </p> <p class="buttons"> <input type="submit" value="Create" id="createButton" /> </p></form>

42 / 68

Page 43: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Redirekcija

Redirekcija na određeni View se obavlja prostim pozivomodgovarajuće javne metode kontrolera.Primer:

public static void showUser(Long id) { User user = User.findById(id); render(user); }

public static void createUser(User user) { // Upisujemo user objekat u bazu i zatim vršimo // redirekciju na akciju showUser() user.save(); showUser(user.id); }

Metoda neće biti direktno pozvana već će se vratiti HTTPResponse kod 304 (Redirect).

NapomenaTreba imati u vidu da će se svaki poziv javne metode kontrolerarealizovati kao redirekcija!

43 / 68

Page 44: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Zvanična dokumentacija za kontrolere

Dostupna je na adresihttp://www.playframework.org/documentation/1.2.5/controllers

44 / 68

Page 45: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Šabloni

Šablon je tekstualni fajl koji opisuje sadržaj koji se generiše kaoodgovor aplikacije (najčešće je to HTML).Sastoji se od statičkih i dinamičkih delova.Dinamički delovi su pisani u Groovy jeziku.

45 / 68

Page 46: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Primer šablona

<h1>Korisnik ${user.userName}</h1><ul> #{list items:user.posts, as:'post' } <li>${post.title}</li> #{/list}</ul>

46 / 68

Page 47: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Pronalaženje šablona za akciju

Šablon se renderuje iz akcije pozivom metode render().Konvencija pre konfiguracije. Podrazumevani šablon zametodu kontrolera je:/app/views/${controller}/{method}.html

Dakle za metodu Application.index() podrazumevanišablon je /app/views/Application/index.html

47 / 68

Page 48: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Izrazi (Expressions)

Najednostavniji dinamički element šablona.Primer:<h1>Client ${user.firstName + " " + user.lastName}</h1>

user je java objekat a firstName i lastName njegovi atributi.Objekat user je prosleđen u render metodi kao parametar.Unutar oznaka ${...} navodi se Groovy izraz koji se evaluira ustring čiji sadržaj postaje deo generisanog dokumenta.

48 / 68

Page 49: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Oznake (Tags)

Oznaka je ponovno iskoristiv fragment šablona. Navodi seunutar oznaka #{.. /}Primer:

#{list items:user.posts, as:'post' } <li>${post.title}</li> #{/list}

U ovom primeru ugrađeni list tag ima dva parametra: itemsi as.Korisnički tag šablon se kreira u folderu /app/views/tags/

Dokumentaciju za ugrađene oznake se nalazi ovde.Više detalja o pisanju korisničkih oznaka se nalazi ovde.

49 / 68

Page 50: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Dekoratori šablona i nasleđivanje

Šabloni mogu biti dekorisani. Dekorator je dokument (najčešćeHTML) u koji se “ugrađuje” posmatrani šablon.Dekorator se navodi na početku šablona upotrebom tag-aextends.Sadržaj šablona se “ugrađuje” na mestu poziva tag-a doLayout.Primer:#{extends ’main.html’ /}<h1>Some code</h1>

# Sadržaj fajla main.html može biti sledeći<h1>Main template</h1><div id="content">

#{doLayout /}</div>

50 / 68

Page 51: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Akcije (Actions)

Play rutiranje može biti iskorišćeno za generisanjeodgovarajućeg URL-a.Unutar oznake @{...} se navodi poziv akcije kontrolera.Primer:

<ul> #{list items:users, as:'user'} <li> <a href="@{Users.show(user.id)}">First name: ${user.firstName}</a> </li> #{/list}</ul>

Link će odgovarati URL šablonu definisanom u routes fajlupri čemu se uzima u obzir parametar user.id. To može, naprimer, da se renderuje kao “/Users/13”.Ukoliko se koristi @@{...} tada se renderuju apsolutne adrese.

51 / 68

Page 52: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Ekstenzije

Java objekti u šablonima dobijaju nove metode koje ne postojena originalnim objektima.Ove metode nazivamo ekstenzijama.# Primeri${"lorum ipsum dolor".capitalizeWords()} -> Lorum Ipsum Dolor${"not empty".yesno(’yes’, ’no’)} -> yesjourn${1.pluralize(’al’, ’aux’)} -> journaljourn${3.pluralize(’al’, ’aux’)} -> journaux

Dokumentaciju za ugrađene ekstenzije možete pronaći ovde.Uputstvo za kreiranje ekstenzija možete pronaći ovde.

52 / 68

Page 53: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Kontekst šablona

Šablon može da pristupa objektima svog konteksta. Kontekstse definiše parametrima render metode. Na primer:

User user = User.findById(id);List<Post> posts = user.posts;render(user, posts);

Unutar šablona prosleđeni objekti user i posts će moći da sereferenciraju tako da je moguće pisati, npr.:

<h1>${user.firstName}</h1><#list items:posts, as:’post’>...

53 / 68

Page 54: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Implicitni objekti

Java objekti koje prosledimo render metodi iz kontrolera bićedostupni u šablonu.Pored toga biće dostupni i određeni implicitni objekti. Naprimer:

errors – validacione greške.messages – mapa poruka za internacionalizaciju.request – tekući HTTP request objekat.

Spisak implicitnih objekata možete pronaći ovde.

54 / 68

Page 55: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Dokumentacija o šablonima

Dokumentaciju o šablonima možete pronaći na adresihttp://www.playframework.org/documentation/1.2.5/templates.

55 / 68

Page 56: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

CRUD administracija

Za play je razvijen jednostavan modul koji omogućava osnovneCRUD operacije nad modelima kroz web interfejs.Da bi se CRUD modul instalirao potrebno je uconf/dependencies.yml upisati:

- play -> crud

CRUD modul definiše route koje je potrebno uključiti u glavniroutes fajl.# Import CRUD routes* /admin module:crud

i zatim uraditi “play dependencies” da bi se razrešilezavisnosti.Ovim je CRUD modul instaliran.

Napomena

Ne zaboravite da uradite play eclipsify posle instalacije svakog novog mogula ilibiblioteke.

56 / 68

Page 57: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

CRUD administracija

Da bi se dobio pristup za CRUD operacije nad instancamamodela potrebno je još kreirati CRUD kontrolere. Npr:package controllers;

public class Users extends CRUD {

}

Kontroler nasleđuje CRUD klasu.Ime kontrolera mora biti pluralizovan naziv modela. U ovomprimeru User→ Users.Ako hoćemo da se kontroler zove drugačije tada koristimoanotaciju CRUD.For da bi saopštili za koji model pravimokontroler.Više informacija o CRUD modulu možete naći ovde.

57 / 68

Page 58: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Podešavanje naziva labela i internacionalizacija

Podešavanje naziva labela na CRUD formama i, generalno,prevođenje interfejsa Play aplikacija se obavlja krozconf/messages<.jezik> fajlove.# You can specialize this file for each language.# For example, for French create a messages.fr file#firstName = ImelastName = PrezimeuserName = Korisničko imepassword = Lozinka

Više informacija o internacionalizaciji možete naći ovde.

58 / 68

Page 59: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Validacija

TODODokumentacija je na adresihttp://www.playframework.org/documentation/1.2.5/validation

59 / 68

Page 60: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

AJAX

TODODokumentacija je na adresihttp://www.playframework.org/documentation/1.2.5/ajax

60 / 68

Page 61: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Testiranje

Play ima odličnu podršku za Test-Driven Development (TDD).Direktno je podržano jedinično i funkcionalno testiranje.Testovi se nalaze u folderu test.Testiranje se obavlja pokretanjem aplikacije u test modu sa:$ play test~ _ _~ _ __ | | __ _ _ _| |~ | ’_ \| |/ _’ | || |_|~ | __/|_|\____|\__ (_)~ |_| |__/~~ play! 1.2.5, http://www.playframework.org~ framework ID is test~~ Running in test mode~ Ctrl+C to stop~Listening for transport dt_socket at address: 800021:35:15,701 INFO ~ Starting /home/igor/Nastava/RKS/LetsPlay21:35:15,739 INFO ~ Module db is available (/home/igor/Nastava/RKS/LetsPlay/modules/db-1.1.1)21:35:16,588 WARN ~ You’re running Play! in DEV mode~~ Go to http://localhost:9000/@tests to run the tests

61 / 68

Page 62: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Web konzola za testiranje

62 / 68

Page 63: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Jedinično testiranje

Koristi se standardni JUnit okvir za testiranje.Mogu se testirati modeli, utility klase itd.Test mora da nasledi play.test.UnitTestpublic class UserTest extends UnitTest {

@Test public void retrieveUser(){ User zika = User.find("byUserName", "zika").first(); assertNotNull(zika); }

@Test public void createAndRetrieveUser() { new User("Pera", "Perić", "pera", "perinalozinka").save();

User pera = User.find("byUsername", "pera").first();

assertNotNull(pera); assertEquals("Pera", pera.firstName); }}

63 / 68

Page 64: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Funkcionalno testiranje

Testiranje web aplikacije direktnim slanjem zahteva i čitanjemodgovora (request-response).Test klasa nasleđuje klasu play.test.FunctionalTestpublic class ApplicationTest extends FunctionalTest {

@Test public void testThatIndexPageWorks() { Response response = GET("/"); assertIsOk(response); assertContentType("text/html", response); assertCharset(play.Play.defaultWebEncoding, response); } }

64 / 68

Page 65: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Test prihvatanja

Za pisanje testova prihvatanja (Acceptance Tests) koristi seSelenium.Selenium omogućava automatizaciju browser-a.

*{ You can use plain selenium command using the selenium tag }*#{selenium}

// Open the home page, and check that no error occuredopen(’/’)assertNotTitle(’Application error’)

#{/selenium}

65 / 68

Page 66: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Test baza

Dobra je praksa da test baza bude memorijska, ukoliko je tomoguće, zbog brzine testiranja.Za složenije testove baza se može inicijalizovati pomoćufixture fajla.

public class UserTest extends UnitTest {

@Before public void setup(){ Fixtures.deleteDatabase(); Fixtures.loadModels("data.yml"); } ...

66 / 68

Page 67: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Ručno testiranje

Ručno testiranje treba izbegavati......ali ako se mora, možemo koristiti sledeće alate:

Plugine za browser kojima možemo analizirati HTTPsaobraćaj. Na primer, Poster, Tamper Data i sl.cURL alatku.

67 / 68

Page 68: Moje Uputstvo Ya Play

Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje

Debagovanje

Play DEV server automatski otvara debug port (podrazumevano 8000).Iz Eclipse-a se može “prikačiti” na play aplikaciju sa sledećim debugpodešavanjima:

Pokretanjem ove konfiguracije Eclipse će zaustaviti aplikaciju nadefinisanim tačkama prekida i omogućiti inspekciju objekata, izvršavanjekorak po korak i sl.

68 / 68