Programmering

JAX-RS med Jersey: En introduksjon

JAX-RS (JSR 311: Java API for RESTful Web Services) spesifikasjonen gir en standardisert Java-basert tilnærming til implementering av REST-stil webtjenester. Jersey er referanseimplementeringen av JAX-RS, og jeg gir en kort introduksjon til JAX-RS via Jersey i dette blogginnlegget.

Selv om Jersey ikke krever bruk av GlassFish, bruker jeg Jersey i forbindelse med GlassFish v3 i dette innlegget. GlassFish v3 gir referanseimplementering for Java EE 6. Jeg laster ned GlassFish v3 Windows Installer og kjørte den for installasjon. Etter installasjonen satte jeg miljøvariabelen GLASSFISH_HOME for å peke på installasjonens rotkatalog og lagt til % GLASSFISH_HOME% til min STI. GlassFish kan deretter kjøres med kommandoen asadmin start-domene (starter standarddomenet) som vist i neste skjermbilde.

Fordi jeg brukte standardinnstillingene under installasjonen av GlassFish, er den nettbaserte administrative konsollen tilgjengelig på maskinen min på URI // localhost: 4848 / (standardport er 4848). Når GlassFish kjører, fører denne URI til påloggingssiden for administrasjonskonsollen. Det administrative brukernavnet og passordet ble spesifisert i installasjonen. Dette skjermbildet vises i neste skjermbilde.

Med GlassFish satt opp, går jeg nå videre til å utvikle en veldig enkel REST-applikasjon ved hjelp av Jersey. Jeg starter med en skikkelig JAX-RS-merket klasse kalt MovieOfTheDay:

MovieOfTheDay.java

pakke rmoug.td2010.rest; importere java.util.Calendar; importere java.util.HashMap; importere java.util.Map; importere java.util.logging.Logger; importere javax.ws.rs.GET; importere javax.ws.rs.Path; importere javax.ws.rs.PathParam; importere javax.ws.rs.Consumes; importere javax.ws.rs.Produkter; / ** * Enkel klasse som gir en film for den angitte måneden og dagen i den * måneden. * / @Path ("/ films") offentlig klasse MovieOfTheDay {privat statisk slutt Logger LOGGER = Logger.getLogger ("rmoug.td2010.rest.MovieOfTheDay"); privat statisk endelig Kart MOVIE_OF_THE_DAY; statisk {MOVIE_OF_THE_DAY = nytt HashMap(); endelig Kart janMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JANUAR), janMovies); endelig Kart febMovies = nytt HashMap (); febMovies.put (2, "Groundhog Day"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.FEBRUARY), febMovies); endelig Kart marMovies = nytt HashMap (); marMovies.put (16, "The Fugitive"); marMovies.put (17, "Darby O'Gill and the Little People"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MARCH), marMovies); endelig kart aprMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.APRIL), aprMovies); endelig kart mayMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MAY), mayMovies); endelig Kart junMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JUNE), junMovies); endelig Kart julMovies = nytt HashMap (); julMovies.put (4, "Uavhengighetsdagen"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JULY), julMovies); endelig Kart augMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.AUGUST), augMovies); endelig Map sepMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.SEPTEMBER), sepMovies); endelig Kart octMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.OCTOBER), octMovies); endelig Kart novMovies = nytt HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.NOVEMBER), novMovies); endelig Kart decMovies = nytt HashMap (); decMovies.put (24, "It's A Wonderful Life"); decMovies.put (25, "A Christmas Carol"); decMovies.put (26, "A Christmas Story"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.DECEMBER), decMovies); } @GET @Path ("/") @Produces ("text / plain") public String getMovie () {return "For å se dagens film, oppgi URL med måned og dag:" + "\ t // localhost : 8080 / rest / resources / films / <> / <> "; } / ** * Få filmen på dagen som angitt av angitt måned og dato. * * @paramånedemåned for hvilken film av dagen som ønskes. * @param date Dato for hvilken film på dagen du ønsker. * @return Tittel på dagens film for angitt måned og dato. * / @GET @Path ("/ {month} / {date}") @Consumes ("text / plain") @Produces ("text / html") public String getMovieOfTheDay (@PathParam ("month") final Integer month , @PathParam ("date") endelig heldato) {final Map moviesOfTheMonth = MOVIE_OF_THE_DAY.get (måned-1); final String movieOfTheDay = moviesOfTheMonth! = null? moviesOfTheMonth.get (dato): "Fletch"; returner movieOfTheDay! = null? createHtml (movieOfTheDay, month, date): createHtml ("Fletch Lives!", month, date); } private String generereHtml (endelig String movieTitle, final int movieMonth, final int movieDay) {final StringBuilder builder = new StringBuilder (); builder.append ("") .append ("Dagens film") .append ("Dagens film") .append ("

Dagens film for ") .append (movieMonth) .append (" / ") .append (movieDay) .append (" is '") .append (movieTitle) .append ("'.

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

Den statiske initialiseringsblokken er ikke spesifikk for JAX-RS, men brukes i stedet for å simulere en database. I et ekte REST-program ville jeg nesten helt sikkert ha en database på baksiden, men det statiske kartet i minnet simulerer det her.

Selv om det er enkelt, viser ovennevnte klasse viktige JAX-RS-funksjoner. De mest interessante JAX-RS-brikkene i klassen er JAX-RS-kommentarene som @Path, @GET, @Consumes, @Produces og @PathParam. Jeg vil ikke fordype meg i hva disse JAX-RS-kommentarene gjør i dette innlegget fordi jeg legger vekt på å bruke Jersey. Se veiledningskapittelet for Java EE 6 om REST with Jersey for mer bakgrunn om disse kommentarene.

Jeg vil distribuere den JAX-RS-merkede klassen til GlassFish i en WAR-fil med den aktuelle web.xml filen som vist neste:

web.xml

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

I mitt tilfelle genererte NetBeans 6.8 dette web.xml filen for meg automatisk når jeg la til de riktige JAX-RS- og Jersey JAR-filene i prosjektets biblioteker. Dette er relativt enkelt web.xml fil på grunn av GlassFishs bevissthet om JAX-RS. (En påfallende lik web.xml jobber for distribusjon av Jersey-baserte REST-applikasjoner til Tomcat som vist i Jason Drakes blogginnlegg Deploying Jersey in Tomcat 6.0.)

For mitt eksempel, en WAR-fil kalt Rest1.war genereres. Innholdet vises i neste skjermbilde.

Som øyeblikksbildet på skjermen indikerer, er det JAX-RS og Jersey JAR-filer inkludert i den genererte WAR-filen. Klassen MovieRestApplication kan ignoreres fordi den ikke brukes med Jersey på GlassFish. Dette betyr at de eneste egendefinerte filene i WAR er JAX-RS-merket klasse MovieOfTheDay, den web.xml fil og indeksiden (index.jsp). Innholdet i index.jsp siden vises neste.

index.jsp

    HVIL med JAX-RS Eksempel 

Det neste skjermbildet viser distribusjon av den genererte WAR-filen via den nettbaserte Glass Administrative Console:

Den viktigste detalj å merke seg fra bildet av distribusjonen av WAR-filen er at jeg har kalt kontekstroten "hvile". Dette vil være en del av URI-ene som får tilgang til mine utplasserte REST-tjenester. Jo tidligere web.xml filen viste også det ressurser / vil også være en del av denne REST-tjenestetilgang-URI. Resten av den aktuelle URI er basert på URI-delene gitt i JAX-RS-merknadene på Java-klassen (/ filmer, /, og / {month} / {date}). Delene av URI betegnet med krøllete bukseseler indikerer at plassholderne vil bli injisert med verdier fra JAX-RS-implementeringen som er i den kallende URI. For eksempel hvis den aktuelle delen av URI var /7/4, dette vil indikere, i dette tilfellet, en måned på 7 (juli fordi du ikke bruker Javas nullbaserte månedindeks i URI) og en dag på 4.

Når distribusjonen er vellykket, vises administrasjonskonsollen som vist i neste skjermbilde.

Med JAX-RS-applikasjonen distribuert, kan jeg nå få tilgang til den fra et utall forskjellige klienter. JAX-RS staver ikke ut en standardisert tilnærming for kunder, men Jersey og de fleste andre populære JAX-RS-implementeringer gir sin egen tilnærming for å bygge kunder. Andre HTTP / REST-klienter er også tilgjengelige, for eksempel RESTClient. For nå bruker jeg bare en nettleser.

Plassere URI // lokal vert: 8080 / i nettleseren min viser hovedsiden som indikerer at GlassFish kjører:

Hvis jeg legger til nettkonteksten (hvile) til URI, ser jeg min index.jsp side:

For å få tilgang til JAX-RS-drevne REST-applikasjoner, må jeg legge til ressurser delen av URI som spesifisert i web.xml fil. Når jeg legger til dette pluss / filmer del (som spesifisert i @Sti merknad), ser jeg neste side.

Ovenstående skjermbilde viser at GET-tilgang ble påkalt med stien "/" og getMovie metoden ble kalt. På dette tidspunktet kan jeg legge til en måned og dato i URI for å få en film for den bestemte dagen. De to neste skjermbildene viser dette for Groundhog Day og for 1. juledag.

Som de ovennevnte skjermbildene viser, injiseres månedene og dagene i URI automatisk av JAX-RS-leverandøren i parametrene til riktig metode. Nå er det enkelt!

Konklusjon

Prosessen med å distribuere en JAX-RS-basert nettjeneste ved bruk av Jersey og GlassFish er relativt grei. Alt jeg virkelig trengte var tilgang til JAX-RS- og Jersey-JAR, den riktig kommenterte Java-klassen og den korte web.xml fil som tillot Jersey å bli brukt som servlet. Dette blogginnlegget har forsøkt å vise de grunnleggende trinnene som er involvert i å skrive en enkel JAX-RS-merket klasse, distribuere den til GlassFish og dra nytte av Jerseys implementering av JAX-RS.

Andre ressurser

⇒ RESTful Web Services Developer's Guide

EST RESTful Java, noen lenker

⇒ JSR 311: En Java API for RESTful Web Services?

⇒ Distribuere og teste en Jersey-applikasjon uten NetBeans

⇒ Jersey 1.0: Komme i gang

⇒ JSR-311 Javadoc-basert API

Denne historien, "JAX-RS med Jersey: En introduksjon" ble opprinnelig utgitt av JavaWorld.

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