Java EE 6 ja RESTful Web Services Osa 1

Java EE 6 päivitys toi mukanaan hurjan kasan uutta työtä helpottavaa asiaa. Olen pelaillut Web Services tekniikoilla jo pitkän aikaa – itse asiassa kauan ennen kuin edes termiä Web Service oli olemassa. Nykypäivän Web Serviceksi on muotoutunut WS-I mukaan yhdistelmä HTTP protokollaa, SOAP kuoria, WSDL rajapintakuvauksia jne. Ongelmana SOAP:n kanssa on kuitenkin, että se on hurjan monimutkainen ratkaisu monimutkaisiin ongelmiin. Kuitenkin monissa tilanteissa olisi käyttöä yksinkertaisemmalle ja tehokkaammalle ratkaisulle.

REST on noussut esiin vastarintaliikkeenä massiiviselle SOAP pinolle. Representational State Transfer eli REST on yksinkertaisempi versio jossa käytetään HTTP protokollan moodeja kuten GET, POST, PUT, DELETE ja ajattelutapa on enemmän resurssin manipuloimista kuin muuta. REST nojaa tietoturvan suhteen HTTP protokollan olemassaoleviin ratkaisuihin, ja tämä puolestaan avaa uusia mahdollisuuksia tehdä asiakasohjelmia esim. Android kännykkään tai AJAX-sovelluksiin – tai vaikkapa Windows 7 Gadgetteihin kuten olen itse tehnyt.

Java EE 6 alusta päivitti olemassaolevan JAX-WS standardin rinnalle uuden JAX-RS 1.1 rajapinnan ja toteutuksen. Näin kaikista EE 6 yhteensopivista palvelimista tulee löytymään tarvittava tuki ja kirjastot samantien.

REST käyttöönottoon on muutama keino, esittelen tässä niistä java-kehittäjän kannalta tutuimman. Rekisteröidään web.xml tiedostossa JERSEY-toteutuksen REST handler servlet käsittelemään tietyt osoitteet, esim. tähän tapaan:

<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>ServletAdaptor</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>

Ja näin meillä on REST endpoint käytössä. Tämän jälkeen tehdään tavallinen Java-luokka, ja koristellaan sitä hieman. Tässä esimerkki REST pohjaisesta Hello World:stä

@Path(”items”)

@Produces(MediaType.APPLICATION_XML)

public class HelloService {

@GET

public String getHelloGreeting() {

return ”<a>Hello, it’s ” + new Date()+”</a>”;

}

}

Tässä näkyy muutama tärkeimmistä annotaatiosta. @Path määrittää mistä osoitteesta palvelu on tarjolla, tässä esimerkissä siis /resources/items. @Produces määrittää millaista content typeä ulos tarjoillaan. @GET liittää metodin HTTP GET metodiin, kun sitä kutsutaan, metodi suoritetaan ja sen tuottama tulos palautetaan kutsujalle. Tässä esimerkissä on palautettu yksinkertainen XML pätkä ihan puhtaasti merkkijonona, joka on yksi mahdollisuus. Nämä uudet annotaatiot löytyvät pääosin paketista javax.ws.rs – joka on siis Java EE 6 alustan standardipaketti.

Entäpä jos haluamme ottaa GET metodissa jotain parametreja? Helpointa on ottaa ne Query Param tyyppisinä, eli resurssi-url osoitteen perässä. Tähän tapaan:

http://localhost:21136/RESTDemo/resources/items?name=Arto

Eli muutamme lähdekoodia siten että se ottaa yhden name-nimisen query parameterin, näin:

@GET

public String getHelloGreeting(@QueryParam(value=”name”) String name) {

return ”<a>Hello, ” + name + ”, it’s ” + new Date()+”</a>”;

}

Kätevää, eikö? Eikä siinä vielä kaikki.. Mutta palaamme mielenkiintoisimpiin piirteisiin tulevissa jaksoissa, jahka intoudun taas kirjailemaan 😉

Mainokset

JavaServer Faces 2.0 FTW

SUN Microsystems ehti julkaista uusimman Java EE 6.0 päivityksensä ja löytyy jo jokunen palvelin jossa sen ajaminen onnistuu. Ketteränä ollessa tykkään tietysti valita palvelimen tarpeen mukaan, ja kun tarve on tehdä tehokkaasti ja evaluoida uuttakin, niin palvelin on Glassfish 3.0.

Millainen päivitys sitten on Java EE 6.0? Siitä kenties lisää myöhemmin, mutta nyt keskityn yhteen merkittävään uudistukseen: JavaServer Faces 2.0 tekniikkaan. JavaServer Faces kehitettiin jo melkein vuosikymmen sitten, ratkaisuksi Java järjestelmien tehokkaaseen web kehitykseen, mutta sen ensimmäinen versio ei oikein ottanut tuulta alleen. Siihen aikaan oli loistavia web-frameworkejä tarjolla ja JSF joutui kilpailemaan mm. Struts, Turbine, Velocity, ja myöhemmin myös Spring kehyksen kanssa. Lisäksi JSF ensimmäinen versio oli aika monimutkainen ja kankea, etenkin omien komponenttien tekemisen kannalta.

Eli mikä nyt on muuttunut? Uudistuksia on useita, tässä päällimmäiset:

– facelet tekniikka sisään, JSP sivut ulos

– annotaatiot sisään, pakolliset xml konfiguraatiossa hyppimiset ulos

– luontevampi kytkös EJB komponentteihin ja resursseihin

– luontevampi elinkaarituki AJAX:lle ja uusi f:ajax tagi

– paljon oletusarvoja ja yksinkertaisuutta lisää

– kehittynyt facelet templating malli joka vastaa suosittua Tiles framework mallia

– mahdollisuus tehdä custom JSF komponentti viidessä minuutissa

– parannettu tilanhallinta: Kevyempiä tilatietoja ja enemmän tilaolioita

– parempi tuki GET tyyppisille pyynnöille

Tiivistettynä: Alusta alkaa oikeasti olemaan sekä tuottava että joustava. Tarve käyttää jotain muuta ei-standardia frameworkiä kuten Spring MVC, Wicket, tai Struts/Shale, on vähäisempi – itseasiassa onko mitään perusteita käyttää Wicket tai Spring MVC frameworkiä JSF:n sijasta moderniin lomakepohjaiseen web-kehitystyöhön?