Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator07 [2015/12/02 16:33]
Andrei Roșu-Cojocaru [NetBeans]
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 926: Line 926:
   * în secțiunea de proprietăți,​ se va defini proprietatea ''​hibernate.transaction.jta.platform''​ cu valoarea ''​org.hibernate.service.jta.platform.internal.SunOneJtaPlatform''​.   * în secțiunea de proprietăți,​ se va defini proprietatea ''​hibernate.transaction.jta.platform''​ cu valoarea ''​org.hibernate.service.jta.platform.internal.SunOneJtaPlatform''​.
  
-Definirea unei resurse JDBC în cadrul serverului de aplicație GlassFish implică următoarele etape:+Definirea unei resurse JDBC în cadrul serverului de aplicație GlassFish implică ​[[https://​dev.mysql.com/​doc/​connector-j/​en/​connector-j-usagenotes-glassfish-config.html|următoarele etape]]:
  
 **a**. se accesează secțiunea //JDBC Connection Pools// disponibilă în //​Resources//​ → //JDBC// și se apasă butonul //New// pentru a se defini un nou set de conexiuni: **a**. se accesează secțiunea //JDBC Connection Pools// disponibilă în //​Resources//​ → //JDBC// și se apasă butonul //New// pentru a se defini un nou set de conexiuni:
Line 937: Line 937:
   * //Database Driver Vendor//, trebuie să aibă valoarea ''​MySQL''​ selectată din lista de opțiuni;   * //Database Driver Vendor//, trebuie să aibă valoarea ''​MySQL''​ selectată din lista de opțiuni;
  
-<​note ​tip>​Este ​important ​ca driver-ul de conexiune la sistemul de gestiune pentru baze de date (Connector/​J = mysql-connector) să se găsească în classpath-ul serverului de aplicații Glassfish: ''<​glassfish-install-directory>/​glassfish/​domains/<​domain-name>/​lib''​. Implicit, se va folosi ''​domain1''​ ca denumire a domeniului.</​note>​+<​note ​important>​Este ​necesar ​ca driver-ul de conexiune la sistemul de gestiune pentru baze de date (Connector/​J = mysql-connector) să se găsească în classpath-ul serverului de aplicații Glassfish: ''<​glassfish-install-directory>/​glassfish/​domains/<​domain-name>/​lib''​. Implicit, se va folosi ''​domain1''​ ca denumire a domeniului.</​note>​
  
 {{ :​laboratoare:​laborator07:​netbeans_glassfish02.png?​nolink&​800 }} {{ :​laboratoare:​laborator07:​netbeans_glassfish02.png?​nolink&​800 }}
Line 995: Line 995:
 ===== ===== ===== =====
  
-**3**.+**3**. Să se ruleze proiectul corespunzător serverului (''​07-BookStore-JAXWS-Server''​). 
 + 
 +==== Eclipse ==== 
 + 
 +Proiectul se rulează ca aplicație Java (//Run As...// → //Java Application//​). Nu este necesară definirea unei configurații de rulare dedicate, întrucât nu trebuie specificați nici argumente în linia de comandă și nici parametrii ai mașinii virtuale. Aplicația va rămâne în execuție întrucât metoda ''​Endpoint.publish()''​ creează o instanță a unui server local, prin intermediul căruia vor fi expuse metodele corespunzătoare serviciului web. 
 + 
 +==== NetBeans ==== 
 + 
 +Proiectul este instalat la nivelul serverului de aplicații GlassFish 4.1 prin intermediul opțiunii //Deploy// disponibilă la nivelul meniului contextual asociat. Aceasta lansează în execuție serverul de aplicații (dacă acesta nu rulează deja) și copiază în contextul său resursele necesare astfel încât funcționalitățile corespunzătoare serviciului web să fie disponibile la distanță. O astfel de operație poate dura o perioadă de timp semnificativă. 
 + 
 +===== ===== 
 + 
 +**4**. Să se ruleze proiectul corespunzător unuia dintre clienți (''​07-BookStore-JAXWS-Client-BookManager''​). Să se testeze funcționalitățile expuse prin intermediul serviciului web. 
 + 
 +Anterior, trebuie să se genereze clasele care conțin definiția serviciului web (clasa ''​_Service''​),​ definițiile metodelor la distanță (clasele ''​Operation'',​ respectiv ''​OperationResponse'',​ pentru fiecare funcționalitate în parte), definițiile entităților transmise ca parametrii sau valori întoarse ale acestora precum și fabrica de obiecte (clasa ''​ObjectFactory''​). 
 + 
 +==== Eclipse ==== 
 + 
 +Este necesar să se ruleze script-ul ''​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:​8080/​bookstore/​BookManager?​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:​8080/​07-BookStore-JAXWS-Server/​BookManager?​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)//​. 
 + 
 +===== ===== 
 + 
 +După ce au fost generate clasele necesare, astfel încât proiectele să nu mai aibă erori, rularea proiectului se face obișnuit (//Run As...// → //Java Application//,​ pentru Eclipse, respectiv //Run// folosind configurația de rulare implicită, pentru NetBeans). 
 + 
 +**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''​. 
 + 
 +<​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''​. 
 + 
 +**8**. (opțional) Să se construiască un client care să acceseze funcționalitățile corespunzătoare serviciului web ''​WriterManager''​. Să se testeze acest metodele expuse la distanță prin intermediul serviciului web.
  
 ===== Resurse ====== ===== Resurse ======
Line 1009: 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]]
laboratoare/laborator07.1449066834.txt.gz · Last modified: 2015/12/02 16:33 by Andrei Roșu-Cojocaru
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0