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í.
Druhý díl našeho povídání o frameworku Play budeme věnovat jeho možnostem při vytváření jednoduchých CRUD controllerů a také se podíváme, jaké možnosti nám nabízí, pokud chceme využít AJAX. V závěru zmíníme také to, jak vytvořit dotaz do databáze.
CRUD controllery
Framework nabízí spoustu modulů, které můžete využít ve svůj prospěch. Jedním z nejzajímavějších a přitom nesmírně užitečných je CRUD modul. Ten umožňuje elegantně, ale především velice rychle, vytvářet kompletní administrační rozhraní k vašim entitám. Toto administrační rozhraní je pak možno detailně editovat pomocí šablon, které jsou k dispozici u tohoto modulu. Díky této funkcionalitě budete mít hotovou administraci velice rychle a budete moci ukázat funkční aplikaci vašemu zákazníkovi – samotné doladění můžete nechat na později.
Pojďme se tedy nyní podívat, jak vytvořit jednoduché administrační rozhraní k entitě, kterou jsme si vytvořili v minulém díle. Nejprve je nutné modul CRUD aktivovat. To provedeme v konfiguračním souboru projektu – application.conf:
# Additional modules # ~~~~~ # A module is another play! application. Add a line for each module you want # to add to your application. Modules path are either absolutes or relative to # the application root. # module.crud=${play.path}/modules/crud #module.secure=${play.path}/modules/secure #module.ecss=${play.path}/modules/ecss #module.gae=${play.path}/modules/gae #module.gwt=${play.path}/modules/gwt #module.search=${play.path}/modules/search #module.siena=${play.path}/modules/siena #module.spring=${play.path}/modules/spring
Jak si sami můžete všimnout, odkomentovali jsme řádek, který povoluje pouze modul CRUD. K dispozici je další řada zajímavých pluginů, které si můžeme popsat v dalších částech seriálu (zajímavá by mohla být podpora pro Spring, či integrace vyhledávání).
Po aktivaci modulu je třeba přegenerovat projekt pro Eclipse, protože je nutné přidat knihovny pro CRUD controllery. Přegenerování provedeme nám již známým způsobem: play eclipsfy CestaKProjektu.
Nyní byste již měli vidět modul CRUD jako další balík vašeho projektu. Konečně se tedy můžeme pustit do samotného vytvoření administračního rozhraní. K tomu budeme potřebovat nový controller, který bude obstarávat celou editaci naší kategorie:
@CRUD.For(Category.class) public class CategoryController extends CRUD { }
Že se vám to zdá málo? Ano, opravdu je to celé. Vše ostatní za vás vytvoří framework Play. Pro úplnost musíme uvést, že v souboru routes, který obsahuje cesty k jednotlivým metodám controllerů a jejich mapování na url, musíme přidat ještě následující řádek
* /admin module:crud
Ten udává, na jakém url se bude vyskytovat administrační rozhraní. Pokud pak budeme chtít editovat kategorie, stačí nám zadat url localhost:9000/categorycontroller/list. URL samozřejmě můžeme nechat takto, nebo použít stejný způsob, jaký jsem si uvedli v prvním díle tohoto seriálu – oba přístupy lze také kombinovat.
Po spuštění projektu naleznete na dané stránce kompletní hotové administrační rozhraní, které umožňuje vypsat všechny kategorie, přidávat nové, editovat je a samozřejmě je také mazat. To celé pouze díky pár řádkům našeho kódu. Nyní určitě většina z vás podotkne, že nemáme plnou kontrolu nad tím, jak vypadají šablony a kód daných automaticky vytvořených controllerů. Musím vás však vyvést o omylu – jistě si všimnete, že všechny soubory, které přibyly do balíku CRUD jsou plně editovatelné, tudíž stejně jako šablony si můžete v klidu upravit kód, který se například stará o přidání nové entity.
Nyní se na řadu dostávají anotace, které jsme používali při vytváření entity v minulém díle – Required a MinSize. Pokud si totiž aplikaci spustíte a pokusíte se vytvořit nový záznam, kde byste jeden z těchto fieldů vynechali, sami zjistíte, že vás na to aplikace elegantně upozorní. Validátory jsou tedy vytvořeny také za nás a my se můžeme plně věnovat vývoji ostatní funkcionality projektu.
Pokud si chcete upravit hlášky, které jsou k dispozici u jednotlivých polí formulářů, či validátorů, je to velice snadné. Stačí editovat soubor messages, který je na stejném místě jako application.conf. Do něj poté umístíte klasické klíče, které můžete znát z properties souborů:
crud.help.required=Vyžadováno. validation.required=Vyžadováno.
Tyto dvě hlášky jsou věnovány validaci libovolného vyžadovaného fieldu a také nápovědy, která je po formulářovým polem vypsána.
Další možnosti, které CRUD nabízí (jako například přetížení jednotlivých šablon, jejich úprava, rozšířené možnosti validace apod.) naleznete v dokumentaci, která vás provede podrobnějším nastavením, které je nad rámec tohoto seznamovacího článku.
AJAX
Ať chceme nebo ne, používání AJAXu se v dnešních webových aplikacích nevyhneme. Co nám tedy v tomto směru nabízí Play? Ukážeme si příklad, kdy pomocí jednoduchého formuláře budeme na stránku přidávat položky určitého seznamu. Bude to opravdu triviální příklad – další studium nechám na vás.
Nejprve si tedy vytvoříme nový controller, který bude obsluhovat stránku s výpisem:
public class ListController extends Controller { private static List listOfItems = new ArrayList(); public static void index() { List listOfItems = ListController.listOfItems; render(listOfItems); } public static void addToList(String item) { List listOfItems = ListController.listOfItems; listOfItems.add(item); ListController.listOfItems = listOfItems; renderJSON(item); } }
Jak vidíte, vytvořili jsme dvě metody, které budou sloužit pro výpis seznamu a pro přidání položky do seznamu. Předem se omlouvám za konstrukci bez databáze – statický List si nahraďte samozřejmě za dotazy do databáze.
Zaměřme se zejména na metodu renderJSON, která je pro nás nová, a která slouží k navrácení nějakého objektu přes JSON do stránky. Dalším krokem je pak vytvoření samotné stránky index.html v adresáři views/ListController:
#{extends 'main.html' /} #{set title:'Home' /} Items: <ul id="itemList"> #{list items:listOfItems, as:'item'} <li> ${item}</li> #{/list} </ul> <form> <input id="item" type="text" /> <input onclick="addToList()" type="button" value="Add" /> </form> <script type="text/javascript"> function addToList() { $.post('@{addToList()}',{item: $('#item').val()},function(retValue) { $('#itemList').prepend('<li>'+retValue+'</li>')},'text') } </script>
Na samotné stránce není nic zvláštního – můžete zde vidět kód pro výpis seznamu prvků, které si posíláme do stránky v metodě index a poté jednoduchý formulář, který je navázán na JS metodu. Tato metoda volá pomocí AJAXu naši metodu addToList v ListControlleru a zároveň přidává (pomocí jQuery) do seznamu návratovou hodnotu této metody (zaslanou pomocí renderJSON – ačkoliv si zde zasíláme pouze text a ne objekt, tato metoda je primárně určená pro zasílání objektů).
Pro úplnost ještě musíme dodat, že je samozřejmě opět nutné upravit soubor routes, kde nám stačí přidat mapování na ListController. Důležité je také povolit podporu pro jQuery v souboru main.html, který slouží jako základ pro všechny naše příklady:
<script src="@{'/public/javascripts/jquery-1.3.2.min.js'}"></script>
Dotazy do databáze
Na úplný závěr jsme si připravili pouze krátké nahlédnutí na možnosti dotazů do databáze. Play k tomuto problému přistupuje velice svérázně a tudíž každá třída, která rozšiřuje třídu Model (tedy třída databázové entity), poskytuje statické metody ekvivalentní k metodám JPA. Pokud tedy potřebujeme pracovat s naší entitou Category a vybrat entity z databáze, stačí nám zavolat následující kód:
Category.findAll(); // vrací list Category.findById(id); // vrací enetitu Category.find("sql query", params); // vrací list
Závěr
Jak se sami můžete přesvědčit, framework Play má co nabídnout a jedná se o zajímavou možnost pro rychlý vývoj webových aplikací. Možností, kterých se od něj můžete dočkat, je samozřejmě mnohem více – ukázali jsme pouze základní principy, které byste mohli využít.
Budeme rádi, pokud nám v komentářích sdělíte vaše názory či tipy na další podobné frameworky, nebo pokud se s námi podělíte o vaše úspěchy s frameworkem Play.
Napsat komentář