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.

5. Kontroler

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:

  • Stvorite razred u kontroleri paket i sufiks ime sa Kontroler
  • Metoda koja služi zahtjevu mora vratiti objekt datoteke Proizlaziti razred

Stvorimo ApplicationController klasa jednostavnom metodom za prikazivanje HTML-a:

@Singleton javna klasa ApplicationController {indeks javnog rezultata () {return Results.html (); }}

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.

6. Pogled

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:

  Ninja: Korisnik indeksa Json 

Evo, koristili smo Ninju i18n oznaku da biste dobili pozdravMsg nekretnina iz poruka.svojstva datoteka. O tome ćemo kasnije razgovarati u odjeljku o internacionalizaciji.

7. Ruta

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:

rute javne klase implementiraju ApplicationRoutes {@Override public void init (usmjerivač usmjerivača) {router.GET (). route ("/ index"). with (ApplicationController :: index); }}

To je to! Spremni smo za pristup indeks stranica na localhost: 8080 / indeks:

8. Reprodukcija JSON-a

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:

javni rezultat userJson () {HashMap userMap = novi HashMap (); userMap.put ("ime", "Norman Lewis"); userMap.put ("email", "[email protected]"); vratiti Results.json (). render (korisnik); }

Zatim ćemo dodati potrebno usmjeravanje za pristup userJson:

router.GET (). route ("/ userJson"). with (ApplicationController :: userJson);

Sada možemo prikazati JSON pomoću localhost: 8080 / userJson:

9. Usluga

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:

javno sučelje UserService {HashMap getUserMap (); }

Zatim ćemo implementirati Korisnička usluga sučelje u UserServiceImpl klase i nadjačati getUserMap metoda:

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; }}

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:

Modul javne klase @Singleton proširuje AbstractModule {protected void configure () {bind (UserService.class) .to (UserServiceImpl.class); }}

Posljednje, ubrizgat ćemo Korisnička usluga ovisnost u ApplicationController razred koristeći @Ubrizgati napomena:

javna klasa ApplicationController {@Inject UserService userService; // ...}

Stoga smo svi spremni koristiti Korisnička usluga‘S getUserMap metoda u ApplicationController:

javni rezultat userJson () {HashMap userMap = userService.getUserMap (); vratiti Results.json (). render (userMap); }

10. Flash Scope

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:

javni rezultat showFlashMsg (FlashScope flashScope) {flashScope.success ("Poruka o uspjehu"); flashScope.error ("Poruka o pogrešci"); vratiti Results.redirect ("/ home"); }

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:

 $ {flash.error} $ {flash.success} 

Sada možemo vidjeti FlashScope u akciji na localhost: 8080 / bljesak:

11. Internacionalizacija

Ninja nudi ugrađenu značajku internacionalizacije koja se lako konfigurira.

Prvo ćemo definirati popis podržanih jezika u prijava.konf datoteka:

application.languages ​​= fr, en

Zatim ćemo stvoriti zadanu datoteku svojstava - poruke.svojstva za engleski jezik - s parovima ključ / vrijednost za poruke:

header.home = Kući! helloMsg = Pozdrav, dobrodošli u Ninja Framework!

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:

header.home = Accueil! helloMsg = Bonjour, bienvenue dans Ninja Framework!

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:

@Singleton javna klasa ApplicationController {@Inject Lang lang; @Inject Messages msg; // ...}

Zatim, koristeći Lang klase, možemo postaviti jezik rezultata:

Rezultat rezultata = Rezultati.html (); lang.setLanguage ("fr", rezultat);

Slično tome, koristeći Poruke razreda, možemo dobiti poruku specifičnu za jezik:

Izborni jezik = Izborni.of ("fr"); Niz helloMsg = msg.get ("helloMsg", jezik) .get ();

12. Ustrajnost

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.

12.1. Model

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:

Korisnik javne klase @Entity {@Id @GeneratedValue (strategy = GenerationType.AUTO) Long id; javni String firstName; javni String e-mail; }

Zatim ćemo konfigurirati hibernaciju i postaviti detalje za vezu s bazom podataka.

12.2. Konfiguracija

Za hibernaciju, Ninja očekuje postojanost.xml datoteka biti u src / main / java / META-INF imenik:

    org.hibernate.jpa.HibernatePersistenceProvider 

Zatim ćemo dodati detalje veze baze podataka prijava.konf:

ninja.jpa.persistence_unit_name = dev_unit db.connection.url = jdbc: h2: ./ devDb db.connection.username = sa db.connection.password =

12.3. EntityManager

Na kraju ćemo ubrizgati instancu EntityManager u ApplicationController koristeći Guiceovu Pružatelj usluga razred:

javna klasa ApplicationController {@Inject Provider entityManagerProvider; // ...}

Dakle, spremni smo za upotrebu EntityManager ustrajati na Korisnik objekt:

@Transactional public Result insertUser (Korisnik korisnik) {EntityManager entityManager = entityManagerProvider.get (); entityManager.persist (korisnik); entityManager.flush (); vratiti Results.redirect ("/ home"); }

Slično tome, možemo koristiti EntityManager čitati Korisnik objekt iz DB-a:

@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); }

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.

13. Provjera valjanosti

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:

javni razred Korisnik {// ... @NotNull javni String firstName; }

Zatim ćemo izmijeniti već raspravljeno insertUser metoda u ApplicationController da biste omogućili provjeru valjanosti:

@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"); }

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.

14. Zaključak

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.


$config[zx-auto] not found$config[zx-overlay] not found