Další ze série článků o zajímavých, ale možná méně známých technologiích navazuje pojednáním o frameworku Play. Pojďme se tedy podívat, co nám tento nástroj, který nedávno dospěl do verze 1.0, nabízí.
Představení
Play – framework, který se velmi podobá principům Grails, ale jde svou vlastní cestou co největší jednoduchosti a usnadnění vývoje. Nesnaží se také zasáhnout takové spektrum služeb, jak se o to snaží například Spring – zaměřuje se na rychlý vývoj webových aplikací spolu s modulárností aplikace a integrací ostatních technologií.
Poskytuje vlastní nástoj pro správu jeho projektů, který je postaven nad Pythonem. Tento nástroj slouží k správě projektů, testování a také ke spouštění nad testovacím serverem. Také dokáže výslednou aplikaci zkompilovat do war balíku. Tento nástroj automaticky udržuje build na serveru aktuální. Není tedy nutné stále restartovat server – vývoj se tím nesmírně urychlí. Dále používá Groovy jako nástroj pro šablonovací systém – což je zajímavá myšlenka. Zaměřuje se na jednoduchost vývoje klidně i bez použití sofistikovaného IDE.
Poskytuje nástroje pro snadné odstranění vyjímek, chyb v šablonách a také podporu pro JPA. V šabonování a obecně v plnění šablon daty se snaží práci co nejvíce usnadnit a vyhnout se problémům, které mají moderní frameworky.
I přesto, že se zaměřuje především na vývoje bez IDE, jeho projekty lze snadno upravit pro použití v Eclipse, Netbeans nebo Textmate (Mac). Na jeho stránkách najdete pěkné video popisující jeho základní činnost a také dokumentace je více než dostačující.
Samotný framework (tedy jeho základy) má podle mne neuvěřitelně rychlou učicí křivku – což velmi usnadňuje zapojení nových lidí do teamů. Umožňuje také integrovat například Spring, což mu dává určitě velké plus do začátku.
Instalace
V první části našeho mini seriálu se zaměříme na vytvoření základní struktury aplikace, import do prostředí Eclipse a také o zprovoznění jednoduchého DB přístupu. Podíváme se také na vytváření controllerů. Článek slouží hlavně k poukázání základních funkcí frameworku a k motivaci na jeho další studium.
Co tedy budeme k naší práci potřebovat? V podstatě pouze samotný Play framework (dostupný zde). Odvážnější z vás pak budou programovat v obyčejném textovém editoru, ostatní (stejně jako já) zvolí Eclipse.
Po rozbalení balíku frameworku se v samotném root adresáři zipu nachází soubor play.bat. Tento soubor slouží k spuštění build nástroje. Jeho plnou dokumentaci najdete v textové formě v adresáři documentation/commands. Nás bude zajímat jednoduchý přikaz play new CestaKProjektu. Po zadání tohoto příkazu budete dotázáni na jeho jméno a projekt bude poté automaticky vytvořen na zadaném místě.
Nyní bychom mohli v podstatě s projektem začít pracovat, ale jelikož jsme zhýčkaní programátoři, chceme ho ještě upravit pro import do Eclipse. Na tom nám perfektně poslouží příkaz play eclipsify CestaKProjektu. Ten nám vytvoří všechny potřebné soubory projektu Eclipse a my jej pak můžeme naimportovat do svého workspace.
Databázová podpora
Prvním krokem při vytvoření projektu je návrh databázových entit. Pro náš ukázkový projekt není třeba vytvářet externí databázi – můžeme používat integrované řešení HSQLDB, které aktivujeme v souboru application.conf. V tomto souboru se mimo databáze konfigurují jednotlivé moduly (více o nich v dalších částech tohoto seriálu) a daší vlastnosti vytvářené aplikace. My pouze aktivujeme možnost db=mem (řádek 71), která zapne podporu HSQLDB v paměti. Při spuštění se pak automaticky vytvoří schéma databáze a my ji můžeme okamžitě používat.
Jelikož má Play integrovanou podporu pro JPA, můžeme použít již to co známe. Vytvoříme si tedy jednoduchou entitu Category, která bude rozšiřovat třídu Model, která reprezentuje databázové entity v tomto frameworku. Entity jsou standardně očekávány v balíku models.
@Entity public class Category extends Model { @Required @MinSize(5) public String url; @Required @MinSize(5) public String name; public String description; @Override public String toString() { return url; } }
Kromě známých anotací zde můžeme vidět anotace @Required a @MinSize. Tyto anotace slouží při vytváření uživatelské rozhraní – definují vlastnosti jednotlivých polí ve vztahu k jejich validaci. Play na jejich základě vytvoří automatické validátory, které poté aplikuje na dané formuláře. První zmiňovaná udává nutnost daného pole, druhá pak její minimální délku. Existuje samozřejmě mnohem více těchto anotací – celý seznam naleznete v dokumentaci.
Controllery
Controllery rozšiřují třídu Controller z balíku play.mvc. Každá metoda v controlleru je pak brána jako jeho akce, tudíž lze volat z uživatelské rozhraní pomocí adresy, kterou nakonfigurujete v souboru routes (najdete ho v adesáři conf v samotném projektu). Ten může vypadat následovně:
# Home page GET / Application.index GET /ahoj.html Application.ahoj
Tímto dáváme najevo, že chceme vykonat metodu index z třídy Application, pokud uživatel přejde na root adresu daného webu. Pokud přejde na stránku ahoj.html bude vykonána metoda ahoj z třídy Application.
Třídy controllerů se standardně očekávají v balíku controllers. Controller z našeho příkladu výše by mohl vypadat následovně:
public class Application extends Controller { public static void index() { render(); } public static void ahoj(String param) { render(param); } }
Každá metoda controlleru, která má změnit výpis na obrazovce musí zavolat metodu render, která překreslí stránku (existuje její AJAXová varianta, ale tu si popíšeme až v další části seriálu). Tato metoda může mít v sobě obsaženy parametry, které se předají do stránky a s kterými se tam může dále manipulovat. Pokud je bez parametrů, pouze vykreslí stránku.
Další vlastností metod controllerů jsou jejich možné parametry. Pokud má daná metoda parametry, pak lze tyto parametry klasicky přes adresu nastavovat. Například: https://localhost:9000/ahoj.html?param=AHOJ. Tímto zavoláme naši metodu ahoj s nastaveným parametrem. Pokud nebude parametr nastaven, metoda bude zavolána, ale parametry budou nastaveny na null.
Nakonec, abychom vůbec něco viděli na obrazovce musíme vytvořit šablony pro view vrstvu. Ty se umisťují do adresáře views a jsou rozděleny podle jména tříd, ke kterým spadají (dohledávají se podle jména třídy a metody). Tudíž naši šablonu pro metodu ahoj dáme do adresáře views/Application/ahoj.html. Tato šablona pak může vypadat takto:
#{extends 'main.html' /} #{set title:'Ahoj' /} Jako parametr jsme uvedli ${param}
Nyní už nám pouze stačí pustit aplikaci pomocí nástroje play. Zavoláme ho tedy pomocí play run CestaKProjektu. Celý projekt se nám spustí a my můžeme na výše zmíněné adrese vyzkoušet náš jednoduchý controller. Aplikaci pak můžeme nechat v klidu puštěnou, play se postará o automatický build a nasazení na server, takže není problém vyvíjet rychle pomocí hot code replace.
V příští dílu seriálu se zaměříme na AJAXové zpracování stránek a také se podíváme na automatické vytváření CRUD stránek.
19.12.2009 at 16:36
No vypadá to zajímavě, ale by mě zajímalo má taková technologie šanci se prosadit. Když tu jsou jiné už daleko zaběhnutí technologie jako spring?
24.12.2009 at 15:48
Kde je článok o titulkách ?
http://weblog.morosystems.cz/ostatni/prevod-avi-videa-a-srt-ci-sub-titulku-do-jedineho-avi-souboru
28.12.2009 at 19:06
Uhodilo me do oci mj. to, ze metody index a ahoj jsou staticke – proc?!?
To pri tvorbe hierarchie kontroleru nepotrebuji vyuzivat OOP, polymorfismus? Anebo to ten framework vsechno zene pres reflexi?
Jinak taky prevazuje spis skepse – muze byt super napad, cistota kodu, dokumentace…, ale to, co presvedci me, je cas a rozsirenost.
12.1.2010 at 17:00
Jedna finta je prý v tom, že tenhle framework tak trochu boří J2EE koncept, to se mělo zmínit někde na začátku a podtrhnout třikrát, nepoužívá se prý totiž vůbec servlet API, mají tam svůj class loader, compiler, server atd. Statické metody pro action controllerů jsou tam kvůli jednoduché tvorbě url routingu a nějakým bytecode trikům právě při té kompilace (asi).
Je to prostě něco naprosto jiného, než klasické programování webu v javě, spíš se to blíží RoR, grails přístupu.
Podotýkám, že do javy moc nevidím :)
12.1.2010 at 20:47
Máte naprostou pravdu – proto jsem na začátku článku zmínil, že se podobá principům Grails ;). Snaží se ovšem o naprostou jednoduchost – proto statická volání apod. V mnohých případech jde tak trochu proti principům Javy, ale to je jednoduše vykoupeno opravdu rapidním vývojem.