Úvod do rámca Ninja
1. Prehľad
V súčasnosti je pre vývoj webových aplikácií k dispozícii veľa rámcov založených na JEE, ako sú Spring, Play a Grails.
Možno máme svoje dôvody zvoliť si jednu z nich pred ostatnými. Naša voľba však závisí aj od prípadu použitia a problému, ktorý sa snažíme vyriešiť.
V tomto úvodnom tutoriále preskúmame webový rámec Ninja a vytvoríme jednoduchú webovú aplikáciu. Zároveň preskúmame niekoľko základných funkcií, ktoré poskytuje.
2. Ninja
Ninja je plnohodnotný, ale ľahký webový rámec, ktorý na vykonanie práce využíva existujúce knižnice Java.
Vďaka funkciám od HTML po vykreslenie JSON, vytrvalosti až po testovanie je to komplexné riešenie pre tvorbu škálovateľných webových aplikácií.
Vyplýva to z konfigurácia konvencie paradigma a kategorizuje kód v balíkoch ako modely, kontrolóri, a služby.
Ninja používa populárne knižnice Java pre kľúčové funkcie ako Jackson pre vykreslenie JSON / XML, Guice pre správu závislostí, Hibernate pre vytrvalosť a Flyway pre migráciu databázy.
Pre rýchly vývoj ponúka SuperDevMode na rýchle načítanie kódu. Umožňuje nám to okamžite vidieť zmeny vo vývojovom prostredí.
3. Inštalácia
Ninja vyžaduje na vytvorenie webovej aplikácie štandardnú sadu nástrojov:
- Java 1.8 alebo novšia
- Maven 3 alebo novší
- IDE (Eclipse alebo IntelliJ)
Na rýchle nastavenie projektu Ninja použijeme archetyp Maven. Zobrazí sa výzva na zadanie ID skupiny, ID artefaktu a čísla verzie, za ktorým nasleduje názov projektu:
mvn archetype: generate -DarchetypeGroupId = org.ninjaframework \ -DarchetypeArtifactId = ninja-servlet-archetype-simple
Alebo pre existujúci projekt Maven môžeme pridať najnovšiu ninja-core závislosť do pom.xml:
org.ninjaframework ninja-core 6.5.0
Potom spustíme príkaz Maven na prvú kompiláciu súborov:
mvn čistá inštalácia
Na záver spustíme aplikáciu pomocou príkazu Maven od Ninja:
mvn ninja: beh
Voila! Naša aplikácia je spustená a bude k dispozícii na adrese localhost: 8080:
4. Štruktúra projektu
Pozrime sa na štruktúru projektu podobnú Maven, ktorú vytvoril Ninja:
Rámec vytvára niekoľko balíkov na základe konvencií.
Triedy Java sú zaradené do kategórie konf, radiče, modelya služby adresáre v src / main / java. Podobne, src / test / java má zodpovedajúce triedy jednotkových testov. The názory adresár pod src / main / java obsahuje súbory HTML. A src / main / java / assets adresár obsahuje zdroje, ako sú obrázky, tabuľky štýlov a súbory JavaScriptu. Sme pripravení diskutovať o niekoľkých základných vlastnostiach rámca. Kontrolór je trieda, ktorá dostane požiadavku a vráti odpoveď s konkrétnymi výsledkami. Najprv si prediskutujeme niekoľko konvencií, ktoré treba dodržať: Vytvorme ApplicationController triedy jednoduchou metódou na vykreslenie HTML: Tu je index metóda vykreslí HTML volaním súboru html metóda Výsledky trieda. The Výsledok objekt obsahuje všetko, čo je potrebné na vykreslenie obsahu, ako je kód odpovede, hlavičky a súbory cookie. Poznámka: Guice @Singleton anotácia umožňuje v aplikácii iba jednu inštanciu radiča. Pre index Ninja vyhľadá súbor HTML - index.ftl.html pod views / ApplicationController adresár. Ninja používa na vykreslenie HTML šablónový modul Freemarker. Takže všetky súbory pod názory by mal mať .ftl.html predĺženie. Vytvorme index.ftl.html súbor pre index metóda: Tu sme použili Ninja i18n značka na získanie ahojMsg majetok z message.properties spis. Ďalej o tom budeme diskutovať v časti o internacionalizácii. Ďalej definujeme trasu pre požiadavku dosiahnuť index metóda. Ninja používa Trasy trieda v konf balík na mapovanie adresy URL na konkrétnu metódu radiča. Pridajme cestu na prístup k index metóda ApplicationController: To je všetko! Všetci sme pripravení na prístup k index stránka na localhost: 8080 / index: Ako už bolo spomenuté, Ninja používa Jackson na vykreslenie JSON. Na vykreslenie obsahu JSON môžeme použiť json metóda Výsledky trieda. Pridajme userJson metóda v ApplicationController triedy a vykresliť obsah jednoduchého HashMap v JSON: Potom pridáme požadované smerovanie pre prístup k userJson: Teraz môžeme vykresliť JSON pomocou localhost: 8080 / userJson: Môžeme vytvoriť službu, aby sme udržali obchodnú logiku oddelenú od kontrolóra a vložili našu službu, kedykoľvek to bude potrebné. Najprv si vytvorme jednoduchý UserService rozhranie na definovanie abstrakcie: Potom implementujeme UserService rozhranie v UserServiceImpl triedy a prepísať getUserMap metóda: Potom zaviažeme UserService rozhranie s UserServiceImpl triedy pomocou funkcie injekcie závislostí Ninja, ktorú poskytuje Guice. Pridajme väzbu do Modul trieda k dispozícii v konf balenie: Nakoniec vpichneme injekciu UserService závislosť v ApplicationController triedy pomocou @Inject anotácia: Všetci sme teda pripravení používať UserService‘S getUserMap metóda v ApplicationController: Ninja poskytuje jednoduchý, ale efektívny spôsob riešenia úspešných a chybových správ z požiadaviek prostredníctvom svojej funkcie zvanej Flash Scope. Ak ho chcete použiť v ovládači, pridáme FlashScope argument metódy: Poznámka: presmerovanie metóda Výsledky trieda presmeruje cieľ na zadanú adresu URL. Potom pridáme smerovanie / blesk do showFlashMsg spôsob a upravte zobrazenie tak, aby zobrazovalo bleskové správy: Teraz môžeme vidieť FlashScope v akcii o localhost: 8080 / blesk: Ninja poskytuje zabudovanú funkciu internacionalizácie, ktorú je ľahké konfigurovať. Najskôr definujeme zoznam podporovaných jazykov v application.conf spis: Potom vytvoríme predvolený súbor vlastností - správy.vlastnosti pre angličtinu - s pármi kľúč - hodnota pre správy: Podobne môžeme do názvu súboru pridať jazykový kód pre súbor vlastností špecifický pre jazyk - napríklad message_fr.properties súbor pre francúzštinu: Keď budú konfigurácie pripravené, môžeme ľahko povoliť internacionalizáciu v ApplicationController trieda. Máme dva spôsoby, buď použitím Lang triedy alebo Správy trieda: Potom pomocou Lang triedy, môžeme nastaviť jazyk výsledku: Podobne pomocou Správy triedy, môžeme dostať správu pre konkrétny jazyk: Ninja podporuje JPA 2.0 a využíva Hibernate na umožnenie vytrvalosti vo webovej aplikácii. Tiež ponúka zabudovanú podporu databázy H2 pre rýchly vývoj. Vyžadujeme Subjekt triedy na spojenie s tabuľkou v databáze. Ninja sa pri tom riadi konvenciou vyhľadávania tried entít v modely balíček. Takže vytvoríme Používateľ trieda entít: Potom nakonfigurujeme režim dlhodobého spánku a nastavíme podrobnosti pripojenia k databáze. V prípade konfigurácie režimu dlhodobého spánku Ninja očakáva persistence.xml súbor, ktorý má byť v src / main / java / META-INF adresár: Potom pridáme podrobnosti o pripojení k databáze application.conf: Nakoniec vložíme inštanciu súboru EntityManager v ApplicationController pomocou Guiceho Poskytovateľ trieda: Sme teda pripravení použiť EntityManager vytrvať v Používateľ objekt: Podobne môžeme použiť EntityManager prečítať Používateľ objekt z DB: Tu, Ninja @UnitOfWork anotácia spracuje všetko o databázových pripojeniach bez toho, aby sa zaoberala transakciami. Preto sa môže hodiť pri dotazoch iba na čítanie, kde zvyčajne nevyžadujeme transakcie. Ninja poskytuje zabudovanú podporu pre validáciu fazule podľa dodržiavania špecifikácií JSR303. Poďme preskúmať funkciu anotovaním vlastnosti v Používateľ subjekt s @NotNull anotácia: Potom upravíme už diskutované insertUser metóda v ApplicationController na povolenie validácie: Použili sme Ninja @ JSR303Validation anotácia umožňujúca overenie platnosti Používateľ objekt. Potom sme pridali Validácia argument na prácu s validáciami pomocou metód ako hasViolations, getViolationsa addViolation. Posledný FlashScope objekt slúži na zobrazenie chyby overenia na obrazovke. Poznámka: Ninja dodržiava špecifikácie JSR303 pre validáciu fazule. Novým štandardom je však špecifikácia JSR380 (Bean Validation 2.0). V tomto článku sme preskúmali webový rámec Ninja - kompletný rámec, ktorý poskytuje užitočné funkcie pomocou populárnych knižníc Java. Na začiatok sme vytvorili jednoduchú webovú aplikáciu pomocou radiče, modely, a služby. Potom sme v aplikácii povolili vytrvalosť podpory JPA. Zároveň sme videli niekoľko základných funkcií, ako sú trasy, vykresľovanie JSON, internacionalizácia a rozsahy Flash. Na záver sme preskúmali podporu overovania poskytovanú rámcom. Ako obvykle sú všetky implementácie kódu dostupné na GitHub.5. Kontrolór
@Singleton public class ApplicationController {public Result index () {return Results.html (); }}
6. Pohľad
Ninja: Index User Json
7. Trasa
public class Routes implements ApplicationRoutes {@Override public void init (Router router) {router.GET (). route ("/ index"). with (ApplicationController :: index); }}
8. Vykresľovanie JSON
public Result userJson () {HashMap userMap = new HashMap (); userMap.put ("meno", "Norman Lewis"); userMap.put ("email", "[chránený e-mailom]"); vrátiť Results.json (). render (užívateľ); }
router.GET (). route ("/ userJson"). s (ApplicationController :: userJson);
9. Služba
verejné rozhranie UserService {HashMap getUserMap (); }
verejná trieda UserServiceImpl implementuje UserService {@Override public HashMap getUserMap () {HashMap userMap = new HashMap (); userMap.put ("meno", "Norman Lewis"); userMap.put ("email", "[chránený e-mailom]"); návrat userMap; }}
@Singleton modul verejnej triedy rozširuje AbstractModule {protected void configure () {bind (UserService.class) .to (UserServiceImpl.class); }}
verejná trieda ApplicationController {@Inject UserService userService; // ...}
public Result userJson () {HashMap userMap = userService.getUserMap (); vrátiť Results.json (). render (userMap); }
10. Rozsah blesku
public Result showFlashMsg (FlashScope flashScope) {flashScope.success ("Správa o úspechu"); flashScope.error ("Chybové hlásenie"); vrátiť Results.redirect ("/ home"); }
$ {flash.error} $ {flash.success}
11. Internacionalizácia
application.languages = fr, en
header.home = Domov! helloMsg = Dobrý deň, vitajte v Ninja Framework!
header.home = Accueil! helloMsg = Bonjour, bienvenue dans Ninja Framework!
@Singleton verejná trieda ApplicationController {@Inject Lang lang; @Inject Messages msg; // ...}
Výsledok = Results.html (); lang.setLanguage ("fr", výsledok);
Voliteľný jazyk = Optional.of ("fr"); Reťazec helloMsg = msg.get ("helloMsg", jazyk) .get ();
12. Perzistencia
12.1. Model
@Entity public class User {@Id @GeneratedValue (strategy = GenerationType.AUTO) Long id; public String meno; verejný reťazcový e-mail; }
12.2. Konfigurácia
org.hibernate.jpa.HibernatePersistenceProvider
ninja.jpa.persistence_unit_name = dev_unit db.connection.url = jdbc: h2: ./ devDb db.connection.username = sa db.connection.password =
12.3. EntityManager
verejná trieda ApplicationController {@Inject Provider entityManagerProvider; // ...}
@Transactional public Result insertUser (užívateľský užívateľ) {EntityManager entityManager = entityManagerProvider.get (); entityManager.persist (užívateľ); entityManager.flush (); vrátiť Results.redirect ("/ home"); }
@UnitOfWork verejný výsledok fetchUsers () {EntityManager entityManager = entityManagerProvider.get (); Dotaz q = entityManager.createQuery ("VYBERTE x OD POUŽÍVATEĽA x"); Zoznam používateľov = (Zoznam) q.getResultList (); vrátiť Results.json (). render (používatelia); }
13. Validácia
verejná trieda Používateľ {// ... @NotNull verejný reťazec firstName; }
@Transactional public Result insertUser (FlashScope flashScope, @ JSR303Validation Užívateľský užívateľ, Validačné overenie) {if (validation.getViolations (). Size ()> 0) {flashScope.error ("Chyba overenia: Používateľa nie je možné vytvoriť"); } else {EntityManager entityManager = entitiyManagerProvider.get (); entityManager.persist (užívateľ); entityManager.flush (); flashScope.success ("Používateľ '" + používateľ + "' bol úspešne vytvorený"); } vrátiť Results.redirect ("/ home"); }
14. Záver