Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator07 [2015/12/02 17:31] Andrei Roșu-Cojocaru |
laboratoare:laborator07 [2015/12/05 15:18] (current) Andrei Roșu-Cojocaru |
||
|---|---|---|---|
| Line 819: | Line 819: | ||
| De asemenea, este necesar să se bifeze opțiunea //Also replace local wsdl file with original wsdl located at://, astfel încât să se descarce definiția serviciului web (fișierul WSDL) de la locația în care a fost publicat de către server: | De asemenea, este necesar să se bifeze opțiunea //Also replace local wsdl file with original wsdl located at://, astfel încât să se descarce definiția serviciului web (fișierul WSDL) de la locația în care a fost publicat de către server: | ||
| - | {{ :laboratoare:laborator07:netbeans_client04.png?nolink&600 }} | + | {{ :laboratoare:laborator07:netbeans_client04.png?nolink }} |
| Clasele generate sunt vizibile în secțiunea //Generated Sources (jax-ws)//. | Clasele generate sunt vizibile în secțiunea //Generated Sources (jax-ws)//. | ||
| Line 1031: | Line 1031: | ||
| **5**. Să se expună metodele corespunzătoare clasei ''BookPresentationManager'' din pachetul ''ro.pub.cs.aipi.lab07.businesslogic'', astfel încât acestea să fie accesibile la distanță prin intermediul unui serviciu web același denumire. Să se relanseze în execuție serverul, astfel încât acesta să expună și funcționalitățile serviciului web ''BookPresentationManager''. | **5**. Să se expună metodele corespunzătoare clasei ''BookPresentationManager'' din pachetul ''ro.pub.cs.aipi.lab07.businesslogic'', astfel încât acestea să fie accesibile la distanță prin intermediul unui serviciu web același denumire. Să se relanseze în execuție serverul, astfel încât acesta să expună și funcționalitățile serviciului web ''BookPresentationManager''. | ||
| - | **6**. Să se construiască un client care să acceseze funcționalitățile corespunzătoare serviciului web ''BookPresentationManager''. Să se testeze acest metodele expuse la distanță prin intermediul serviciului web. | + | <spoiler|Indicații de Rezolvare> |
| + | a) Se adnotează clasa ''BookPresentationManager'' precum și metodele care vor fi expuse la distanță (cu parametrii lor): | ||
| + | - clasa ''BookPresentationManager'' se adnotează folosind însemnarea ''@WebService(serviceName = "BookPresentationManager")''; | ||
| + | - metodele care vor fi expuse la distanță se adnotează folosind însemnarea ''@WebMethod(operationName = "...")'': <code java> | ||
| + | @WebMethod(operationName = "updateBookPresentationPriceForBooksWithMultipleFormats") | ||
| + | @WebMethod(operationName = "makeSupplyOrderBasedOnStockpile") | ||
| + | </code> | ||
| + | - parametrii metodelor care vor fi expuse la distanță se adnotează folosind însemnarea ''@WebParam(name = "...")'': <code java> | ||
| + | public List<BookPresentationInformation> updateBookPresentationPriceForBooksWithMultipleFormats(@WebParam(name = "numberOfFormats") int numberOfFormats, @WebParam(name = "amount") double amount); | ||
| + | public List<SupplyOrderInformation> makeSupplyOrderBasedOnStockpile(@WebParam(name = "stockpile") int stockpile); | ||
| + | </code> | ||
| + | |||
| + | b) Se adnotează clasele ''BookPresentationInformation'' și ''SupplyOrderInformation'', ale căror instanțe vor fi transmise prin rețea, sub formă de documente XML, astfel încât JAXB să cunoască mecanismul prin care obiectele Java pot fi transformate în scheme XML și invers: | ||
| + | - clasele ''BookPresentationInformation'' și ''SupplyOrderInformation'' vor fi adnotate folosind însemnările ''@XmlRootElement'' și ''@XmlType(name="...")'': <code java> | ||
| + | @XmlRootElement | ||
| + | @XmlType(name="BookPresentationInformation") | ||
| + | public class BookPresentationInformation extends PersistentEntity { | ||
| + | |||
| + | // ... | ||
| + | |||
| + | } | ||
| + | </code> | ||
| + | - toate metodele de tip getter (cu excepția celei care furnizează identificatorul, ''getId()'') vor fi adnotate folosind însemnarea ''@XmlElement''. | ||
| + | |||
| + | **Eclipse** | ||
| + | |||
| + | c) Este necesar să se publice serviciul web ''BookPresentationManager'' printr-un apel al metodei ''Endpoint.publish()''. Pentru fiecare serviciu web publicat, trebuie să se folosească un port dedicat. | ||
| + | |||
| + | <code java> | ||
| + | Endpoint.publish("http://localhost:8081/bookstore/BookPresentationManager", new BookPresentationManager()); | ||
| + | System.out.println("[BookPresentationManager] successfully registered!"); | ||
| + | </code> | ||
| + | |||
| + | **NetBeans** | ||
| + | |||
| + | c) Nu este necesar să se realizeze nici o acțiune suplimentară, întrucât clasele adnotate cu însemnarea ''@WebService'' sunt detectate automat ca servicii web (vizibile în secțiunea //Web Services//) al căror conținut este instalat în contextul serverului de aplicații în momentul în care se accesează opțiunea //Deploy//. | ||
| + | </spoiler> | ||
| + | |||
| + | **6**. Să se construiască un client care să acceseze funcționalitățile corespunzătoare serviciului web ''BookPresentationManager''. Să se testeze metodele expuse la distanță prin intermediul serviciului web. | ||
| + | |||
| + | <spoiler|Indicații de Rezolvare> | ||
| + | a) Se creează un proiect Java. | ||
| + | |||
| + | b) Se generează definițiile de clase necesare pentru accesarea funcționalităților expuse de serviciul web. | ||
| + | |||
| + | **Eclipse** | ||
| + | |||
| + | În directorul ''scripts'' aferent proiectului, se creează un script ''client[.bat|.sh]'' care rulează comanda ''wsimport'' necesară generării claselor necesare pentru accesarea metodelor expuse prin intermediul serviciului web: | ||
| + | |||
| + | <code> | ||
| + | wsimport -s ../src http://localhost:8081/bookstore/BookPresentationManager?wsdl | ||
| + | </code> | ||
| + | |||
| + | Se indică locația la care este publicat fișierul WSDL conținând definiția serviciului web precum și locația la care va fi plasat codul sursă, prin intermediul opțiunii ''-s''. | ||
| + | |||
| + | **NetBeans** | ||
| + | |||
| + | Este necesar să se creeze un client pentru serviciul web (definirea unei resurse de tip //Web Service Client// din secțiunea //New// a meniului contextual asociat proiectului). Aceasta va specifica adresa Internet la care a fost publicat fișierul WSDL ([[http://localhost:8081/07-BookStore-JAXWS-Server/BookPresentationManager?wsdl]]). Ulterior, generarea codului sursă se face prin accesarea opțiunii //Refresh// din meniul contextual asociat referinței la serviciul web. Se va folosi opțiunea //Also replace local wsdl file with original wsdl located at//. Clasele generate vor fi evidențiate prin plasarea lor în secțiunea //Generated Sources (jax-ws)//. | ||
| + | |||
| + | c) Se definește clasa ''BookPresentationManagerClient'' în pachetul ''ro.pub.cs.aipi.lab07.main'', conținând metoda ''main()'': | ||
| + | - se creează obiectele de tip ''Service'', respectiv ''port'' corespunzătoare serviciului web: <code java> | ||
| + | BookPresentationManager_Service service = new BookPresentationManager_Service(); | ||
| + | BookPresentationManager port = service.getBookPresentationManagerPort(); | ||
| + | </code> | ||
| + | - se accesează metodele la distanță, expuse prin intermediul serviciului web: <code java> | ||
| + | System.out.println("Enter number of formats: "); | ||
| + | int numberOfFormats = Integer.parseInt(bufferedReader.readLine()); | ||
| + | System.out.println("Enter percent amount: "); | ||
| + | double amount = Double.parseDouble(bufferedReader.readLine()); | ||
| + | port.updateBookPresentationPriceForBooksWithMultipleFormats(numberOfFormats, amount); | ||
| + | System.out.println("Enter stockpile: "); | ||
| + | int stockpile = Integer.parseInt(bufferedReader.readLine()); | ||
| + | port.makeSupplyOrderBasedOnStockpile(stockpile) | ||
| + | </code> | ||
| + | |||
| + | d) Pentru afișarea rezultatelor, poate fi util să se definească metoda ''displayResults'' care primește ca parametri o listă de obiecte (derivate din ''PersistentEntity'') precum și clasa care conține tipul propriu-zis, afișând conținutul tuturor câmpurilor, prin intermediul metodelor puse la dispoziție de pachetul [[https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/package-summary.html|java.lang.Reflect]]. | ||
| + | </spoiler> | ||
| **7**. (opțional) Să se expună metodele corespunzătoare clasei ''WriterManager'' din pachetul ''ro.pub.cs.aipi.lab07.businesslogic'', astfel încât acestea să fie accesibile la distanță prin intermediul unui serviciu web având aceeași denumire. Să se relanseze în execuție serverul, astfel încât acesta să expună și funcționalitățile serviciului web ''WriterManager''. | **7**. (opțional) Să se expună metodele corespunzătoare clasei ''WriterManager'' din pachetul ''ro.pub.cs.aipi.lab07.businesslogic'', astfel încât acestea să fie accesibile la distanță prin intermediul unui serviciu web având aceeași denumire. Să se relanseze în execuție serverul, astfel încât acesta să expună și funcționalitățile serviciului web ''WriterManager''. | ||
| Line 1049: | Line 1125: | ||
| ===== Soluții ===== | ===== Soluții ===== | ||
| - | TODO | + | [[https://github.com/aipi2015/Laborator07/tree/master/solutions/eclipse|Proiect Eclipse]]\\ |
| + | [[https://github.com/aipi2015/Laborator07/tree/master/solutions/netbeans|Proiect NetBeans]] | ||
