Uvod u Ninja Framework
1. Pregled
Danas postoje mnogi JEE temelji okviri poput Spring, Play i Grails dostupni za razvoj web aplikacija.
Možda imamo svoje razloge da odaberemo jednog od njih umjesto ostalih. Međutim, naš izbor također ovisi o slučaju upotrebe i problemu koji pokušavamo riješiti.
U ovom uvodnom vodiču istražit ćemo Ninja web okvir i stvoriti jednostavnu web aplikaciju. Istodobno ćemo ispitati nekoliko osnovnih značajki koje pruža.
2. Nindža
Ninja je cjelovit, ali lagan web okvir koji koristi postojeće Java knjižnice kako bi obavio posao.
Imajući značajke od HTML-a do JSON prikazivanja, postojanost do testiranja, jedno je rješenje za izgradnju skalabilnih web aplikacija.
Slijedi konvencija-nad-konfiguracijom paradigmu i kategorizira kod u pakete poput modeli, kontroleri, i usluge.
Ninja koristi popularne Java knjižnice za ključne značajke poput Jackson za prikazivanje JSON / XML, Guice za upravljanje ovisnostima, Hibernate za ustrajnost i Flyway za migracije baze podataka.
Za brzi razvoj nudi SuperDevMode za vruće ponovno učitavanje koda. Dakle, omogućuje nam da odmah vidimo promjene u razvojnom okruženju.
3. Postavljanje
Ninja zahtijeva standardni set alata za stvaranje web aplikacija:
- Java 1.8 ili noviji
- Maven 3 ili noviji
- IDE (Eclipse ili IntelliJ)
Upotrijebit ćemo arhetip Mavena za brzo postavljanje projekta Ninja. Zatražit će od nas da unesemo ID grupe, ID artefakta i broj verzije, nakon čega slijedi naziv projekta:
mvn arhetip: generiraj -DarchetypeGroupId = org.ninjaframework \ -DarchetypeArtifactId = ninja-servlet-archetype-simple
Ili, za postojeći Maven projekt, možemo dodati najnoviju ovisnost o ninja-jezgri pom.xml:
org.ninjaframework ninja-core 6.5.0
Zatim ćemo prvi put pokrenuti naredbu Maven za kompajliranje datoteka:
mvn čista instalacija
Na kraju, pokrenimo aplikaciju pomoću naredbe Maven koju je nindža osigurao:
mvn ninja: trči
Voila! Naša je aplikacija pokrenuta i bit će joj dostupna na lokalnihost: 8080:
4. Struktura projekta
Pogledajmo strukturu projekta sličnu Mavenu koju je stvorio Ninja:
Okvir stvara nekoliko paketa temeljenih na konvencijama.
Java klase su kategorizirane pod konf, kontroleri, modeli, i usluge direktoriji u src / main / java. Također, src / test / java drži odgovarajuće klase jedinstvenih testova. The pogleda imenik pod src / main / java sadrži HTML datoteke. I, src / main / java / assets direktorij sadrži resurse poput slika, tablica stilova i JavaScript datoteka. Svi smo spremni razgovarati o nekoliko osnovnih značajki okvira. Kontrolor je klasa koja prima zahtjev i vraća odgovor s određenim rezultatima. Prvo, razgovarajmo o nekoliko konvencija koje ćemo slijediti: Stvorimo ApplicationController klasa jednostavnom metodom za prikazivanje HTML-a: Evo, indeks metoda prikazat će HTML pozivanjem datoteke html metoda Rezultati razred. The Proizlaziti objekt sadrži sve što je potrebno za generiranje sadržaja poput koda odgovora, zaglavlja i kolačića. Bilješka: Guiceova @Singleton napomena omogućuje samo jedan primjerak kontrolera u cijeloj aplikaciji. Za indeks metodom, Ninja će potražiti HTML datoteku - indeks.ftl.html ispod pogledi / ApplicationController imenik. Ninja koristi mehanizam predloška Freemarker za HTML prikazivanje. Dakle, sve datoteke pod pogleda treba imati .ftl.html produženje. Stvorimo jandex.ftl.html datoteka za indeks metoda: Evo, koristili smo Ninju i18n oznaku da biste dobili pozdravMsg nekretnina iz poruka.svojstva datoteka. O tome ćemo kasnije razgovarati u odjeljku o internacionalizaciji. Dalje ćemo definirati rutu do koje će zahtjev stići indeks metoda. Ninja koristi Rute razred u konf paket za mapiranje URL-a na određenu metodu kontrolera. Dodajmo rutu za pristup indeks metoda ApplicationController: To je to! Spremni smo za pristup indeks stranica na localhost: 8080 / indeks: Kao što je već rečeno, Ninja koristi Jackson za JSON renderiranje. Da bismo prikazali JSON sadržaj, možemo koristiti json metoda Rezultati razred. Dodajmo i userJson metoda u ApplicationController klase i prikazuju sadržaj jednostavne HashMap u JSON-u: Zatim ćemo dodati potrebno usmjeravanje za pristup userJson: Sada možemo prikazati JSON pomoću localhost: 8080 / userJson: Možemo stvoriti uslugu koja će poslovnu logiku držati odvojeno od kontrolera i ubrizgati našu uslugu gdje god je to potrebno. Prvo, stvorimo jednostavan Korisnička usluga sučelje za definiranje apstrakcije: Zatim ćemo implementirati Korisnička usluga sučelje u UserServiceImpl klase i nadjačati getUserMap metoda: Zatim ćemo obvezati Korisnička usluga sučelje s UserServiceImpl klase koristeći Ninje-ovu značajku ubrizgavanja ovisnosti koju pruža Guice. Dodajmo povezivanje u Modul klasa dostupna u konf paket: Posljednje, ubrizgat ćemo Korisnička usluga ovisnost u ApplicationController razred koristeći @Ubrizgati napomena: Stoga smo svi spremni koristiti Korisnička usluga‘S getUserMap metoda u ApplicationController: Ninja pruža jednostavan, ali učinkovit način za obradu poruka o uspjehu i pogreškama iz zahtjeva putem svoje značajke nazvane Flash Scope. Da bismo ga koristili u kontroleru, dodati ćemo FlashScope argument metode: Napomena: preusmjeriti metoda Rezultati klasa preusmjerava cilj na navedeni URL. Zatim ćemo dodati usmjeravanje /bljesak prema showFlashMsg metoda i izmijenite prikaz tako da prikazuje flash poruke: Sada možemo vidjeti FlashScope u akciji na localhost: 8080 / bljesak: Ninja nudi ugrađenu značajku internacionalizacije koja se lako konfigurira. Prvo ćemo definirati popis podržanih jezika u prijava.konf datoteka: Zatim ćemo stvoriti zadanu datoteku svojstava - poruke.svojstva za engleski jezik - s parovima ključ / vrijednost za poruke: Slično tome, u naziv datoteke možemo dodati kod jezika za datoteku svojstava specifična za neki jezik - na primjer, poruka_fr. svojstva datoteka za francuski: Nakon što su konfiguracije spremne, možemo lako omogućiti internacionalizaciju u ApplicationController razred. Imamo dva načina, bilo pomoću Lang razred ili Poruke razred: Zatim, koristeći Lang klase, možemo postaviti jezik rezultata: Slično tome, koristeći Poruke razreda, možemo dobiti poruku specifičnu za jezik: Ninja podržava JPA 2.0 i koristi Hibernate kako bi omogućio postojanost u web aplikaciji. Također nudi ugrađenu podršku za H2 baze podataka za brzi razvoj. Mi trebamo Entitet klasa za povezivanje s tablicom u bazi podataka. Zbog toga Ninja slijedi konvenciju traženja klasa entiteta u modeli paket. Dakle, mi ćemo stvoriti Korisnik klasa entiteta: Zatim ćemo konfigurirati hibernaciju i postaviti detalje za vezu s bazom podataka. Za hibernaciju, Ninja očekuje postojanost.xml datoteka biti u src / main / java / META-INF imenik: Zatim ćemo dodati detalje veze baze podataka prijava.konf: Na kraju ćemo ubrizgati instancu EntityManager u ApplicationController koristeći Guiceovu Pružatelj usluga razred: Dakle, spremni smo za upotrebu EntityManager ustrajati na Korisnik objekt: Slično tome, možemo koristiti EntityManager čitati Korisnik objekt iz DB-a: Evo, Ninje @UnitOfWork anotacija će obrađivati sve o vezama baze podataka bez bavljenja transakcijama. Stoga se može pokazati korisnim za upite samo za čitanje, gdje obično ne zahtijevamo transakcije. Ninja pruža ugrađenu podršku za provjeru graha slijedeći specifikacije JSR303. Ispitajmo značajku označavanjem svojstva u Korisnik entitet s @NotNull napomena: Zatim ćemo izmijeniti već raspravljeno insertUser metoda u ApplicationController da biste omogućili provjeru valjanosti: Koristili smo Ninje @ JSR303Validacija napomena koja omogućuje provjeru valjanosti Korisnik objekt. Zatim smo dodali Provjera valjanosti argument za rad s provjerama valjanosti putem metoda poput hasViolations, getViolations, i addViolation. Posljednji, FlashScope objekt koristi se za prikaz pogreške provjere valjanosti na zaslonu. Napomena: Ninja slijedi JSR303 specifikacije za provjeru graha. Međutim, JSR380 specifikacija (Bean Validation 2.0) novi je standard. U ovom smo članku istražili Ninja web framework - full-stack framework koji pruža korisne značajke koristeći popularne Java knjižnice. Za početak smo stvorili jednostavnu web aplikaciju kontroleri, modeli, i usluge. Zatim smo u aplikaciji omogućili JPA podršku za ustrajnost. Istodobno smo vidjeli nekoliko osnovnih značajki poput Rute, JSON prikazivanje, Internacionalizacija i Flash Scopes. Na kraju, istražili smo podršku za provjeru valjanosti koju pruža okvir. Kao i obično, sve implementacije koda dostupne su na GitHubu.5. Kontroler
@Singleton javna klasa ApplicationController {indeks javnog rezultata () {return Results.html (); }}
6. Pogled
Ninja: Korisnik indeksa Json
7. Ruta
rute javne klase implementiraju ApplicationRoutes {@Override public void init (usmjerivač usmjerivača) {router.GET (). route ("/ index"). with (ApplicationController :: index); }}
8. Reprodukcija JSON-a
javni rezultat userJson () {HashMap userMap = novi HashMap (); userMap.put ("ime", "Norman Lewis"); userMap.put ("email", "[email protected]"); vratiti Results.json (). render (korisnik); }
router.GET (). route ("/ userJson"). with (ApplicationController :: userJson);
9. Usluga
javno sučelje UserService {HashMap getUserMap (); }
javna klasa UserServiceImpl implementira UserService {@Override public HashMap getUserMap () {HashMap userMap = new HashMap (); userMap.put ("ime", "Norman Lewis"); userMap.put ("email", "[email protected]"); vratiti userMap; }}
Modul javne klase @Singleton proširuje AbstractModule {protected void configure () {bind (UserService.class) .to (UserServiceImpl.class); }}
javna klasa ApplicationController {@Inject UserService userService; // ...}
javni rezultat userJson () {HashMap userMap = userService.getUserMap (); vratiti Results.json (). render (userMap); }
10. Flash Scope
javni rezultat showFlashMsg (FlashScope flashScope) {flashScope.success ("Poruka o uspjehu"); flashScope.error ("Poruka o pogrešci"); vratiti Results.redirect ("/ home"); }
$ {flash.error} $ {flash.success}
11. Internacionalizacija
application.languages = fr, en
header.home = Kući! helloMsg = Pozdrav, dobrodošli u Ninja Framework!
header.home = Accueil! helloMsg = Bonjour, bienvenue dans Ninja Framework!
@Singleton javna klasa ApplicationController {@Inject Lang lang; @Inject Messages msg; // ...}
Rezultat rezultata = Rezultati.html (); lang.setLanguage ("fr", rezultat);
Izborni jezik = Izborni.of ("fr"); Niz helloMsg = msg.get ("helloMsg", jezik) .get ();
12. Ustrajnost
12.1. Model
Korisnik javne klase @Entity {@Id @GeneratedValue (strategy = GenerationType.AUTO) Long id; javni String firstName; javni String e-mail; }
12.2. Konfiguracija
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
javna klasa ApplicationController {@Inject Provider entityManagerProvider; // ...}
@Transactional public Result insertUser (Korisnik korisnik) {EntityManager entityManager = entityManagerProvider.get (); entityManager.persist (korisnik); entityManager.flush (); vratiti Results.redirect ("/ home"); }
@UnitOfWork javni rezultat fetchUsers () {EntityManager entityManager = entityManagerProvider.get (); Upit q = entityManager.createQuery ("SELECT x FROM User x"); Popis korisnika = (Popis) q.getResultList (); vratiti Results.json (). render (korisnici); }
13. Provjera valjanosti
javni razred Korisnik {// ... @NotNull javni String firstName; }
@Transactional public Result insertUser (FlashScope flashScope, @ JSR303Validation User user, Validation validation) {if (validation.getViolations (). Size ()> 0) {flashScope.error ("Pogreška provjere: korisnika nije moguće stvoriti"); } else {EntityManager entityManager = entitiyManagerProvider.get (); entityManager.persist (korisnik); entityManager.flush (); flashScope.success ("Korisnik '" + korisnik + "' uspješno je stvoren"); } return Results.redirect ("/ home"); }
14. Zaključak