Programavimas

JAX-RS su Džersiu: įvadas

JAX-RS (JSR 311: „Java API for RESTful Web Services“) specifikacija pateikia standartizuotą „Java“ principą įgyvendinant „REST“ stiliaus interneto paslaugas. Džersis yra orientacinis JAX-RS įgyvendinimas, o šiame tinklaraščio įraše pateikiu trumpą JAX-RS įvadą per Džersį.

Nors Džersyje nereikia naudoti „GlassFish“, šiame įraše aš naudoju „Jersey“ kartu su „GlassFish v3“. „GlassFish v3“ pateikia „Java EE 6“ informacinį diegimą. Atsisiunčiau „GlassFish v3 Windows Installer“ ir paleidau ją įdiegti. Po jo įdiegimo nustatiau aplinkos kintamąjį GLASSFISH_HOME nukreipti į diegimo šakninį katalogą ir pridėti % GLASSFISH_HOME% Mano KELIS. Tada „GlassFish“ galima paleisti su komanda asadmin start-domain (paleidžia numatytąjį domeną), kaip parodyta kitame ekrano momentiniame vaizde.

Kadangi įdiegdamas „GlassFish“ naudojau numatytuosius nustatymus, žiniatinklio administravimo pultą galima rasti mano kompiuteryje adresu URI // localhost: 4848 / (numatytasis prievadas yra 4848). Kai veikia „GlassFish“, šis URI nukreipia į „Administracinės konsolės“ prisijungimo puslapį. Administracinis vartotojo vardas ir slaptažodis buvo nurodyti diegiant. Šis ekranas rodomas kitoje ekrano nuotraukoje.

Nustatęs „GlassFish“, dabar pereinu prie labai paprastos „REST“ programos kūrimo naudojant Džersį. Pradedu nuo tinkamai JAX-RS anotuotų klasių pavadinimu MovieOfTheDay:

MovieOfTheDay.java

paketas rmoug.td2010.rest; importuoti java.util.Calendar; importuoti java.util.HashMap; importuoti java.util.Žemėlapis; importuoti java.util.logging.Logger; importuoti javax.ws.rs.GET; importuoti javax.ws.rs.Path; importuoti javax.ws.rs.PathParam; importuoti javax.ws.rs.Vartoja; importuoti javax.ws.rs.Productions; / ** * Paprasta klasė, kurioje pateikiamas filmas to mėnesio ir mėnesio dienai. * / @Path ("/ movies") viešoji klasė MovieOfTheDay {private static final Logger LOGGER = Logger.getLogger ("rmoug.td2010.rest.MovieOfTheDay"); privatus statinis galutinis žemėlapis MOVIE_OF_THE_DAY; statinis {MOVIE_OF_THE_DAY = naujas „HashMap“(); galutinis žemėlapis janMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalendorius.JANUARY), janMovies); final map febMovies = new HashMap (); febMovies.put (2, "Groundhog Day"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalendorius.FEBRUARY), febMovies); final map marMovies = new HashMap (); marMovies.put (16, „Bėglys“); marMovies.put (17, „Darby O'Gill ir maži žmonės“); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MARCH), marMovies); final Map aprMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.APRIL), aprMovies); final Map mayMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MAY), mayMovies); final Map junMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JUNE), junMovies); galutinis žemėlapis julMovies = new HashMap (); julMovies.put (4, „Nepriklausomybės diena“); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JULY), julMovies); final Map augMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.AUGUST), augMovies); final Map sepMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalendorius.SEPTEMBER), sepMovies); final map octMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.OCTOBER), octMovies); final Map novMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.NOVEMBER), novMovies); final Map decMovies = new HashMap (); decMovies.put (24, „Tai nuostabus gyvenimas“); decMovies.put (25, „Kalėdinė giesmė“); decMovies.put (26, „Kalėdinė istorija“); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalendorius.DECEMBER), decMovies); } @ GET @Path ("/") @Produces ("text / plain") public String getMovie () {return "Norėdami pamatyti dienos filmą, nurodykite URL su mėnesiu ir diena:" + "\ t // localhost : 8080 / rest / resources / movies / <> / <> "; } / ** * Gaukite dienos filmą, nurodytą nurodytu mėnesiu ir data. * * @param mėnuo Mėnuo, kuriam dienos filmui pageidautina. * @param date Data, kuriam dienos filmui pageidautina. * @return Dienos filmo pavadinimas nurodytam mėnesiui ir datai. * / @GET @Path ("/ {month} / {date}") @Consumes ("text / plain") @Produces ("text / html") public String getMovieOfTheDay (@PathParam ("month") final Integer month , @PathParam ("data") galutinė sveikoji data) {final Žemėlapis moviesOfTheMonth = MOVIE_OF_THE_DAY.get (mėnuo-1); paskutinė eilutė movieOfTheDay = moviesOfTheMonth! = null? moviesOfTheMonth.get (data): „Fletch“; grįžti movieOfTheDay! = null? generuoti HTML (movieOfTheDay, mėnuo, data): generuoti HTML ("Fletch gyvena!", mėnuo, data); } privati ​​eilutė generHtml (final String movieTitle, final int movieMonth, final int movieDay) {final StringBuilder builder = new StringBuilder (); builder.append ("") .append ("Dienos filmas") .append ("Dienos filmas") .append ("

Dienos filmas, skirtas „) .append (movieMonth) .append („ / “) .append (movieDay) .append (" is '") .append (movieTitle) .append ("'.

"); grąžinkite builder.toString ();}}

Statinis inicializavimo blokas nėra būdingas JAX-RS, jis naudojamas imituoti duomenų bazę. Tikroje „REST“ programoje beveik neabejotinai turėčiau duomenų bazę, bet atminties statinis žemėlapis tai imituoja čia.

Nors ir paprasta, aukščiau paminėta klasė demonstruoja pagrindines JAX-RS funkcijas. Įdomiausi JAX-RS kūriniai yra JAX-RS anotacijos, tokios kaip @Path, @GET, @Consumes, @Produces ir @PathParam. Nesigilinsiu į tai, ką šios JAX-RS anotacijos daro šiame įraše, nes mano akcentas yra Džersio naudojimas. Daugiau informacijos apie šias anotacijas rasite „Java EE 6“ pamokų skyriuje „REST with Jersey“.

Aš išdėstysiu JAX-RS anotuotą klasę „GlassFish“ WAR faile su atitinkamu web.xml failas, kaip parodyta toliau:

web.xml

  ServletAdaptor com.sun.jersey.spi.container.servlet.ServletContainer 1 „ServletAdaptor“ / ištekliai / * 30 

Mano atveju tai sukūrė „NetBeans 6.8“ web.xml failą man automatiškai, kai prie savo projekto bibliotekų pridėjau atitinkamus JAX-RS ir Jersey JAR failus. Tai yra gana paprasta web.xml failą, nes „GlassFish“ žino JAX-RS. (Stulbinamai panašus web.xml veikia diegiant Džersio REST programas Tomcat, kaip parodyta Jasono Drake'o tinklaraščio įraše „Džersio diegimas Tomcat 6.0“.)

Mano pavyzdžiu vadinamas WAR failas Poilsis1.karas yra generuojamas. Jo turinys rodomas kitoje ekrano nuotraukoje.

Kaip rodo ekrano momentinė nuotrauka, į sugeneruotą WAR failą yra įtraukti JAX-RS ir Jersey JAR failai. Klasė „MovieRestApplication“ galima nepaisyti, nes jis nėra naudojamas kartu su „JerseyFish“. Tai reiškia, kad vieninteliai pritaikyti failai WAR yra JAX-RS anotuota klasė MovieOfTheDay, web.xml failą ir rodyklės puslapį (rodyklė.jsp). Programos turinys rodyklė.jsp puslapis rodomas toliau.

rodyklė.jsp

    POILSIS su JAX-RS pavyzdžiu 

Kitas ekrano momentinis vaizdas rodo sugeneruoto WAR failo diegimą per internetinę „Glass Administrative Console“:

Svarbiausia detalė, į kurią reikia atkreipti dėmesį iš WAR failo diegimo vaizdo, yra tai, kad aš pavadinau konteksto šaknį „poilsis“. Tai bus dalis URI, kuriais pasiekiamos mano įdiegtos REST paslaugos. Kuo anksčiau web.xml byla taip pat parodė ištekliai / taip pat bus šio REST paslaugos prieigos URI dalis. Likusi atitinkamo URI dalis yra pagrįsta URI dalimis, pateiktomis JAX-RS anotacijose Java klasėje (/ filmai, /ir / {mėnuo} / {data}). URI dalys, žymimos garbanotaisiais petnešomis, rodo, kad vietos rezervuotojams bus įvestos JAX-RS diegimo vertės, esančios skambinančiame URI. Pavyzdžiui, jei atitinkama URI dalis buvo /7/4, tai šiuo atveju rodytų 7 mėnesių mėnesį (liepos mėn., nes nenaudoja Java nulinio mėnesio indekso URI) ir 4 dieną.

Kai diegimas sėkmingas, pasirodo administracinė konsolė, kaip parodyta kitame ekrano momentiniame vaizde.

Kai įdiegta JAX-RS programa, dabar galiu ją pasiekti iš daugybės skirtingų klientų. JAX-RS nenurodo standartizuoto požiūrio į klientus, tačiau Džersis ir dauguma kitų populiarių JAX-RS diegimo būdų klientams kuria savo požiūrį. Galimi ir kiti HTTP / REST klientai, tokie kaip RESTClient. Kol kas paprasčiausiai naudosiuosi interneto naršykle.

URI pateikimas // vietinis šeimininkas: 8080 / mano naršyklėje rodomas pagrindinis puslapis, nurodantis, kad veikia „GlassFish“:

Jei pridėsiu žiniatinklio kontekstą (pailsėti) į URI, matau savo rodyklė.jsp puslapis:

Norėdamas prisijungti prie JAX-RS valdomų REST programų, turiu pridėti išteklių dalis URI, kaip nurodyta web.xml failą. Kai pridėsiu šį ir / filmai dalis (kaip nurodyta @ Kelias anotacija), matau šį puslapį.

Pirmiau pateikta ekrano kopija rodo, kad GET prieiga buvo iškviesta keliu "/" ir „getMovie“ metodas buvo vadinamas. Šiuo metu galiu pridėti mėnesį ir datą prie URI, kad gautumėte filmą tai konkrečiai dienai. Kiti du ekrano momentiniai vaizdai tai parodo Groundhog Day ir Kalėdų dienai.

Kaip rodo pirmiau pateiktos ekrano nuotraukos, mėnesius ir dienas, nurodytus URI, JAX-RS teikėjas automatiškai įveda į parametrus pagal tinkamą metodą. Dabar tai lengva!

Išvada

JAX-RS pagrįstos žiniatinklio paslaugos diegimas naudojant „Jersey“ ir „GlassFish“ yra gana paprastas. Viskas, ko man labai reikėjo, buvo prieiga prie JAX-RS ir Džersio JAR, tinkamai pažymėtos „Java“ klasės ir trumposios web.xml failą, leidusį Džersį naudoti kaip servletą. Šiame tinklaraščio įraše bandyta parodyti pagrindinius veiksmus, susijusius su paprastos JAX-RS komentuotų klasės rašymu, jos pritaikymu „GlassFish“ ir pasinaudojimu Džersio JAX-RS diegimo galimybėmis.

Kiti šaltiniai

EST „RESTful Web Services“ kūrėjo vadovas

EST RESTful Java, kai kurios nuorodos

⇒ JSR 311: „Java“ programa „RESTful Web Services“?

⇒ „Jersey“ programos diegimas ir testavimas be „NetBeans“

⇒ „Jersey 1.0“: pradžia

⇒ JSR-311 „Javadoc“ pagrindu sukurta API

Šią istoriją „JAX-RS with Jersey: An Introduction“ iš pradžių išleido „JavaWorld“.

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