Programování

JAX-RS s Jersey: Úvod

Specifikace JAX-RS (JSR 311: Java API pro RESTful Web Services) poskytuje standardizovaný přístup založený na prostředí Java k implementaci webových služeb ve stylu REST. Jersey je referenční implementací JAX-RS a v tomto příspěvku na blogu poskytuji krátký úvod do JAX-RS přes Jersey.

Ačkoli Jersey nevyžaduje použití GlassFish, v tomto příspěvku používám Jersey ve spojení s GlassFish v3. GlassFish v3 poskytuje referenční implementaci pro Java EE 6. Stáhl jsem si Windows Installer GlassFish v3 a spustil jsem jej pro instalaci. Po jeho instalaci jsem nastavil proměnnou prostředí GLASSFISH_HOME přejděte na kořenový adresář instalace a přidejte % GLASSFISH_HOME% mému CESTA. GlassFish lze poté spustit pomocí příkazu asadmin start-domain (spustí výchozí doménu), jak je znázorněno na následujícím snímku obrazovky.

Protože jsem během instalace aplikace GlassFish použil výchozí nastavení, je webová administrativní konzole k dispozici na mém počítači na adrese URI // localhost: 4848 / (výchozí port je 4848). Se spuštěným GlassFish vede tento identifikátor URI na přihlašovací stránku pro konzolu pro správu. Při instalaci bylo zadáno administrativní uživatelské jméno a heslo. Tato obrazovka se zobrazí na dalším snímku obrazovky.

S nastavením GlassFish nyní přejdu k vývoji velmi jednoduché aplikace REST pomocí Jersey. Začínám správně pojmenovanou třídou JAX-RS nazvanou MovieOfTheDay:

MovieOfTheDay.java

balíček rmoug.td2010.rest; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; importujte javax.ws.rs. spotřební materiály; import javax.ws.rs.Produces; / ** * Jednoduchá třída, která poskytuje film pro daný měsíc a den daného * měsíce. * / @Path ("/ films") veřejná třída MovieOfTheDay {private static final Logger LOGGER = Logger.getLogger ("rmoug.td2010.rest.MovieOfTheDay"); soukromá statická finální mapa MOVIE_OF_THE_DAY; static {MOVIE_OF_THE_DAY = nová HashMap(); finální mapa janMovies = nový HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JANUARY), janMovies); finální mapa febMovies = nový HashMap (); febMovies.put (2, „Hromnice o den více“); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.FEBRUARY), febMovies); final Map marMovies = nový HashMap (); marMovies.put (16, „Uprchlík“); marMovies.put (17, „Darby O'Gill and the Little People“); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MARCH), marMovies); finální mapa aprMovies = nová HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.APRIL), aprMovies); finální mapa mayMovies = nová HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MAY), mayMovies); finální mapa junMovies = nový HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JUNE), junMovies); final Map julMovies = nový HashMap (); julMovies.put (4, „Den nezávislosti“); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JULY), julMovies); finální mapa augMovies = nový HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.AUGUST), augMovies); finální mapa sepMovies = nová HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.SEPTEMBER), sepMovies); final Map octMovies = new HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.OCTOBER), octMovies); finální mapa novMovies = nová HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.NOVEMBER), novMovies); final Map decMovies = nový HashMap (); decMovies.put (24, „Je to báječný život“); decMovies.put (25, „Vánoční koleda“); decMovies.put (26, „Vánoční příběh“); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.DECEMBER), decMovies); } @GET @Path ("/") @Produces ("text / plain") public String getMovie () {návrat "Chcete-li si prohlédnout film dne, zadejte URL s měsícem a dnem:" + "\ t // localhost : 8080 / rest / resources / films / <> / <> "; } / ** * Získejte film dne, jak je uvedeno v uvedeném měsíci a datu. * * @param měsíc Měsíc, pro který je požadován film dne. * @param date Datum požadovaného filmu dne. * @return Název filmu dne pro daný měsíc a datum. * / @GET @Path ("/ {month} / {date}") @Consumes ("text / plain") @Produces ("text / html") veřejný řetězec getMovieOfTheDay (@PathParam ("měsíc") poslední celé číslo , @PathParam ("date") final Integer date) {final Map filmsOfTheMonth = MOVIE_OF_THE_DAY.get (měsíc-1); final String movieOfTheDay = filmsOfTheMonth! = null? moviesOfTheMonth.get (datum): "Fletch"; vrátit filmOfTheDay! = null? generateHtml (movieOfTheDay, měsíc, datum): generateHtml ("Fletch Lives!", měsíc, datum); } private String generateHtml (final String movieTitle, final int movieMonth, final int movieDay) {final StringBuilder builder = new StringBuilder (); builder.append ("") .append ("Film dne") .append ("Film dne") .append ("

The day of the day for ") .append (movieMonth) .append (" / ") .append (movieDay) .append (" is '") .append (movieTitle) .append ("'.

"); vrátit builder.toString ();}}

Statický inicializační blok není specifický pro JAX-RS, ale místo toho se používá k simulaci databáze. Ve skutečné aplikaci REST bych téměř jistě měl databázi na zadní straně, ale statická mapa v paměti ji zde simuluje.

I když je jednoduchá, výše uvedená třída ukazuje klíčové funkce JAX-RS. Nejzajímavějšími kousky JAX-RS třídy jsou poznámky JAX-RS, jako jsou @Path, @GET, @Consumes, @Produces a @PathParam. Nebudu se v tomto příspěvku zabývat tím, co tyto anotace JAX-RS dělají, protože můj důraz je kladen na používání Jersey. Další informace o těchto anotacích najdete v kapitole Výukový program Java EE 6 o REST with Jersey.

Nasadím anotovanou třídu JAX-RS do GlassFish v souboru WAR s příslušným web.xml soubor, jak je znázorněno dále:

web.xml

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

V mém případě to vygeneroval NetBeans 6.8 web.xml soubor pro mě automaticky, když jsem přidal příslušné soubory JAX-RS a Jersey JAR do knihoven svého projektu. To je relativně jednoduché web.xml soubor z důvodu povědomí GlassFish o JAX-RS. (Nápadně podobný web.xml pracuje pro nasazení aplikací REST založených na Jersey do Tomcatu, jak je ukázáno v blogovém příspěvku Jasona Drakea Deploying Jersey in Tomcat 6.0.)

Pro můj příklad se jmenuje soubor WAR Odpočinek 1. válka je generován. Jeho obsah se zobrazí na následujícím snímku obrazovky.

Jak naznačuje snímek obrazovky, do generovaného souboru WAR jsou zahrnuty soubory JAX-RS a Jersey JAR. Třída MovieRestApplication lze ignorovat, protože se nepoužívá s Jersey na GlassFish. To znamená, že jedinými vlastními soubory ve VÁLCE jsou třída s poznámkami JAX-RS MovieOfTheDayweb.xml soubor a indexová stránka (index.jsp). Obsah index.jsp stránka se zobrazí dále.

index.jsp

    REST s příkladem JAX-RS 

Následující snímek obrazovky ukazuje nasazení vygenerovaného souboru WAR prostřednictvím webové konzoly pro správu Glass:

Nejdůležitějším detailem, který je třeba si všimnout z obrazu nasazení souboru WAR, je to, že jsem pojmenoval kontextový kořen „zbytek“. Bude to součást identifikátorů URI, pomocí kterých se přistupuje k mým nasazeným službám REST. Čím dříve web.xml soubor to také ukázal zdroje/ bude také součástí tohoto identifikátoru URI přístupu ke službě REST. Zbývající část příslušného identifikátoru URI je založena na částech identifikátoru URI poskytovaných v anotacích JAX-RS ve třídě Java (/filmy, /, a / {month} / {date}). Části URI označené složenými závorkami označují, že zástupné symboly budou vloženy s hodnotami z implementace JAX-RS, které jsou ve volajícím URI. Například pokud příslušná část URI byla /7/4, to by v tomto případě znamenalo měsíc 7 (červenec, protože nepoužívá index nulového měsíce Java v URI) a den 4.

Když je nasazení úspěšné, zobrazí se administrativní konzola, jak je znázorněno na následujícím snímku obrazovky.

S nasazenou aplikací JAX-RS k ní nyní mám přístup z nesčetných různých klientů. JAX-RS neuvádí standardizovaný přístup pro klienty, ale Jersey a většina dalších populárních implementací JAX-RS poskytuje svůj vlastní přístup pro budování klientů. K dispozici jsou také další klienti HTTP / REST, například RESTClient. Prozatím jednoduše použiji webový prohlížeč.

Umístění URI // localhost: 8080 / v mém prohlížeči se zobrazí hlavní stránka označující, že je spuštěna aplikace GlassFish:

Pokud přidám webový kontext (zbytek) na URI, vidím své index.jsp strana:

Pro přístup k aplikacím REST poháněným JAX-RS musím přidat zdroje část URI, jak je uvedeno v web.xml soubor. Když přidám toto plus /filmy část (jak je uvedeno v @Cesta anotace), vidím následující stránku.

Výše uvedený snímek obrazovky naznačuje, že přístup GET byl vyvolán cestou „/“ a getMovie metoda byla volána. V tomto okamžiku mohu přidat URI měsíc a datum, abych získal film pro daný den. Následující dva snímky obrazovky to ukazují na Hromnice o Vánocích a na Štědrý den.

Jak ukazují výše uvedené snímky obrazovky, měsíce a dny poskytované v identifikátorech URI jsou automaticky vloženy poskytovatelem JAX-RS do parametrů příslušné metodě. Nyní je to snadné!

Závěr

Proces nasazení webové služby založené na JAX-RS pomocí Jersey a GlassFish je relativně přímočarý. Vše, co jsem opravdu potřeboval, byl přístup k JAX-RS a Jersey JAR, řádně anotované třídě Java a krátké web.xml soubor, který umožnil Jersey použít jako servlet. Tento blogový příspěvek se pokusil ukázat základní kroky spojené s psaním jednoduché třídy s anotací JAX-RS, jejím nasazením do GlassFish a využitím implementace JAX-RS od Jersey.

Další zdroje

⇒ Příručka pro vývojáře RESTful Web Services

⇒ RESTful Java, některé odkazy

⇒ JSR 311: Java API pro RESTful webové služby?

⇒ Nasazení a testování aplikace Jersey bez NetBeans

⇒ Jersey 1.0: Začínáme

⇒ API JSR-311 založené na Javadocu

Tento příběh „JAX-RS with Jersey: An Introduction“ byl původně publikován společností JavaWorld.

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