Upload
mirkons
View
18
Download
2
Embed Size (px)
DESCRIPTION
Moje Uputstvo Ya Play
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Uvod Osnove Rad sa bazom Kontroleri Šabloni Administrativna konzola Validacija AJAX Testiranje Debagovanje
Web konzola za testiranje
62 / 68
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
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
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
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
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
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