Ohjelmointi

JAX-RS ja Jersey: Johdanto

JAX-RS (JSR 311: Java API for RESTful Web Services) -määritys tarjoaa standardoidun Java-pohjaisen lähestymistavan REST-tyylisten verkkopalvelujen toteuttamiseen. Jersey on JAX-RS: n referenssitoteutus, ja esitän tässä blogiviestissä lyhyen esittelyn JAX-RS: lle Jerseyn kautta.

Vaikka Jersey ei vaadi GlassFishin käyttöä, käytän Jerseyä yhdessä GlassFish v3: n kanssa tässä viestissä. GlassFish v3 tarjoaa viitetoteutuksen Java EE 6: lle. Latasin GlassFish v3 Windows Installerin ja suoritin sen asennusta varten. Asennuksen jälkeen asetin ympäristömuuttujan GLASSFISH_HOME osoittaa asennuksen juurihakemistoon ja lisätty % GLASSFISH_HOME% minun PATH. GlassFish voidaan sitten suorittaa komennolla asadmin start-domain (käynnistää oletusalueen) seuraavan näytön tilannekuvan osoittamalla tavalla.

Koska käytin oletusasetuksia GlassFish-asennuksen aikana, verkkopohjainen hallintakonsoli on käytettävissä koneellani osoitteessa URI // localhost: 4848 / (oletusportti on 4848). Kun GlassFish on käynnissä, tämä URI johtaa hallintakonsolin kirjautumissivulle. Järjestelmänvalvojan käyttäjänimi ja salasana määritettiin asennuksessa. Tämä näyttö näkyy seuraavassa tilannekuvassa.

Kun GlassFish on määritetty, siirryn nyt kehittämään hyvin yksinkertaisen REST-sovelluksen Jerseyn avulla. Aloitan oikein JAX-RS-merkityllä luokassa nimeltä MovieOfTheDay:

MovieOfTheDay.java

paketti rmoug.td2010.rest; tuo java.util.Calendar; tuo java.util.HashMap; tuo java.util.Kartta; tuo java.util.logging.Logger; tuo javax.ws.rs.GET; tuo javax.ws.rs.Path; tuo javax.ws.rs.PathParam; tuo javax.ws.rs.Consumes; tuo javax.ws.rs.tuotteet; / ** * Yksinkertainen luokka, joka tarjoaa elokuvan kyseisen kuukauden * kuukausi ja päivä. * / @Path ("/ movies") julkinen luokka MovieOfTheDay {private static final Logger LOGGER = Logger.getLogger ("rmoug.td2010.rest.MovieOfTheDay"); yksityinen staattinen lopullinen kartta MOVIE_OF_THE_DAY; staattinen {MOVIE_OF_THE_DAY = uusi HashMap(); lopullinen kartta janMovies = new HashMap (); MOVIE_OF_THE_DAY.put (KokonaisarvoOf (Kalenteri.TAMMIKUU), tammikuuElokuvat); lopullinen kartta febMovies = new HashMap (); febMovies.put (2, "Groundhog Day"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalenteri.FEBRUARY), febMovies); lopullinen kartta marMovies = uusi HashMap (); marMovies.put (16, "Pakeneva"); marMovies.put (17, "Darby O'Gill ja pienet ihmiset"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalenteri.MARCH), marMovies); lopullinen kartta aprMovies = uusi HashMap (); MOVIE_OF_THE_DAY.put (KokonaisarvoOf (Kalenteri.APRIL), aprMovies); lopullinen Map mayMovies = uusi HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MAY), mayMovies); lopullinen kartta junMovies = uusi HashMap (); MOVIE_OF_THE_DAY.put (KokonaisarvoOf (Kalenteri.KESÄKUU), junMovies); lopullinen kartta julMovies = uusi HashMap (); julMovies.put (4, "Itsenäisyyspäivä"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalenteri.JULY), heinäkuuElokuvat); lopullinen kartta augMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.AUGUST), augMovies); lopullinen kartta sepMovies = uusi HashMap (); MOVIE_OF_THE_DAY.put (KokonaisarvoOf (Kalenteri.SEPTEMBER), sepMovies); lopullinen kartta octMovies = uusi HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.OCTOBER), octMovies); lopullinen kartta novMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Kalenteri.NOVEMBER), novMovies); lopullinen Map decMovies = uusi HashMap (); decMovies.put (24, "Se on upeaa elämää"); decMovies.put (25, "Joululaulu"); decMovies.put (26, "Joulutarina"); MOVIE_OF_THE_DAY.put (kokonaisluku.arvoOf (kalenteri.JOULUKUU), decMovies); } @ GET @Path ("/") @Produces ("text / plain") public String getMovie () {return "Jos haluat nähdä päivän elokuvan, anna URL-osoite kuukausi ja päivä:" + "\ t // localhost : 8080 / rest / resources / movies / <> / <> "; } / ** * Hanki päivän elokuva ilmoitetun kuukauden ja päivämäärän mukaisesti. * * @param month Kuukausi, jolle päivän elokuva halutaan. * @param date Päivämäärä, jolle päivän elokuva halutaan. * @return Päivän elokuvan nimi annetulle kuukaudelle ja päivämäärälle. * / @GET @Path ("/ {month} / {date}") @Consumes ("text / plain") @Produces ("text / html") public String getMovieOfTheDay (@PathParam ("month") final Integer month , @PathParam ("date") viimeinen kokonaislukupäivä) {final Map moviesOfTheMonth = MOVIE_OF_THE_DAY.get (kuukausi-1); viimeinen merkkijono movieOfTheDay = moviesOfTheMonth! = null? moviesOfTheMonth.get (päivämäärä): "Fletch"; palaa movieOfTheDay! = null? generatorHtml (movieOfTheDay, kuukausi, päivämäärä): generHtml ("Fletch elää!", kuukausi, päivämäärä); } yksityinen merkkijono generHtml (viimeinen String movieTitle, viimeinen int movieMonth, viimeinen int movieDay) {final StringBuilder builder = new StringBuilder (); builder.append ("") .append ("Päivän elokuva") .append ("Päivän elokuva") .append ("

Päivän elokuva kohteelle ") .append (movieMonth) .append (" / ") .append (movieDay) .append (" is "") .append (movieTitle) .append ("'.

"); return builder.toString ();}}

Staattinen alustuslohko ei ole JAX-RS-spesifinen, vaan sitä käytetään tietokannan simulointiin. Todellisessa REST-sovelluksessa minulla olisi melkein varmasti tietokanta taustapäässä, mutta muistissa oleva staattinen kartta simuloi sitä täällä.

Vaikka yllä oleva luokka on yksinkertainen, se näyttää JAX-RS: n tärkeimmät ominaisuudet. Luokan mielenkiintoisimmat JAX-RS-kappaleet ovat JAX-RS-merkinnät, kuten @Path, @GET, @Consumes, @Produces ja @PathParam. En kaivu siihen, mitä nämä JAX-RS-merkinnät tekevät tässä viestissä, koska painotan Jerseyn käyttöä. Katso Java EE 6: n opasluku REST with Jerseystä saadaksesi lisää taustaa näistä merkinnöistä.

Asennan JAX-RS-merkityn luokan GlassFishiin WAR-tiedostossa asianmukaisella web.xml tiedosto seuraavalla tavalla:

web.xml

  ServletAdaptor com.sun.jersey.spi.container.servlet.ServletContainer 1 ServletAdaptor / resurssit / * 30 

Minun tapauksessani NetBeans 6.8 loi tämän web.xml tiedosto minulle automaattisesti, kun lisäsin sopivat JAX-RS- ja Jersey JAR -tiedostot projektini kirjastoihin. Tämä on suhteellisen yksinkertaista web.xml tiedosto, koska GlassFish on tietoinen JAX-RS: stä. (Hämmästyttävän samanlainen web.xml toimii Jersey-pohjaisten REST-sovellusten käyttöönotossa Tomcatille, kuten Jason Draken blogijulkaisussa Jerseyn käyttöönotto Tomcat 6.0: ssa osoitetaan.)

Esimerkiksi WAR-tiedosto nimeltä Lepo1.sota syntyy. Sen sisältö näkyy seuraavassa näytön tilannekuvassa.

Kuten näytön tilannekuva osoittaa, luotuun WAR-tiedostoon sisältyy JAX-RS- ja Jersey JAR-tiedostoja. Luokka MovieRestApplication voidaan jättää huomiotta, koska sitä ei käytetä JerseyFish-jerseyn kanssa. Tämä tarkoittaa, että sodan ainoat mukautetut tiedostot ovat JAX-RS-merkityt luokat MovieOfTheDay, web.xml tiedosto ja hakemistosivu (index.jsp). Sisältö index.jsp sivu näkyy seuraavana.

index.jsp

    REST JAX-RS -esimerkillä 

Seuraava näytön tilannekuva osoittaa luodun WAR-tiedoston käyttöönoton WWW-pohjaisen Glass Administrative Console -sovelluksen kautta:

Tärkein yksityiskohta, joka on huomioitava WAR-tiedoston käyttöönoton kuvasta, on se, että olen nimennyt kontekstin juureksi "loput". Tämä on osa URI-tunnuksia, joilla käyttöönotettuja REST-palvelujani käytetään. Aikaisempi web.xml tiedosto osoitti myös sen resurssit / on myös osa tätä REST-palvelun käyttöoikeuksien URI: ta. Loput sopivasta URI: stä perustuvat Java-luokan JAX-RS-huomautuksiin sisältyviin URI-paloihin (/ elokuvia, /ja / {kuukausi} / {päiväys}). Kiharoilla aaltosulkeilla merkityt URI: n osat osoittavat, että paikkamerkkeihin injektoidaan JAX-RS-toteutuksen arvoja, jotka ovat kutsuvassa URI: ssä. Esimerkiksi, jos asiaankuuluva URI-osa oli /7/4, tämä tarkoittaisi tässä tapauksessa kuukautta 7 (heinäkuu, koska ei käytetä Java: n nollaan perustuvaa kuukauden indeksiä URI: ssa) ja päivää 4.

Kun käyttöönotto onnistuu, hallintakonsoli tulee näkyviin seuraavan näytön tilannekuvan mukaisesti.

Kun JAX-RS-sovellus on otettu käyttöön, voin nyt käyttää sitä lukemattomilta asiakkailta. JAX-RS ei tarkoita standardoitua lähestymistapaa asiakkaille, mutta Jersey ja useimmat muut suositut JAX-RS-toteutukset tarjoavat oman lähestymistavan asiakkaiden rakentamiseen. Saatavilla on myös muita HTTP / REST-asiakkaita, kuten RESTClient. Toistaiseksi käytän yksinkertaisesti verkkoselainta.

URI: n sijoittaminen // paikallinen isäntä: 8080 / selaimessani näyttää pääsivun, joka osoittaa, että GlassFish on käynnissä:

Jos lisätään verkkokonteksti (levätä) URI: lle, näen minun index.jsp sivu:

Jotta voin käyttää JAX-RS-pohjaisia ​​REST-sovelluksia, minun on lisättävä resursseja - osa URI: sta web.xml tiedosto. Kun lisäät tämän plus / elokuvia osa (kuten määritelty @Path huomautus), näen seuraavan sivun.

Yllä oleva näytön tilannekuva osoittaa, että GET-pääsyyn käytettiin polkua "/" ja getMovie menetelmää kutsuttiin. Tässä vaiheessa voin lisätä kuukauden ja päivämäärän URI: hen saadaksesi elokuvan kyseiselle päivälle. Seuraavat kaksi näyttökuvaa osoittavat tämän Groundhog Day- ja Christmas Day -päiville.

Kuten yllä olevat kuvakaappaukset osoittavat, JAX-RS-palveluntarjoaja injektoi automaattisesti URI: issa annetut kuukaudet ja päivät parametreihin sopivaan menetelmään. Nyt se on helppoa!

Johtopäätös

JAX-RS-pohjaisen verkkopalvelun käyttöönotto Jerseyn ja GlassFishin avulla on suhteellisen yksinkertaista. Tarvitsin vain pääsyn JAX-RS: n ja Jersey JAR: iin, oikein merkittyihin Java-luokkiin ja lyhyisiin web.xml tiedosto, joka antoi Jerseylle mahdollisuuden käyttää servlet-sovellusta. Tässä blogiviestissä on yritetty näyttää yksinkertaisen JAX-RS-merkityn luokan kirjoittamisen perusvaiheet, ottaa se käyttöön GlassFishille ja hyödyntää Jerseyn JAX-RS-toteutusta.

Muut resurssit

⇒ RESTful Web Services -kehittäjän opas

⇒ RESTful Java, joitain linkkejä

⇒ JSR 311: Java-sovellusliittymä RESTful-verkkopalveluille?

⇒ Jerseysovelluksen käyttöönotto ja testaus ilman NetBeansia

⇒ Jersey 1.0: Aloittaminen

⇒ JSR-311 Javadoc-pohjainen sovellusliittymä

Tämän tarinan "JAX-RS Jersey: kanssa: Johdanto" julkaisi alun perin JavaWorld.

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