Implementácia vychádza z predpokladu, že jedlá v ponuke budú jednoznačne identifikované svojím názvom. Deklarácie metód poskytujúcich funkcionalitu servisu by mohli vyzerať napríklad takto:
1 2 3 4 5 6 7 8 9 10 11 12 |
// nazvy jedal v ponuke public String[] ponuka (); // vytvorenie a pridanie noveho jedla public void vytvorJedlo (String n, String p, double c); // odstranenie jedla z ponuky public void odstranJedlo (String nazov); // blizsie informacie o jedle public Jedlo info (String nazov); // zmena ceny jedla public void zmenCenu (String nazov, double cena ); // zmena popisu jedla public void zmenPopis (String nazov, String popis ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package pojo; public class Jedlo { private String nazov; private String popis; private double cena; public Jedlo() { } public Jedlo(String nazov, String popis, double cena) { this.nazov = nazov; this.popis = popis; this.cena = cena; } public double getCena() { return cena; } public void setCena(double cena) { this.cena = cena; } public String getPopis() { return popis; } public void setPopis(String popis) { this.popis = popis; } public String getNazov() { return nazov; } public void setNazov(String nazov) { this.nazov = nazov; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package ws; import java.util.HashMap; import java.util.Map; import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.ejb.Stateless; import javax.jws.Oneway; import pojo.Jedlo; @WebService(serviceName = "JedalenService") @Stateless() public class JedalenService { private Map<String, Jedlo> ponuka = new HashMap<>(); @WebMethod(operationName = "ponuka") public String[] ponuka () { return ponuka.keySet().toArray(new String[0]); } @WebMethod(operationName = "vytvorJedlo") public void vytvorJedlo (String n, String p, double c) { if (!ponuka.containsKey(n)) ponuka.put(n, new Jedlo(n,p,c)); } @WebMethod(operationName = "odstranJedlo") public void odstranJedlo (@WebParam(name = "nazov") String n) { if (!ponuka.containsKey(n)) return; ponuka.remove(n); } @WebMethod(operationName = "info") public Jedlo info (@WebParam(name = "nazov") String n) { return ponuka.get(n); } @WebMethod(operationName = "zmenCenu") public void zmenCenu (@WebParam(name = "nazov") String n, @WebParam(name = "cena") double c ) { // TODO opravit ponuka.get(n).setCena(c); } @WebMethod(operationName = "zmenPopis") public void zmenPopis (@WebParam(name = "nazov") String n, @WebParam(name = "popis") String p ) { // TODO opravit ponuka.get(n).setPopis(p); } } |
Volania web-servisových operácií sú štandardne synchrónne, t.j. klient musí čakať kým server požiadavku nespracuje a nepošle odpoveď. To sa týka aj void operácií, pretože výstupnú správu posiela každá obojsmerná soap-operácia (aj ke nevracia žiadne údaje). Ak nechcem výstupnú správu vôbec generovať musíme soap-operáciu definovať ako jednosmernú. V jave slúži na to anotácia @Oneway
1 2 3 4 5 6 7 8 9 10 |
public void navrhZmluvy(Navrh part1) { try { System.out.println("Spracovanie zmluvy zacina .. ") ; // spracovanie .. trva niekolko sekund Thread.sleep(5000); System.out.println("Hotovo"); } catch (InterruptedException ex) { Logger.getLogger(NewWebService.class.getName()).log(Level.SEVERE, null, ex); } } |
Keď má operácia návratovú hodnotu nemôže byť jednosmerná. Tomto prípade môžeme asynchonnú komunikáciu dosiahnuť pomocou asynchrónneho klienta. Netbeans umožňuje vygenerovať proxy objekt aj pre asynchrónnu komunikáciu nasledovne:
otvoríme dialog: Web Service References/ Edit Web Service Attributes..
záložke WSDL customization vyhľadáme operáciu a zvolíme Enable asynchronuos client
netbeans vygeneruje 2 proxy objetky pre asynchrónnu komunikáciu, jeden založený na pollingu a druhý na callbackoch
Pozn. Vložiť asynchrónne volania do kódu klientskej aplikácie možno rovnako pomocou Insert code / Call Web Service Operation…
Implementácia jednoduchého web servisu pre prácu s databázovou tabuľkou s využitím EJB
Vytvorenie web aplikácie a entitnej triedy pre existujúcu databázovú tabuľku
nb: new WebApplication projekt (pre glassfish) …
Vytvorenie EJB session bean poskytujúceho entity manager a operácie pre prácu s entitnou triedou
Vytvorenie web servisu poskytujúceho prístup k operáciám EJB session beanu
Browse… a vybrať bean vytvorený v predchádajucom kroku (JedloFacade).
Pri vývoji SOA aplikácií je možné postupovať dvoma spôsobmi:
Code-first : najprv vytvoríme dátové triedy a metódy servisu. Následne z nich vygenerujeme špecifikáciu rozhrania servisu (WDSL a schéma)
takto sme postupovali doteraz
Contract-first : najprv definujeme špecifikáciu rozhrania servisu (WSDL a schéma). Následne z nej vygenerujeme dátové triedy a kostru servisu s metódami, ktoré treba implementovať
postup: pozri návod na 3. cvičení