Παρουσίαση της πλατφόρμας Java EE για την ανάπτυξη web-εφαρμογών και services.

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Παρουσίαση της πλατφόρμας Java EE για την ανάπτυξη web-εφαρμογών και services."

Transcript

1 ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Παρουσίαση της πλατφόρμας Java EE για την ανάπτυξη web-εφαρμογών και services. Χασαπάκης Κυριάκος Αρ.Μητρώου:05/2804 Επιβλέπων καθηγητής: Παναγιώτης Σφέτσος Θεσσαλονίκη 2014

2 ΠΡΟΛΟΓΟΣ Οι παρακάτω ενότητες που ακολουθούν σας εισάγουν στην ανάπτυξη Java EE εφαρμογών για επιχειρήσεις. Εδώ θα εξεταστούν τα βασικά κομμάτια ανάπτυξης, για να μάθετε την αρχιτεκτονική και τα API της Java EE, να εξοικειωθείτε με σημαντικούς όρους και έννοιες και να μάθετε πώς να προσεγγίσετε την Java EE για τον προγραμματισμό εφαρμογών, τη συναρμολόγηση και την ανάπτυξη τους. Οι προγραμματιστές σήμερα αναγνωρίζουν όλο και περισσότερο την ανάγκη για κατανεμημένες και φορητές εφαρμογές που αξιοποιούν την ταχύτητα, την ασφάλεια και την αξιοπιστία της server-side τεχνολογίας. Εταιρικές εφαρμογές παρέχουν την επιχειρηματική λογική για μια επιχείρηση. Έχουν κεντρική διαχείριση και συχνά αλληλεπιδρούν με άλλα λογισμικά της επιχείρησης. Στον κόσμο της πληροφορικής, οι επιχειρηματικές εφαρμογές πρέπει να σχεδιάζονται, να κατασκευάζονται και να παράγονται με λιγότερα χρήματα, με μεγαλύτερη ταχύτητα και με λιγότερους πόρους. Με την πλατφόρμα Java Platform, Enterprise Edition (Java EE), η ανάπτυξη επιχειρηματικών εφαρμογών δεν ήταν ποτέ πιο εύκολη ή πιο γρήγορη. Στόχος της πλατφόρμας Java EE είναι να παρέχει στους προγραμματιστές ένα ισχυρό σύνολο από APIs, μείωση του χρόνου ανάπτυξης, μείωση της πολυπλοκότητας της εφαρμογής καθώς και τη βελτίωση της απόδοσης των εφαρμογών. Σε αυτήν την πτυχιακή εργασία χρησιμοποιούνται παραδείγματα για να περιγράψουν τα χαρακτηριστικά που είναι διαθέσιμα στην πλατφόρμα Java EE για την ανάπτυξη επιχειρηματικών εφαρμογών. Είτε είστε νέος είτε έμπειρος προγραμματιστής εδώ θα βρείτε παραδείγματα και συνοδευτικό κείμενο για τη δημιουργία των δικών σας λύσεων. Σελίδα 1 από 218

3 ΠΕΡΙΛΗΨΗ Η Java Platform, Enterprise Edition ή αλλιώς Java EE είναι μια ευρέως διαδεδομένη πλατφόρμα για προγραμματισμό server που στηρίζεται πάνω στην γλώσσα προγραμματισμού Java. H Java EE διαφέρει από την βασική έκδοση της Java από το γεγονός ότι προσθέτει βιβλιοθήκες οι οποίες παρέχουν λειτουργικότητα ώστε να αναπτυχθεί διαδικτυακό, πολυμερές λογισμικό σε Java, βασισμένο σε αυτοτελή μέρη που τρέχουν σε application servers. H Java EE ήταν γνωστή παλιότερα και ως J2EE, ονομασία που είχε μέχρι και την έκδοση 1.4. Η επόμενη έκδοση ονομάστηκε Java EE 5. H Java Platform, Enterprise Edition (Java EE) είναι ένα λογισμικό που απευθύνεται σε επιχειρήσεις. Η Java EE έχει αναπτυχθεί χρησιμοποιώντας την Java Community Process, με συνεισφορές από τους εμπειρογνώμονες της βιομηχανίας, εμπορικών και ανοικτού κώδικα οργανώσεων, ομάδες χρηστών Java και αμέτρητα άλλα άτομα. Κάθε νέα έκδοση ενσωματώνει νέα χαρακτηριστικά που ευθυγραμμίζονται με τις ανάγκες της βιομηχανίας, βελτιώνει τη φορητότητα εφαρμογής και αυξάνει την παραγωγικότητα των προγραμματιστών. Στα παρακάτω κεφάλαια θα αναπτυχθούν μερικές από τις κύριες λειτουργίες τις Java EE καθώς και χαρακτηριστικά της. Θα ασχοληθούμε με τα βασικά συστατικά της γλώσσας τα οποία συνθέτουν web-εφαρμογές και services. Θα αναλύσουμε βασικές έννοιες που χρησιμοποιούνται στη γλώσσα όπως τους web clients, τους application clients κτλ, την υποστήριξη που παρέχει σε web services, θα αναλύσουμε το Contexts και Dependency Injection για την JavaEE όπως και τα Java Persistence APIs. Στη συνέχεια θα ολοκληρώσουμε κάνοντας λόγο για την ασφάλεια που παρέχει η γλώσσα καθώς και για τις JavaEE Supporting Technologies. Σελίδα 2 από 218

4 ABSTRACT The Java Platform, Enterprise Edition or otherwise Java EE is a widely used platform for server programming based on the programming language Java. Java EE differs from the basic version of Java in that it adds libraries which provide functionality to develop web, polymer software in Java, based on independent parts running on application servers. Java EE was formerly known as J2EE, a name that was up to version 1.4. The next version was named Java EE. Java Platform, Enterprise Edition (Java EE) is a software aimed at businesses. The Java EE has been developed using the Java Community Process, with contributions from industry experts, trade organizations and open source, Java user groups and countless others. Each new version incorporates new features that are aligned with industry needs, improves application portability and increases the productivity of developers. The following sections will develop some of the main characteristics and features of Java EE. We will deal with the basic components of language which make web applications and services. We will analyze the basic concepts used in language such as web clients, application clients etc, its support in web services, we will analyze the Contexts and Dependency Injection for the JavaEE as the Java Persistence APIs. Then we will conclude by referring to the safety provided by the language and the JavaEE Supporting Technologies. Σελίδα 3 από 218

5 ΠΕΡΙΕΧΟΜΕΝΑ ΠΡΟΛΟΓΟΣ... 1 ΠΕΡΙΛΗΨΗ... 2 ABSTRACT... 3 ΕΥΡΕΤΗΡΙΟ ΕΙΚΟΝΩΝ ΕΥΡΕΤΗΡΙΟ ΠΙΝΑΚΩΝ Java EE Platform Μοντέλο εφαρμογής Java EE (Java EE Application Model) Κατανεμημένες Πολυστρωματικές Εφαρμογές Ασφάλεια Συστατικά Java EE (Java EE Components) Java EE Πελάτες (Java EE Clients) Μικροεφαρμογές (applets) Η Αρχιτεκτονική JavaBeans Συστατικών Java EE Server Communications Web Components Business Components Enterprise Information SystemTier Java EE Containers Υπηρεσίες Container Τύποι Container Υποστήριξη Web Services XML Πρωτόκολλο μεταφοράς SOAP WSDL Standard Format Σύνδεση και ανάπτυξη της εφαρμογής Java EE Packaging Applications Ρόλοι ανάπτυξης Java EE πάροχος προϊόντων Πάροχος Εργαλείου Πάροχος στοιχείου της εφαρμογής Προγραμματιστής Enterprise beans Προγραμματιστής web συστατικού Σελίδα 4 από 218

6 1.7.6 Προγραμματιστής Πελάτη Εφαρμογής Application Deployer και Διαχειριστής Java EE 6 ΑΡΙs Enterprise JavaBeansTechnology Java ServletTechnology Τεχνολογία JavaServer Faces JavaServer PagesTechnology Βιβλιοθήκη JavaServer Pages StandardTag Java Persistence API Java Transaction API Java API για RESTful Υπηρεσίες Web Managed beans Contexts και Dependency Injection για την Πλατφόρμα Java EE Dependency Injection για Java Bean Validation Υπηρεσία Μηνυμάτων Java API Java EE Connector Architecture JavaMail API Java Authorization Contract για Containers Java Authentication Service Provider Interface για container Java EE 6 ΑΡΙ στην πλατφόρμα Java, Standard Edition Java Database Connectivity API Java Naming και Directory Interface API Πλαίσιο ενεργοποίησης JavaBeans Java API για την επεξεργασία XML Java Αρχιτεκτονική για XML Binding SOAP με Συνημμένα API για Java Java API για XML Υπηρεσίες Web Υπηρεσία Πιστοποίησης και Εξουσιοδότησης Java GlassFish ServerTools JavaServer Faces Facelets Χειρισμός των πόρων Composite Components Αίτηση επεξεργασίας φάσεων κύκλου ζωής Σελίδα 5 από 218

7 2.5 Ajax HTTP GET Server and Client extension points Επικύρωση δεδομένων Κανόνες πλοήγησης Faces Flow Συμβάσεις Βιβλιοθήκης Πόρων Χαρακτηριστικά Διέλευσης και HTML5-Friendly Markup Web Services Τύποι Web services Big Web Services RESTful Web services Ποιον από τους δύο τύπους Web service πρέπει να χρησιμοποιήσουμε; Δημιουργία web service με JAX-WS Απαιτήσεις του JAX-WS Endpoint Κωδικοποίηση του endpoint της implementation κλάσης της υπηρεσίας Ένας απλός JAX-WS Πελάτης Εφαρμογής Ένας απλός JAX-WS Web πελάτης Δημιουργώντας μια RESTful Root Resource κλάση Ανάπτυξη RESTful Web service με JAX-RS Επισκόπηση μιας εφαρμογής JAX-RS Ο και τα URI Path Templates Απαντώντας σε HTTP Πόρους Εξαγωγή Παραμέτρων Αιτήματος Enterprise beans Οφέλη των Enterprise beans Πότε να χρησιμοποιήσετε Enterprise Beans Τύποι Enterprise Beans Τι είναι ένα session bean; Τύποι session beans Πότε χρησιμοποιούνται τα session beans Τι είναι ένα Message-Driven bean; Τι κάνει το Message-Driven Bean διαφορετικό από το Session Bean;. 100 Σελίδα 6 από 218

8 4.3.2 Πότε χρησιμοποιούνται τα message-driven beans Πρόσβαση σε enterprise beans Χρησιμοποιώντας τα enterprise beans σε πελάτες Αποφασίζοντας σχετικά με Remote ή Local πρόσβαση Local Clients Remote clients Web service clients Τα περιεχόμενα ενός enterprise bean Πακετάροντας τα Enterprise beans σε EJB JAR ενότητες Πακετάροντας τα enterprise beans σε WAR ενότητες Συμβάσεις ονομασίας των enterprise beans Ο κύκλος ζωής των Enterprise Beans Ο κύκλος ζωής του Stateful session bean Ο κύκλος ζωής του Stateless session bean Ο κύκλος ζωής του singleton session bean Ο κύκλος ζωής του message-driven bean Contexts και dependency injection Εξερεύνηση των beans Σημεία injection Qualifier και Alternative Producer και Disposer Interceptors Decorators Scopes και Contexts Στερεότυπα Events Φορητές Επεκτάσεις (Portable extensions) Built-in Beans Επανακλήσεις του Κύκλου Ζωής Java Persistence (JPA) Entities (οντότητες) Persistence Unit, Persistence Context και Entity Manager Schema Generation Δημιουργία, ανάγνωση, ενημέρωση και διαγραφή οντοτήτων Σελίδα 7 από 218

9 6.5 Entity Listeners Αποθηκευμένες Διαδικασίες Επικυρώνοντας τις οντότητες Συναλλαγές και Κλείδωμα Caching Ασφάλεια στη Java EE Είδη ασφάλειας της Java EE Μια απλή περιγραφή της Ασφάλειας Εφαρμογών Χαρακτηριστικά ενός μηχανισμού ασφαλείας Χαρακτηριστικά της Ασφάλειας Εφαρμογών Μηχανισμοί Ασφάλειας Μηχανισμοί Ασφάλειας Java ΕE Ασφάλεια επιπέδου εφαρμογής Ασφάλεια επιπέδου μεταφοράς Ασφάλεια επιπέδου μηνύματος Ασφάλεια container Χρησιμοποιώντας σχολιασμούς για τον καθορισμό των πληροφοριών ασφαλείας Χρησιμοποιώντας deployment descriptor για την δηλωτική ασφάλεια Χρησιμοποιώντας προγραμματική ασφάλεια Ασφαλίζοντας τον GlassFish διακομιστή Δουλεύοντας με realms, χρήστες, ομάδες και ρόλους Τι είναι τα realms,οι χρήστες, οι ομάδες και οι ρόλοι; Τι είναι ένα realm; Τι είναι ένας χρήστης; Τι είναι η ομάδα; Τι είναι ένας ρόλος; Κάποια άλλη Ορολογία Ρυθμίζοντας τους ρόλους ασφαλείας Χαρτογράφηση ρόλων σε χρήστες και ομάδες Η δημιουργία μιας ασφαλούς σύνδεσης με SSL Java EE Supporting Technologies Συναλλαγές Τι είναι μια συναλλαγή; Σελίδα 8 από 218

10 8.3 Container-Managed Συναλλαγές Χαρακτηριστικά της συναλλαγής Required RequiresNew Mandatory NotSupported Supports Never Περίληψη Χαρακτηριστικών Συναλλαγής Ρύθμιση Χαρακτηριστικών Συναλλαγής Οπισθοδρομώντας μια container-managed συναλλαγή Συγχρονισμός στιγμιότυπων μεταβλητών ενός Session bean Μέθοδοι που δεν επιτρέπονται σε Container-Managed συναλλαγές Bean-managed Συναλλαγές JTA Συναλλαγές Επιστρέφοντας χωρίς Commit Μέθοδοι που δεν επιτρέπονται τις bean-managed συναλλαγές Τι είναι ένας προσαρμογέας πόρων (resource adapter); Management contracts Διαχείρισης του κύκλου ζωής Work management contract Generic work context contract Εξερχόμενες και εισερχόμενες συμβάσεις Σχολιασμοί Metadata Common Client Interface Χρήση των προσαρμογέων πόρων με Contexts και Dependency injection για Java EE (CDI) ΒΙΒΛΙΟΓΡΑΦΙΑ Σελίδα 9 από 218

11 ΕΥΡΕΤΗΡΙΟ ΕΙΚΟΝΩΝ Εικόνα 1: Multitired εφαρμογές Εικόνα 2: Επικοινωνία Server Εικόνα 3: Web tier και εφαρμογές web Εικόνα 4: Business και EIS tiers Εικόνα 5: Java EE server και containers Εικόνα 6: Δομή EAR Εικόνα 7: Java EE containers Εικόνα 8: Πώς η τεχνολογία JAX-WS διαχειρίζεται την επικοινωνία ανάμεσα σε μια web υπηρεσία και έναν πελάτη Εικόνα 9: Πώς η διεπαφή ελέγχει το view του πελάτη ενός enterprise bean Εικόνα 10: Το σχήμα δείχνει τα περιεχόμενα ενός αρχείου JAR EJB Εικόνα 11: Τα στάδια που ένα session bean περνά μέσα στη διάρκεια της ζωής του Εικόνα 12: Η εικόνα απεικονίζει τα στάδια ενός stateless session bean Εικόνα 13: Η εικόνα απεικονίζει τα στάδια ενός singleton session bean Εικόνα 14: Η εικόνα απεικονίζει τα στάδια ενός message-driven bean Εικόνα 15: Realms, χρήστες, ομάδες και ρόλοι Εικόνα 16: Resource Adapters Σελίδα 10 από 218

12 ΕΥΡΕΤΗΡΙΟ ΠΙΝΑΚΩΝ Πίνακας 1: Ο πίνακας δείχνει το τυπικό σύνολο των ετικετών που υποστηρίζονται από Facelets βιβλιοθήκες Πίνακας 2: Ο πίνακας παραθέτει τις πιθανές τιμές του χαρακτηριστικού render.. 54 Πίνακας 3: Ο πίνακας συνοψίζει τα δύο είδη των Enterprise Beans Πίνακας 4:Ο πίνακας συνοψίζει τις συμβάσεις για τα παραδείγματα beans Πίνακας 5: Tρόποi εξερεύνησης των beans Πίνακας 6: Ο πίνακας παραθέτει τα built-in qualifiers και τις έννοιές τους Πίνακας 7: Οι τιμές προτεραιότητας στην javax.interceptor.interceptor.priority κλάση, ορίζονται στον πίνακα Πίνακας 8: TransactionPhase Πίνακας 9: Το bean μπορεί να ακούσει μια ποικιλία των γεγονότων container του κύκλου ζωής, όπως παρατίθενται στον πίνακα Πίνακας 10: Το στοιχείο validation-mode στo persistence.xml Πίνακας 11: Shared-cache-mode στο persistence.xml Πίνακας 12: Χαρακτηριστικά συναλλαγής και πεδίο εφαρμογής Πίνακας 13: TransactionAttributeType Σταθερές Σελίδα 11 από 218

13 1. Java EE Platform Η Java Platform, Enterprise Edition ή αλλιώς Java EE είναι μια ευρέως διαδεδομένη πλατφόρμα για προγραμματισμό server που στηρίζεται πάνω στην γλώσσα προγραμματισμού Java. H Java EE διαφέρει από την βασική έκδοση της Java από το γεγονός ότι προσθέτε βιβλιοθήκες οι οποίες παρέχουν λειτουργικότητα ώστε να αναπτυχθεί διαδικτυακό, πολυμερές λογισμικό σε Java, βασισμένο σε αυτοτελή μέρη που τρέχουν σε application servers. 1.1 Μοντέλο εφαρμογής Java EE (Java EE Application Model) Το μοντέλο εφαρμογής Java EE ξεκινά με τη γλώσσα προγραμματισμού Java και την Java virtual machine. Η φορητότητα, η ασφάλεια και παραγωγικότητα για την ανάπτυξη που παρέχει αποτελεί τη βάση του μοντέλου εφαρμογής.η Java EE έχει σχεδιαστεί για να υποστηρίξει εφαρμογές που υλοποιούν enterprise servises για τους πελάτες, τους εργαζόμενους, τους προμηθευτές, τους εταίρους και άλλους που έχουν απαιτήσεις από την επιχείρηση. Τέτοιες εφαρμογές είναι εγγενώς πολύπλοκες, ενδεχομένως έχουν πρόσβαση σε δεδομένα από μια ποικιλία πηγών και διανέμονται σε μια ποικιλία πελατών. Το μοντέλο εφαρμογής Java EE ορίζει μια αρχιτεκτονική για την υλοποίηση των υπηρεσιών, όπως multitier εφαρμογές που προσφέρουν τη δυνατότητα αναβάθμισης, προσβασιμότητας και διαχείρισης που απαιτούνται από τις εφαρμογές σε επίπεδο επιχείρησης. Αυτό το μοντέλο διαχωρίζει τη δουλειά που απαιτείται για να εφαρμόσει μια multitier υπηρεσία στα ακόλουθα μέρη: Την λογική της επιχείρησης και της παρουσίασης που πρέπει να εφαρμοστούν από τον προγραμματιστή Τις συνήθεις υπηρεσίες του συστήματος παρέχονται από την πλατφόρμα Java EE Ο προγραμματιστής μπορεί να επικαλεστεί την πλατφόρμα για την παροχή λύσεων για τα δύσκολα προβλήματα της ανάπτυξης μιας multitier υπηρεσίας. Σελίδα 12 από 218

14 1.2 Κατανεμημένες Πολυστρωματικές Εφαρμογές (Distributed Multitiered Applications) Η πλατφόρμα Java EE χρησιμοποιεί ένα κατανεμημένο multitiered μοντέλο εφαρμογής για τις εφαρμογές των επιχειρήσεων. Η λογική της εφαρμογής χωρίζεται σε συστατικά ανάλογα με τη λειτουργία και αυτά τα συστατικά που συνθέτουν μια εφαρμογή Java EE έχουν εγκατασταθεί σε διάφορα μηχανήματα, ανάλογα με τη βαθμίδα στο multitiered περιβάλλον της Java EE στο οποίο το συστατικό της εφαρμογής ανήκει. Το παρακάτω σχήμα δείχνει δύο multitiered εφαρμογές Java EE που χωρίζονται στα επίπεδα που περιγράφονται στην ακόλουθη λίστα. Εικόνα 1: Multitired εφαρμογές Σελίδα 13 από 218

15 Client-tier συστατικά τρέχουν στο μηχάνημα του client. Web tier συστατικά εκτελούνται στο διακομιστή Java EE. Business-tier συστατικά εκτελούνται στο διακομιστή Java EE. Enterprise πληροφοριακό σύστημα (EIS) tier τρέχει στον server EIS. Μολονότι μια εφαρμογή Java EE μπορεί να αποτελείται από τις τρεις ή τις τέσσερις βαθμίδες που φαίνονται στο παρακάτω σχήμα, οι Java EE multitiered εφαρμογές γενικά θεωρούνται ότι είναι τριών επιπέδων επειδή είναι κατανεμημένες σε τρεις περιοχές: στα μηχανήματα του πελάτη, στο μηχάνημα server Java EE καθώς και στις βάσεις δεδομένων. Τριών-επιπέδων εφαρμογές που τρέχουν με αυτό τον τρόπο επεκτείνουν το πρότυπο μοντέλο δύο επιπέδων πελάτη και εξυπηρετητή με την τοποθέτηση ενός πολυνηματικού διακομιστή εφαρμογών μεταξύ της εφαρμογής πελάτη και του back-end χώρου αποθήκευσης Ασφάλεια Παρά το γεγονός ότι άλλα μοντέλα εφαρμογών για επιχειρήσεις απαιτούν συγκεκριμένη πλατφόρμα ασφάλειας, το περιβάλλον ασφαλείας της Java EE επιτρέπει κανόνες ασφάλειας που μπορούν να καθορίζονται κατά το χρόνο εγκατάστασης. Η πλατφόρμα Java EE κάνει τις εφαρμογές φορητές σε μια ευρεία ποικιλία υλοποιήσεων ασφαλείας θωρακίζοντας τους προγραμματιστές εφαρμογών από την πολυπλοκότητα των χαρακτηριστικών ασφαλείας. Η πλατφόρμα Java EE παρέχει πρότυπους κανόνες ελέγχου πρόσβασης που ορίζονται από τον προγραμματιστή και ερμηνεύονται όταν η εφαρμογή αναπτύσσεται στον διακομιστή. Η Java EE παρέχει επίσης στάνταρ μηχανισμούς εισόδου και έτσι οι προγραμματιστές δεν χρειάζεται να εφαρμόσουν αυτούς τους μηχανισμούς στις εφαρμογές τους. Η ίδια εφαρμογή λειτουργεί σε μια ποικιλία από περιβάλλοντα ασφαλείας χωρίς να αλλάζει τον πηγαίο κώδικα Συστατικά Java EE (Java EE Components) Οι εφαρμογές Java EE αποτελούνται από συστατικά.ένα συστατικό Java EE είναι μια αυτοδύναμη λειτουργική μονάδα λογισμικού που συναρμολογείται σε μια Σελίδα 14 από 218

16 εφαρμογή Java EE με τις σχετικές κλάσεις και τα αρχεία της και επικοινωνεί με άλλα συστατικά. Η προδιαγραφή Java EE ορίζει τα ακόλουθα συστατικά Java EE: πελάτες εφαρμογών και applets που είναι συστατικά τα οποία τρέχουν στον πελάτη. Java Servlet, JavaServer Faces και JavaServer Pages (JSP) συστατικά τεχνολογίας που είναι στοιχεία του διαδικτύου τα οποία εκτελούνται στο διακομιστή. Enterprise JavaBeans (EJB) συστατικά (Beans επιχειρήσεων) που είναι επιχειρησιακά συστατικά τα οποία εκτελούνται στο διακομιστή. Τα Java EE συστατικά είναι γραμμένα στη γλώσσα προγραμματισμού Java και μεταγλωτίζονται με τον ίδιο τρόπο όπως οποιοδήποτε πρόγραμμα στη γλώσσα. Η διαφορά μεταξύ Java EE συστατικών και «πρότυπων» κλάσεων της Java είναι ότι τα Java EE συστατικά συναρμολογούνται σε μια εφαρμογή Java EE, ελέγχονται να είναι καλοσχηματισμένα και σε συμμόρφωση με τις προδιαγραφές της Java ΕΕ. Τα Java EE συστατικά τρέχουν και διαχειρίζονται από το διακομιστή Java EE Java EE Πελάτες (Java EE Clients) Ένας πελάτης Java EE είναι συνήθως είτε ένας πελάτη web είτε μια client εφαρμογή. Πελάτες Web (Web clients) Ένας web client αποτελείται από δύο μέρη: Δυναμικές ιστοσελίδες που περιέχουν διάφορους τύπους της γλώσσας σήμανσης (HTML, XML,και ούτω καθεξής), οι οποίες παράγονται από συστατικά web που τρέχουν στο web tier Ένα πρόγραμμα περιήγησης Web, το οποίο παρέχει τις σελίδες έλαβε από τον server Πελάτες εφαρμογής (application clients) Ένας πελάτης εφαρμογής τρέχει σε ένα μηχάνημα πελάτη και παρέχει έναν τρόπο για τους χρήστες να χειρίζονται εργασίες που απαιτούν μια πιο πλούσια διεπαφή χρήστη από ό,τι μπορεί να Σελίδα 15 από 218

17 παρέχει μια γλώσσα σήμανσης. Ένας πελάτης εφαρμογής έχει συνήθως μια γραφική διεπαφή χρήστη (GUI) που δημιουργήθηκε από το Swing και το Abstract Window Toolkit (AWT) API, αλλά είναι εφικτό και ένα περιβάλλον γραμμής εντολών. Οι application clients έχουν άμεση πρόσβαση στα enterprise beans που εκτελούνται στο επίπεδο της επιχείρησης. Ωστόσο, εάν οι απαιτήσεις εφαρμογής δικαιολογούν, η εφαρμογή πελάτη μπορεί να ανοίξει μια σύνδεση HTTP για να δημιουργήσει δίαυλο επικοινωνίας με ένα servlet που τρέχει στο web επίπεδο. Application clients γραμμένοι σε άλλες γλώσσες πλην της Java μπορούν να αλληλεπιδράσουν με Java EE servers, επιτρέποντας την πλατφόρμα Java EE να λειτουργεί με άλλα συστήματα, πελάτες και άλλες γλώσσες εκτός Java Μικροεφαρμογές (applets) Μια ιστοσελίδα που λήφθηκε από το web tier μπορεί να περιλαμβάνει ενσωματωμένες εφαρμογές. Γραμμένη στη γλώσσα προγραμματισμού Java, η μικροεφαρμογή είναι μια μικρή εφαρμογή πελάτη που εκτελείται στην εικονική μη-χανή της Java που εναι εγκατεστημένη στο πρόγραμμα περιήγησης. Ωστόσο, τα συστήματα client κατά πάσα πιθανότητα θα χρειάζονται το Java Plug-in και ενδεχομένως, ένα αρχείο πολιτικής ασφάλειας για την επιτυχή εκτέλεση της μικροεφαρμογής στο πρόγραμμα περιήγησης Η Αρχιτεκτονική JavaBeans Συστατικών Οι server και client βαθμίδες μπορεί επίσης να περιλαμβάνουν συστατικά που βασίζονται στην αρχιτεκτονική JavaBeans συστατικών (JavaBeans components) για τη διαχείριση της ροής δεδομένων μεταξύ των ακόλουθων: Μια εφαρμογής πελάτη ή applet και στοιχείων που εκτελούνται στο διακομιστή Java EE Συστατικών Server και μιας βάσης δεδομένων Τα JavaBeans συστατικά δεν θεωρούνται Java EE συστατικά της Java EE προδιαγραφής.τα JavaBeans συστατικά έχουν ιδιότητες και έχουν get και να set Σελίδα 16 από 218

18 μεθόδους για πρόσβαση στις ιδιότητες τους. Τα JavaBeans συστατικά που χρησιμοποιούνται με αυτόν τον τρόπο είναι συνήθως απλά στο σχεδιασμό και στην εφαρμογή, αλλά θα πρέπει να είναι σύμφωνα με τις ονοματοδοσίες και το σχεδιασμό των συμβά-σεων που περιγράφονται στην αρχιτεκτονική JavaBeans Component Java EE Server Communications Η παρακάτω εικόνα δείχνει τα διάφορα συστατικά που μπορούν να συνθέσουν τη βαθμίδα του πελάτη. Ο πελάτης επικοινωνεί με την βαθμίδα επιχείρησης που εκτελείται στο διακομιστή Java EE, είτε άμεσα είτε όπως στην περίπτωση ενός πελάτη που λειτουργεί σε ένα πρόγραμμα περιήγησης, με τη μετάβαση από ιστοσελίδες ή servlets που τρέχουν στη web βαθμίδα. Εικόνα 2: Επικοινωνία Server Web Components Τα Java EE web συστατικά είναι είτε servlets είτε ιστοσελίδες που δημιουργήθηκαν με τη χρήση JavaServer Faces τεχνολογίας ή JSP τεχνολογίας. Οι Servlets είναι κλάσεις Java που επεξεργάζονται δυναμικά αιτήματα και κατασκευάζουν τις απαντήσεις τους. Οι JSP σελίδες είναι έγγραφα που βασίζονται σε κείμενο και εκτελούντε όπως οι servlets, αλλά επιτρέπουν μια πιο φυσική προσέγγιση για την δημιουργία στατικού περιεχομένου. Η JavaServer Faces τεχνολογία βασίζεται σε Σελίδα 17 από 218

19 servlets και JSP τεχνολογίες και παρέχει ένα πλαίσιο συστατικών διεπαφής χρήστη για εφαρμογές web. Οι στατικές σελίδες HTML και οι μικροεφαρμογές συνδυάζονται με στοιχεία του διαδικτύου κατά τη διάρκεια της εφαρμογής αλλά δεν θεωρούνται στοιχεία web από τις προδιαγραφές της Java EE. Οι Server-side κλάσεις μπορούν επίσης να συνδυαστούν με τα συστατικά web και όπως οι HTML σελίδες δεν θεωρούνται συστατικά μέρη Web. Όπως δείχνεται στο παρακάτω σχήμα,η βαθμίδα διαδικτύου, όπως και η βαθμίδα του πελάτη, μπορεί να περιλαμβάνει ένα JavaBeans συστατικό για να διαχειριστεί την είσοδο του χρήστη και να στείλει αυτή την είσοδο σε enterprise beans τα οποία τρέχουν στη βαθμίδα επιχείρησης για επεξεργασία. Εικόνα 3: Web tier και εφαρμογές web Business Components Ο Business κώδικας, είναι η λογική η οποία λύνει ή ανταποκρίνεται στις ανάγκες του συγκεκριμένου τομέα της επιχείρησης, όπως το τραπεζικό, το λιανικό εμπόριο ή τη χρηματοδότηση, που γίνεται από enterprise beans τρέχοντας είτε στη βα- Σελίδα 18 από 218

20 θμίδα επιχείρησης είτε στη βαθμίδα διαδικτύου. Το σχήμα δείχνει πώς ένα enterprise bean λαμβάνει δεδομένα από τα προγράμματα πελάτη, επεξεργάζεται (εάν είναι απαραίτητο), και το στέλνει στο επίπεδο του συστήματος πληροφόρησης των επιχειρήσεων για αποθήκευση. Ένα enterprise bean ανακτά επίσης δεδομένα από τον αποθηκευτικό χώρο, τα επεξεργάζεται (αν είναι απαραίτητο), και τα στέλνει πίσω στο πρόγραμμα πελάτη Enterprise Information SystemTier Το πληροφοριακό σύστημα των επιχειρήσεων χειρίζεται το λογισμικό EIS και περιλαμβάνει συστήματα υποδομής, όπως ο προγραμματισμός των επιχειρηματικών πόρων (ERP), mainframe επεξεργασία των συναλλαγών, συστήματα βάσεων δεδομένων, καθώς και άλλα συστήματα πληροφοριών. Για παράδειγμα, τα Java EE συστατικά της εφαρμογής μπορεί να χρειάζονται πρόσβαση στα πληροφοριακά συστήματα των επιχειρήσεων για σύνδεση στη βάση δεδομένων. Εικόνα 4: Business και EIS tiers Σελίδα 19 από 218

21 1.3 Java EE Containers Κανονικά, οι thin-client multitiered εφαρμογές είναι δύσκολο να γραφτούν, επειδή συνεπάγονται πολλές γραμμές περίπλοκου κώδικα για το χειρισμό των συναλλαγών, τη διαχείριση της κατάστασης, τη συγκέντρωση των πόρων και άλλων πολύπλοκων λεπτομερειών. Η component-based και η platform-independent Java EE αρχιτεκτονική καθιστά τις Java EE εφαρμογές εύκολες να γραφτούν επειδή η επιχειρηματική λογική είναι βασισμένη σε επαναχρησιμοποιήσιμα συστατικά. Επιπλέον, ο διακομιστής Java EE παρέχει υπηρεσίες σε μορφή ενός container για κάθε τύπο συστατικού Υπηρεσίες Container Τα container είναι η διεπαφή μεταξύ ενός συστατικού και της χαμηλού επιπέδου συγκεκριμένης λειτουργικότητας που υποστηρίζει το συστατικό. Πριν μπορέσει να εκτελεστεί ένα web, ένα enterprise bean ή ένα application client συστατικό πρέπει να συναρμολογηθεί σε μια λειτουργική μονάδα της Java EE και αναπτυχθεί μέσα στο container του. Η διαδικασία συναρμολόγησης περιλαμβάνει τον καθορισμό συγκεκριμένων ρυθμίσεων για κάθε container του κάθε συστατικού της εφαρμογής Java EE και για την ίδια την εφαρμογή Java EE. Οι ρυθμίσεις container προσαρμόζουν την υποστήριξη που παρέχεται από το διακομιστή Java EE, συμπεριλαμβανομένων και της ασφάλειας, της διαχείρισης των συναλλαγών, του Java Naming and Directory Interface (JNDI) API και της απομακρυσμένης σύνδεσης. Εδώ είναι μερικά από τα κύρια σημεία: Το μοντέλο ασφαλείας της Java EE σας επιτρέπει να διαμορφώσετε ένα enterprise bean ή ένα web συστατικό έτσι ώστε οι πόροι του συστήματος να είναι προσβάσιμοι μόνο από εξουσιοδοτημένους χρήστες. Το μοντέλο συναλλαγής της Java EE σας επιτρέπει να ορίσετε τις σχέσεις μεταξύ των μεθόδων που συνθέτουν μια ενιαία συναλλαγή, έτσι ώστε όλες οι μέθοδοι σε μία συναλλαγή να αντιμετωπίζονται ως μια ενιαία μονάδα. Σελίδα 20 από 218

22 Οι υπηρεσίες αναζήτησης JNDI παρέχουν μια ενιαία διεπαφή με πολλαπλές ονομασίες και υπηρεσίες στην επιχείρηση, έτσι ώστε τα συσταυικά της εφαρμογής μπορούν να έχουν πρόσβαση σε αυτές τις υπηρεσίες. Το Java EE μοντέλο απομακρυσμένης σύνδεσης διαχειρίζεται επικοινωνίες χαμηλού επιπέδου μεταξύ των πελατών και των enterprise beans. Μετά από την δημιουργία ενός enterprise bean, ένας πελάτης επικαλείται τις μεθόδους σε αυτό σαν να ήταν στην ίδια εικονική μηχανή. Επειδή η αρχιτεκτονική Java EE παρέχει δυνατότητα ρύθμισης των υπηρεσιών, τα συστατικά της εφαρμογής μέσα στην ίδια εφαρμογή Java EE μπορεί να συμπεριφέρονται διαφορετικά με βάση το που έχουν αναπτυχθεί. Για παράδειγμα ένα enterprise bean μπορεί να έχει ρυθμίσεις ασφαλείας που επιτρέπουν ένα ορισμένο επίπεδο πρόσβασης στα δεδομένα της βάσης δεδομένων σε ένα περιβάλλον παραγωγής και ένα άλλο επίπεδο πρόσβασης βάσης δεδομένων σε άλλο περιβάλλον παραγωγής. Το container διαχειρίζεται επίσης nonconfigurable υπηρεσίες, όπως τα enterprise beans και τον κύκλο ζωής του servlet, της συγκέντρωσης δεδομένων των πόρων σύνδεσης και την πρόσβαση στα APIs της πλατφόρμας Java EE Τύποι Container Η διαδικασία εγκατάστασης εγκαθιστά Java EE στοιχεία εφαρμογής στα Java EE containers όπως απεικονίζεται στο παρακάτω σχήμα. Διακομιστής Java EE: Το τμήμα εκτέλεσης ενός προϊόντος Java EE. Ένας server Java EE παρέχει EJB και web containers. Enterprise JavaBeans (EJB) containers: Διαχειρίζονται την εκτέλεση των enterprise beans για την Java Web container: Διαχειρίζεται την εκτέλεση των ιστοσελίδων, servlets και κάποια EJB συστατικά για εφαρμογές Java EE. Τα στοιχεία web και το container τους τρέχουν στον διακομιστή Java EE. Σελίδα 21 από 218

23 Container πελάτη εφαρμογής: Διαχειρίζεται την εκτέλεση των συστατικών εφαρμογής πελάτη. Η εφαρμογές του πελάτη και το container τους τρέχουν στον υπολογιστή-πελάτη. Applet container: Διαχειρίζεται την εκτέλεση των applets. Αποτελείται από ένα πρόγραμμα περιήγησης του web και ένα Java Plug-in που τρέχουν μαζί στον πελάτη. Εικόνα 5: Java EE server και containers 1.4 Υποστήριξη Web Services Οι Web υπηρεσίες είναι web-based εφαρμογές των επιχειρήσεων που χρησιμοποιούν ανοικτά βασισμένα σε XML πρότυπα και πρωτόκολλα μεταφοράς για την ανταλλαγή δεδομένων που ζητούν οι πελάτες. Η Java EE πλατφόρμα παρέχει τα APIs XML και τα εργαλεία που χρειάζεστε για τον γρήγορο σχεδιασμό, την ανάπτυξη, τη δοκιμή και την ανάπτυξη διαδικτυακών υπηρεσιών για πελάτες οι οποίοι συνεργάζονται πλήρως με άλλες διαδικτυακές υπηρεσίες και πελάτες που λειτουργούν με Java-based ή μη Java-based πλατφόρμες. Σελίδα 22 από 218

24 Για να γράψετε διαδικτυακές υπηρεσίες και πελάτες με τα API XML Java EE, το μόνο που έχετε να κάνετε είναι να περάσετε παράμετρυςι δεδομένων στις κλήσεις μεθόδων και να επεξεργαστείτε τα δεδομένα που επιστρέφονται. Για documentoriented web services, στέλνετε έγγραφα που περιέχουν τα δεδομένα των υπηρεσιών εμπρός και πίσω. Προγραμματισμός χαμηλού επιπέδου δεν είναι απαραίτητος, επειδή οι XML API υλοποιήσεις κάνουν τη δουλειά της μετάφρασης στα στοιχεία της εφαρμογής από και προς μια XML-based ροή δεδομένων που αποστέλλεται μέσω του τυποποιημένου XML-based πρωτόκολλου μεταφορών. Η μετάφραση των δεδομένων σε τυποποιημένη XML-based ροή δεδομένων είναι αυτό που κάνει τις web υπηρεσίες και τους πελάτες γραμμένους σε Java EE XML APIs πλήρως διαλειτουργικούς. Αυτό δεν σημαίνει απαραίτητα ότι τα δεδομένα που μεταφέρονται περιλαμβάουν ετικέτες XML, επειδή τα μεταφερόμενα δεδομένα μπορεί να είναι απλό κείμενο, δεδομένα XML ή οποιοδήποτε είδος των δυαδικών δεδομένων, όπως ήχου, βίντεο, χάρτες, αρχεία προγραμμάτων, computer-aided design (CAD) έγγραφα και παρόμοια XML Η Extensible Markup Language (XML) είναι μια γλώσσα cross-platform, επεκτάσιμη και βασισμένη σε πρότυπα κειμένου για την αναπαράσταση των δεδομένων. Συμβαλλόμενα μέρη που ανταλλάσσουν δεδομένα XML μπορούν να δημιουργήσουν τις δικές τους ετικέτες για να περιγράψουν τα δεδομένα. Σχήματα δημιουργούνται για να καθορίσουν ποιες ετικέτες μπορούν να χρησιμοποιηθούν σε ένα συγκεκριμένο είδος XML φύλλου και τη χρήση XML style sheets για τη διαχείριση της οθόνης και τον χειρισμό των δεδομένων. Για παράδειγμα, μια web υπηρεσία μπορεί να χρησιμοποιήσει XML και ένα σχήμα για την παραγωγή τιμοκαταλόγων και οι επιχειρήσεις που λαμβάνουν τους τιμοκαταλόγους και το σχήμα μπορούν να έχουν τα δικά τους στυλ φύλλων για να χειριστούν τα δεδομένα με τον τρόπο που ταιριάζει καλύτερα στις ανάγκες τους. Εδώ είναι παραδείγματα: Σελίδα 23 από 218

25 Μια εταιρεία μπορεί να βάλει XML πληροφορίες τιμολόγησης μέσω ενός προγράμματος για να μεταφράσει το XML σε HTML, έτσι ώστε να μπορεί να δημοσιεύει τους τιμοκαταλόγους στο ενδοδίκτυο της. Μια θυγατρική εταιρεία θα μπορούσε να θέσει τις πληροφορίες τιμολόγησης XML μέσω ενός εργαλείου για να δημιουργήσει μια παρουσίαση μάρκετινγκ. Μια άλλη εταιρεία μπορεί να διαβάσει τις πληροφορίες τιμολόγησης XML σε μια αίτηση για επεξεργασία Πρωτόκολλο μεταφοράς SOAP Τα αιτήματα των πελατών και οι απαντήσεις των υπηρεσιών web μεταδίδονται ως Simple Object Access Protocol (SOAP) μηνύματα μέσω HTTP για να ενεργοποιήσουν μια πλήρως διαλειτουργική ανταλλαγή μεταξύ των πελατών και των υπηρεσιών web. Όλα λειτουργούν σε διαφορετικές πλατφόρμες και σε διάφορες τοποθεσίες στο Internet. Το HTTP είναι ένα γνωστό πρότυπο αιτήματος και απάντησης για αποστολή μηνυμάτων μέσω του Διαδικτύου και το SOAP είναι ένα XML βασισμένο πρωτόκολλο που ακολουθεί το μοντέλο αιτήματος και απόκρισης HTTP. Το τμήμα SOAP ενός μεταφερόμενου μηνύματος κάνει τα εξής: Καθορίζει έναν φάκελο που βασίζεται σε XML για να περιγράψει ό, τι είναι στο μήνυμα και να εξηγήσει το πώς θα επεξεργαστεί το μήνυμα Περιλαμβάνει βασισμένους σε XML κανόνες κωδικοποίησης για να εκφράσει τις περιπτώσεις καθορισμένων τύπων δεδομένων της εφαρμογής μέσα στο μήνυμα Καθορίζει μια σύμβαση που βασίζεται σε XML για την αναπαράσταση της αίτησης στον απομακρυσμένο εξυπηρέτη και την προκύπτουσα απόκριση WSDL Standard Format Η Web Services Description Language (WSDL) είναι μια τυποποιημένη μορφή XML για την περιγραφή υπηρεσιών δικτύου. Η περιγραφή περιλαμβάνει το όνομα της υπηρεσίας, την θέση των υπηρεσιών, καθώς και τρόπους για να επικοινωνούν με την υπηρεσία. Οι WSDL περιγραφές μπορούν να δημοσιεύονται στο Διαδίκτυο. Ο GlassFish Server παρέχει ένα εργαλείο για την δημιουργία προδιαγραφής Σελίδα 24 από 218

26 WSDL για μια υπηρεσία Ιστού που χρησιμοποιεί απομακρυσμένη διαδικασία κλήσεων για να επικοινωνεί με τους πελάτες. 1.5 Σύνδεση και ανάπτυξη της εφαρμογής Java EE Μια εφαρμογή Java EE είναι πακεταρισμένη σε μία ή περισσότερες πρότυπες μονάδες για εγκατάσταση σε οποιαδήποτε πλατφόρμα που είναι συμβατη με το σύστημα. Κάθε μονάδα περιέχει: Ένα λειτουργικό συστατικό ή συστατικά μέρη, όπως ένα enterprise bean,μια ιστοσελίδα, ένα servlet, ή ένα applet Έναν προαιρετικό deployment descriptor (DD) που περιγράφει το περιεχόμενο της. Όταν μια μονάδα Java EE έχει παραχθεί, είναι έτοιμη να αναπτυχθεί. Η ανάπτυξη συνήθως περιλαμβάνει τη χρήση του εργαλείου ανάπτυξης της πλατφόρμας για να καθορίσει συγκεκριμένες πληροφορίες με βάση την τοποθεσία, όπως μια λίστα των τοπικών χρηστών που μπορούν να έχουν πρόσβαση και το όνομα της τοπικής βάσης δεδομένων. Μόλις αναπτυχθεί σε μια τοπική πλατφόρμα, η εφαρμογή είναι έτοιμη να τρέξει. 1.6 Packaging Applications Μια εφαρμογή Java EE παραδίδεται σε ένα αρχείο Java Archive (JAR),σε ένα αρχείο Web Archive (WAR) ή σε ένα αρχείο Enterprise Archive (EAR). Ένα WAR ή EAR αρχείο είναι ένα τυπικό JAR (.jar) αρχείο με την επέκταση.war ή την.ear. Χρησιμοποιώντας JAR, WAR και EAR αρχεία είναι δυνατόν να ενώσει μια σειρά από διαφορετικές εφαρμογές Java EE που χρησιμοποιούν μερικά από τα ίδια συστατικά. Δεν είναι απαραίτητη καμία επιπλέον κωδικοποίηση, είναι μόνο θέμα της συναρμολόγησης (ή συσκευασίας) των διάφορων ενοτήτων Java EE σε Java EE JAR, WAR ή EAR αρχεία. Ένα αρχείο EAR περιλαμβάνει ενότητες Java EE και ενδεχομένως κάποιους DD. Ένας DD και ένα έγγραφο XML με επέκταση.xml, περιγράφει τις ρυθμίσεις ανάπτυξης μιας εφαρμογής, μιας ενότητας ή ενός συστατικού. Επειδή η πληροφορία του DD είναι δηλωτική, μπορεί να αλλάξει χωρίς την ανάγκη να τροπο- Σελίδα 25 από 218

27 ποιήσετε τον πηγαίο κώδικα. Κατά το χρόνο εκτέλεσης, ο διακομιστής Java EE διαβάζει τον DD και πράττει σχετικά με την αίτηση, την ενότητα ή το συστατικό α- ναλόγως. Εικόνα 6: Δομή EAR Οι δύο τύποι των DD είναι αυτός της Java EE και αυτός της εκτέλεσης. Ένας Java EE DD ορίζεται από τις προδιαγραφές της Java EE και μπορεί να χρησιμοποιηθεί για να ρυθμίσετε την εγκατάσταση σε οποιαδήποτε συμβατή εφαρμογή Java EE. Ένας DD χρόνου εκτέλεσης χρησιμοποιείται για τη εφαρμογή ειδικών παραμέτρων στην Java EE. Για παράδειγμα, ο DD εκτέλεσης του διακομιστή GlassFish περιέχει πληροφορίες όπως η ρίζα πλαίσιο μιας εφαρμογής web, καθώς και εκτέλεση ειδικών παραμέτρων του GlassFish διακομιστή, όπως οδηγίες για προσωρινή αποθήκευση. Οι περιγραφείς εκτέλεσης εγκατάστασης του διακομιστή GlassFish ονομάζονται sun- moduletype.xml καιβρίσκονται στον ίδιο κατάλογο META - INF όπως ο περιγραφέας ανάπτυξης Java EE. Μια ενότητα Java EE αποτελείται από ένα ή περισσότερα συστατικά Java EE για το ίδιο container, ένα τύπο και προαιρετικά ένα συστατικό του DD αυτού του τύπου. Ένας DD ενότητας enterprise beans, για παράδειγμα, δηλώνει χαρακτηριστικά συναλλαγών και άδειες ασφαλείας για ένα enterprise bean. Μια ενότητα Java EE μπορεί να αναπτυχθεί ως μια αυτόνομη ενότητα.οι ενότητες Java EE έχουν τους παρακάτω τύπους: Σελίδα 26 από 218

28 ενότητες EJB, οι οποίες περιέχουν αρχεία κλάσης για τα enterprise beans και έναν deployment descriptor EJB. Οι ενότητες EJB συσκευάζονται ως JAR αρχεία με επέκταση.jar. Web ενότητες, που περιέχουν τα αρχεία class servlet, web αρχεία, αρχεία υποστήριξης κατηγορίας, GIF και αρχεία HTML και έναν περιγραφέα ανάπτυξης εφαρμογών web. Οι Web ενότητες είναι συσκευασμένες ως JAR αρχεία με.war (web archive) επέκταση. ενότητες εφαρμογών client, οι οποίες περιέχουν αρχεία κλάσης και έναν deployment descriptor εφαρμογής πελάτη. Οι ενότητες εφαρμογής πελάτη συσκευάζονται ως αρχεία JAR με επέκταση. jar. ενότητες προσαρμογέα πόρων, οι οποίες περιέχουν όλες τις διεπαφές Java, κλάσεις, βιβλιοθήκες και άλλα έγγραφα, μαζί με τον deployment descriptor των πόρων του προσαρμογέα. Μαζί αυτά εφαρμόζουν την αρχιτεκτονική Connector για μια συγκεκριμένη EIS. Οι μονάδες τoυ προσαρμογέα πόρων συσκευάζονται ως αρχεία JAR με επέκταση. rar (resource adapter archive). 1.7 Ρόλοι ανάπτυξης Επαναχρησιμοποιούμενες μονάδες καθιστούν δυνατόν να διαχωρίσουμε την ανάπτυξη εφαρμογών και την διαδικασία ανάπτυξης σε διακριτούς ρόλους, έτσι ώστε διαφορετικοί άνθρωποι ή εταιρείες να μπορούν να εκτελούν διαφορετικά μέρη της διαδικασίας. Οι δύο πρώτοι ρόλοι, ο πάροχος των προϊόντων της Java EE και ο πάροχος εργαλείου, περιλαμβάνουν την αγορά και την εγκατάσταση του προϊόντος Java EE και των εργαλείων. Μετά το λογισμικό αγοράζεται και εγκαθίσταται, τα Java EE συστατικά μπορούν να αναπτυχθούν από τους παρόχους συστατικών της εφαρμογής, συναρμολογούνται από συναρμολογητές εφαρμογής και οι υπεύθυνοι εγκατάστασης αναπτύσσουν την εφαρμογή. Σε μια μεγάλη οργάνωση, κάθε ένα από αυτούς τους ρόλους μπορεί να εκτελείται από διαφορετικά άτομα ή ομάδες. Αυτή η διαίρεση της εργασίας λειτουργεί, επειδή κάθε ένας από τους προηγούμενους ρόλους εξάγει ένα φορητό αρχείο που είναι η είσοδος για έναν επακόλουθο ρόλο. Για παράδειγμα, στην φάση ανάπτυξης του συστατικού της εφαρμογής, ένας προγραμματιστής λογισμικού enterprise beans προσφέρει EJB Σελίδα 27 από 218

29 JAR αρχεία. Στο ρόλο συγκρότησης της εφαρμογής, άλλος προγραμματιστής μπορεί να συνδυάσει αυτά τα αρχεία EJB JAR σε μια εφαρμογή Java EE και να τα αποθηκεύσει σε ένα αρχείο EAR. Στο ρόλο την ανάπτυξης εφαρμογών, ο διαχειριστής του συστήματος στη θέση του πελάτη χρησιμοποιεί το αρχείο EAR για να εγκαταστήσετε την Java EE εφαρμογή σε ένα διακομιστή Java EE. Οι διαφορετικοί ρόλοι δεν εκτελούνται πάντα από διαφορετικούς ανθρώπους. Αν εργάζεστε για μια μικρή εταιρεία, για παράδειγμα ή αν προτυποποιείτε μια αίτηση δείγμα, ίσως εκτελείτε τα καθήκοντα σε κάθε φάση Java EE πάροχος προϊόντων Ο πάροχος των προϊόντων της Java EE είναι η εταιρεία που σχεδιάζει και κάνει διαθέσιμα για αγορά τα APIs της πλατφόρμας Java EE και άλλα χαρακτηριστικά που ορίζονται στην Java EE προδιαγραφή. Οι πάροχοι των προϊόντων συνήθως είναι πωλητές εφαρμογών server που εφαρμόζουν την πλατφόρμα Java EE Πάροχος Εργαλείου Ο πάροχος εργαλείου είναι η εταιρεία ή το άτομο που δημιουργεί την ανάπτυξη, τη συναρμολόγηση και τα εργαλεία συσκευασίας που χρησιμοποιούνται από τις εταιρείες παροχής συστατικών,τους συναρμολογητές και τους υπευθύνους εγκατάστασης Πάροχος στοιχείου της εφαρμογής Ο πάροχος στοιχείων της εφαρμογής είναι η εταιρεία ή το άτομο που δημιουργεί τα web συστατικά, τα enterprise beans, τις εφαρμογές ή τους πελάτες της εφαρμογής για χρήση σε Java EE εφαρμογές Προγραμματιστής Enterprise beans Ένας προγραμματιστής Enterprise beans εκτελεί τις ακόλουθες εργασίες για να παραδώσει ένα αρχείο EJB JAR που περιέχει ένα ή περισσότερα Enterprise beans: Γράφει και μεταγλωττίζει τον πηγαίο κώδικα Καθορίζει τον deployment descriptor (προαιρετικό) Σελίδα 28 από 218

30 Πακετάρει τα αρχεία. Class και τον DD στο αρχείο EJB JAR Προγραμματιστής web συστατικού Ένας προγραμματιστής web συστατικού εκτελεί τις ακόλουθες εργασίες για να παραδώσει ένα WAR αρχείο που περιέχει ένα ή περισσότερα συστατικά ιστού: Γράφει και μεταγλωττίζει τον πηγαίο κώδικα του servlet Γράφει JavaServer Faces, JSP και αρχεία HTML Καθορίζει τον DD (προαιρετικό) Πακετάρει. class,. Jsp, και.html αρχεία και τον DD στο WAR αρχείο Προγραμματιστής Πελάτη Εφαρμογής Ένας προγραμματιστής πελάτη εφαρμογής εκτελεί τις ακόλουθες εργασίες για να παραδώσει ένα αρχείο JAR που περιέχει τον πελάτη εφαρμογής: Γράφει και μεταγλωττίζει τον πηγαίο κώδικα Καθορίζει τον DD για τον πελάτη (προαιρετικό) Πακετάρει τα αρχεία. Class και τον DD στο αρχείο JAR Application Deployer και Διαχειριστής Ο application deployer και ο διαχειριστής είναι η εταιρεία ή το άτομο που ρυθμίζει και αναπτύσσει την εφαρμογή Java EE, διαχειρίζεται την πληροφοριακή και τη δικτυακή υποδομή όπου τρέχουν οι εφαρμογές Java EE και επιβλέπει το περιβάλλον εκτέλεσης. Στα καθήκοντα περιλαμβάνονται ο καθορισμός έλεγχων της συναλλαγής και των χαρακτηριστικών ασφαλείας καθώς και ο προσδιορισμός των συνδέσεων στις βάσεις δεδομένων. Κατά τη διάρκεια της διαμόρφωσης, ο Deployer ακολουθεί τις οδηγίες που παρέχονται από τον πάροχο συστατικών της εφαρμογής για την επίλυση των εξωτερικών εξαρτήσεων, καθορίζοντας τις ρυθμίσεις ασφαλείας και ορίζοντας τα χαρακτηριστικά της συναλλαγής. Κατά την εγκατάσταση, ο deployer μετακινεί τα συστατικά της εφαρμογής στον server και δημιουργεί τις κλάσεις και τις διασυνδέσεις ειδικών container. Σελίδα 29 από 218

31 Ένας deployer ή διαχειριστής συστήματος εκτελεί τις ακόλουθες εργασίες για την εγκατάσταση και τη ρύθμιση μιας εφαρμογής Java EE: Ρυθμίζει την εφαρμογή Java EE για το επιχειρησιακό περιβάλλον Ελέγχει ότι τα περιεχόμενα του αρχείου EAR είναι καλά σχηματισμένα και συμμορφώνονται με τις Java ΕΕ προδιαγραφές αναπτύσσει (εγκαθιστά) το αρχείο EAR της εφαρμογής Java EE στο διακομιστή Java EE 1.8 Java EE 6 ΑΡΙs Το παρακάτω σχήμα δείχνει τις σχέσεις μεταξύ των Java EE container. Εικόνα 7: Java EE containers Enterprise JavaBeansTechnology Ένα Enterprise JavaBeans (EJB) συστατικό ή enterprise bean, είναι ένα σώμα κώδικα που έχει πεδία και μεθόδους για την εισαγωγή ενοτήτων επιχειρηματικής λογικής. Μπορείτε να σκεφτείτε ένα enterprise bean ως δομικό στοιχείο που μπορεί να χρησιμοποιηθεί μόνο του ή με άλλο enterprise bean για να εκτελέσει την επιχειρηματική λογική στο διακομιστή της Java EE. Τα enterprise beans είναι είτε session beans είτε message-driven beans. Σελίδα 30 από 218

32 Ένα session bean αντιπροσωπεύει μια παροδική συνομιλία με έναν πελάτη. Όταν ο πελάτης τελειώνει την εκτέλεση, το session bean και τα δεδομένα του φεύγουν. Ένα message-driven bean συνδυάζει τα χαρακτηριστικά ενός session bean και ενός ακροατή μηνύματος, επιτρέποντας σε ένα επιχειρηματικό συστατικό να λαμβάνει μηνύματα ασύγχρονα. Κοινώς, αυτά είναι τα Java Message Service (JMS) μηνύματα. Στην Java EE 6 πλατφόρμα, νέα χαρακτηριστικά των enterprise beans περιλαμβάνουν τα ακόλουθα: Τη δυνατότητα πακεταρίσματος των τοπικών enterprise beans σε ένα αρχείο WAR Τα Singleton session beans, τα οποία παρέχουν εύκολη πρόσβαση σε κοινόχρηστη κατάσταση Ένα ελαφρύ υποσύνολο της λειτουργικότητας Enterprise JavaBeans (EJB Lite) που μπορεί να παρέχεται μέσα από τα Java EE προφίλ, όπως το Java EE Web προφίλ Java ServletTechnology Η τεχνολογία Java Servlet σας επιτρέπει να ορίσετε συγκεκριμένες HTTP κατηγορίες servlet. Μια κλάση servlet επεκτείνει τις δυνατότητες των servers που φιλοξενούν εφαρμογές προσβάσιμες για ένα μοντέλο προγραμματισμού αιτήματος-απάντησης. Παρά το γεγονός ότι τα servlets μπορούν να ανταποκριθούν σε κάθε είδους αίτηματος, χρησιμοποιούνται συνήθως για την επέκταση των εφαρμογών που φιλοξενούνται από web servers. Στην Java EE 6 πλατφόρμα, νέα χαρακτηριστικά της Java Servlet τεχνολογίας περιλαμβάνουν τα ακόλουθα: Υποστήριξη σχολιασμού Ασύγχρονη υποστήριξη Ευκολία διαμόρφωσης Διευρύνονται τα υπάρχοντα ΑΡΙ Pluggability Σελίδα 31 από 218

33 1.8.3 Τεχνολογία JavaServer Faces Η JavaServer Faces τεχνολογία είναι ένα περιβάλλον εργασίας χρήστη για τη δημιουργία web εφαρμογών. Τα κύρια συστατικά της JavaServer Faces τεχνολογίας έχουν ως εξής: Ένα συστατικό GUI. Ένα μοντέλο για την απόδοση συστατικών σε διαφορετικά είδη HTML ή διαφορετικές γλώσσες σήμανσης και τεχνολογίες. Ένα αντικείμενο Renderer που δημιουργεί την σήμανση για να διαχειριστεί το συστατικό και μετατρέπει τα δεδομένα που είναι αποθηκευμένα σε ένα μοντέλο αντικειμένου σε τύπους που μπορούν να αναπαρασταθούν σε μια προβολή. Ένα πρότυπο για τη δημιουργία RenderKit HTML/4.01 σήμανσης. Τα ακόλουθα χαρακτηριστικά υποστηρίζουν τα συστατικά GUI: επικύρωση εισόδου διαχείριση γεγονότος μετατροπή δεδομένων μεταξύ του μοντέλου αντικειμένων και των συστατικών μοντέλο διαχείρισης υπεύθυνο για τη δημιουργία αντικειμένων διαμόρφωση σελίδας πλοήγησης Expression Language (EL) Όλη αυτή η λειτουργία είναι διαθέσιμη με τη χρήση των Java APIs και βασίζεται σε αρχεία ρυθμίσεων XML. Στην πλατφόρμα Java EE 6, νέα χαρακτηριστικά του JavaServer Faces περιλαμβάνουν τα ακόλουθα: την ικανότητα να χρησιμοποιούμε σχολιασμούς αντί ενός αρχείου ρυθμίσεων για να καθορίσουμε τη διαχείριση των beans Facelets, μια τεχνολογία απεικόνισης που αντικαθιστά την τεχνολογία JavaServer Pages (JSP) χρησιμοποιώντας αρχεία XHTML υποστήριξη Ajax σύνθετα συστατικά σιωπηρή πλοήγηση Σελίδα 32 από 218

34 1.8.4 JavaServer PagesTechnology Η τεχνολογία JavaServer Pages (JSP) σας επιτρέπει να βάλετε τμήματα κώδικα servlet απευθείας σε ένα τεκμηριωμένο κείμενο. Μια σελίδα JSP είναι ένα έγγραφο που βασίζεται σε δύο τύπους κειμένου: Στατικά στοιχεία, τα οποία μπορούν να εκφράζονται σε οποιοδήποτε μορφή κειμένου που βασίζονται, όπως HTML ή XML JSP στοιχεία, τα οποία καθορίζουν τον τρόπο που η σελίδα κατασκευάζει δυναμικό περιεχόμενο Βιβλιοθήκη JavaServer Pages StandardTag Η JavaServer Pages Standard Tag Library (JSTL) συμπυκνώνει βασικές λειτουργίες που είναι κοινές σε πολλές εφαρμογές JSP. Αντί της ανάμιξης ετικετών από τους πολυάριθμους πωλητές στην JSP εφαρμογή σας, μπορείτε να χρησιμοποιήσετε ένα ενιαίο, τυποποιημένο σύνολο ετικετών. Αυτή η τυποποίηση σας επιτρέπει να αναπτύξετε τις εφαρμογές σας σε οποιοδήποτε container JSP που υποστηρίζει JSTL και καθιστά πιο πιθανό το ότι η εφαρμογή των ετικετών έχει βελτιστοποιηθεί. Η JSTL έχει iterator και υπό όρους ετικέτες για το χειρισμό του ελέγχου της ροής, ετικέτες για το χειρισμό XML εγγράφων, ετικέτες διεθνοποίησης, ετικέτες για την πρόσβαση σε βάσεις δεδομένων με χρήση SQL και συχνότερα χρησι-μοποιούμενες λειτουργίες Java Persistence API Το Java Persistence API είναι μια πρότυπη λύση βασισμένη σε Java για την επιμονή (persistence). Η persistence χρησιμοποιεί μια αντικειμενοσχεσιακή μέθοδο χαρτογράφησης για να γεφυρωθεί το χάσμα μεταξύ ενός object-oriented μοντέλου και μιας σχεσιακής βάσης δεδομένων. Τα Java Persistence API μπορεί επίσης να χρησιμοποιείται σε εφαρμογές Java SE, έξω από το περιβάλλον της Java EE. Το Java Persistence αποτελείται από τους ακόλουθους τομείς: το Java Persistence API τη γλώσσα ερωτημάτων την αντικειμενοσχεσιακή χαρτογράφηση μεταδεδομένων Σελίδα 33 από 218

35 1.8.7 Java Transaction API To Java Transaction API (JTA) παρέχει μια τυπική διασύνδεση για την οριοθέτηση συναλλαγών. Η αρχιτεκτονική της Java EE παρέχει μια αυτόματη προεπιλογή που δεσμεύεται να χειριστεί και να επαναφέρει τη συναλλαγή. Ένα auto commit σημαίνει ότι τυχόν άλλες εφαρμογές που βλέπουν τα δεδομένα θα δουν τα ενημερωμένα δεδομένα μετά από κάθε λειτουργία διαβάσματος ή γραψίματος στη βάση δεδομένων. Ωστόσο, εάν η εφαρμογή σας εκτελεί δύο ξεχωριστές λειτουργίες πρόσβασης σε βάσεις δεδομένων που εξαρτώνται η μια από την άλλη, θα πρέπει να χρησιμοποιήσετε το JTA API για να οριοθετήσετε το που αρχίζει η συναλλαγή, συμπεριλαμβανομένων των πράξεων, εκκίνησης, επαναφοράς και εκτέλεσης Java API για RESTful Υπηρεσίες Web Το Java API για RESTful υπηρεσίες Web (JAX - RS) προσδιορίζει τα APIs για την ανάπτυξη web υπηρεσιών χτισμένων σύμφωνα με το Representational StateTransfer (REST) αρχιτεκτονικό ύφος. Μια εφαρμογή JAX-RS είναι μια διαδικτυακή εφαρμογή που αποτελείται από κλάσεις που είναι συσκευασμένες ως ένα servlet σε ένα WAR αρχείο μαζί με τις απαιτούμενες βιβλιοθήκες.το JAX -RS API είναι νέο για την πλατφόρμα Java EE Managed beans Τα managed beans,είναι ελαφριά διαχείριζόμενα από container αντικείμενα (POJOs) με ελάχιστες απαιτήσεις. Υποστηρίζουν ένα μικρό σύνολο βασικών υπηρεσιών, όπως η εισαγωγή των πόρων, τα callbacks του κύκλου ζωής και της αναχαίτισης. Τα Managed beans αποτελούν μια γενίκευση των managed beans που καθορίζονται από την JavaServer Faces τεχνολογία και μπορούν να χρησιμοποιηθούν οπουδήποτε σε Java EE εφαρμογή και όχι μόνο σε μονάδες web. Τα Managed beans είναι νέα για την πλατφόρμα Java EE Contexts και Dependency Injection για την Πλατφόρμα Java EE Το Contexts και Dependency Injection (CDI) για την πλατφόρμα Java EE ορίζουν ένα σύνολο συμφραζόμενων υπηρεσιών, που παρέχονται από τα Java EE Σελίδα 34 από 218

36 containers και καθιστούν εύκολο για τους προγραμματιστές να χρησιμοποιούν τα enterprise beans μαζί με JavaServer Faces τεχνολογία σε web εφαρμογές. Σχεδιασμένο για χρήση με stateful αντικείμενα, το CDI έχει επίσης πολλές ευρύτερες χρήσεις, επιτρέποντας στους προγραμματιστές μεγάλη ευελιξία για την ενσωμάτωση διαφόρων ειδών συστατικών με ένα χαλαρά συνδεδεμένο αλλά ασφαλή τύπου τρόπο. Το CDI είναι νέα για την πλατφόρμα Java EE Dependency Injection για Java Η Dependency injection για την Java ορίζει ένα τυποποιημένο σύνολο σχολιασμών (και ένα interface) για χρήση σε inject κλάσεις. Στην πλατφόρμα Java EE, το CDI παρέχει υποστήριξη για την dependency injection. Μπορείτε να χρησιμοποιήσετε τη dependency injection μόνο σε εφαρμογή με δυνατότητα CDI. Η dependency injection είναι νέα για την πλατφόρμα Java EE Bean Validation Η επικύρωση beans ορίζει ένα μοντέλο μεταδεδομένων και ενός API για την επικύρωση δεδομένων σε JavaBeans συστατικά. Αντί για τη διανομή επικύρωσης των δεδομένων διαφόρων στρωμάτων, όπως του προγράμματος περιήγησης και της πλευράς του server, μπορείτε να ορίσετε περιορισμούς επικύρωσης σε ένα μέρος και να τα μοιράσετε μεταξύ των διαφόρων στρωμάτων. Η bean validation είναι νέα για την πλατφόρμα Java EE Υπηρεσία Μηνυμάτων Java API Το Java Message Service (JMS) API είναι ένα πρότυπο ανταλλαγής μηνυμάτων που επιτρέπει στα Java EE συστατικά της εφαρμογής να δημιουργήσουν, να στείλουν, να λάβουν και να διαβάσουν μηνύματα. Δίνει τη δυνατότητα επικοινωνίας που είναι χαλαρά συνδεδεμένη αξιόπιστη και ασύγχρονη Java EE Connector Architecture Η αρχιτεκτονική Java EE Connector χρησιμοποιείται από τους πωλητές των εργαλείων και τους ενοποιητές του συστήματος για να δημιουργούν προσαρμογείς πόρων που υποστηρίζουν την πρόσβαση σε πληροφοριακά συστήματα των επιχειρήσεων που μπορούν να συνδεθούν σε οποιοδήποτε προϊόν Java EE. Σελίδα 35 από 218

37 Ένας προσαρμογέας πόρων είναι ένα συστατικό λογισμικού που επιτρέπει σε Java EE συστατικά της εφαρμογής να έχουν πρόσβαση και να αλληλεπιδρούν με τον υποκείμενο διαχειριστή πόρων της EIS. Επειδή ένας προσαρμογέας πόρων είναι ειδικός για κάθε διαχειριστή πόρων, υπάρχει ένας διαφορετικός προσαρμογέας πόρου συνήθως για κάθε τύπο βάσης δεδομένων ή πληροφοριακού συστήματος της επιχείρησης JavaMail API Οι εφαρμογές της Java EE χρησιμοποιούν το JavaMail API για την αποστολή ειδοποιήσεων μέσω ηλεκτρονικού ταχυδρομείου.το JavaMail API έχει δύο μέρη: Τη διεπαφή σε επίπεδο εφαρμογής που χρησιμοποιείται από τα στοιχεία της εφαρμογής για να στείλουν mail Τη διεπαφή του φορέα παροχής υπηρεσιών Η πλατφόρμα Java EE περιλαμβάνει το API JavaMail με ένα φορέα παροχής υπηρεσιών που επιτρέπει στα συστατικά της εφαρμογής να στείλουν mail στο Internet Java Authorization Contract για Containers Η προδιαγραφή Java Authorization Contract για Containers (JACC) ορίζει μια σύμβαση μεταξύ ενός διακομιστή Java EE και ενός παροχέα της πολιτικής έγκρισης.όλα τα container της Java EE υποστηρίζουν την παρούσα σύμβαση Java Authentication Service Provider Interface για container Η προδιαγραφή Java Authentication Service Provider Interface για container (JASPIC) ορίζει ένα περιβάλλον παροχής υπηρεσιών (SPI), με το οποίο ταυτοποιεί παρόχους υπηρεσιών που εφαρμόζουν μηχανισμούς μηνύματος ελέγχου ταυτότητας που μπορούν να ενσωματωθούν σε μήνυμα επεξεργασίας container ή σε runtime. Παρόχοι ταυτότητας ενσωματώνουν μέσω αυτής της διασύνδεσης μηνύματα δικτύου που παρέχονται σε αυτούς από το container που τους έκανε κλήση. Οι πάροχοι ταυτότητας μετατρέπουν τα εξερχόμενα μηνύματα, ώστε η πηγή του μηνύματος να μπορεί να επικυρώνεται από το container και o παραλήπτης του μηνύματος να μπορεί να επικυρώνεται από τον αποστολέα του Σελίδα 36 από 218

38 μηνύματος. Οι πάροχοι πιστοποίησης ταυτοποιούν τα εισερχόμενα μηνύματα και επιστρέφουν στο container κλήσης τους τη ταυτότητα που δημιουργήθηκε ως αποτέλεσμα της ταυτοποίησης μηνυμάτων. Το JASPIC είναι νέο για την Java EE 6 πλατφόρμα. 1.9 Java EE 6 ΑΡΙ στην πλατφόρμα Java, Standard Edition 6.0 Αρκετά APIs που απαιτούνται από την πλατφόρμα Java EE 6 περιλαμβάνονται στην πλατφόρμα Java, Standard Edition 6.0 (Java SE 6) και έτσι θα είναι διαθέσιμα σε Java EE εφαρμογές Java Database Connectivity API Το Java Database Connectivity (JDBC) API σας επιτρέπει να επικαλείστε εντολές SQL από μεθόδους της γλώσσας Java. Μπορείτε να χρησιμοποιήσετε το JDBC API σε ένα enterprise bean όταν έχετε ένα session bean για πρόσβαση στη βάση δεδομένων. Μπορείτε επίσης να χρησιμοποιήσετε το JDBC API από ένα servlet ή μια σελίδα JSP για να αποκτήσετε πρόσβαση στη βάση δεδομένων άμεσα, χωρίς να περάσετε από ένα enterprise bean. Το JDBC API αποτελείται από δύο μέρη: Τη διεπαφή σε επίπεδο εφαρμογής που χρησιμοποιείται από την εφαρμογής για την πρόσβαση σε μία βάση δεδομένων Μια διεπαφή φορέα παροχής υπηρεσιών για να επισυνάψετε ένα πρόγραμμα οδήγησης JDBC στην πλατφόρμα Java EE Java Naming και Directory Interface API Το Java Naming και Directory Interface (JNDI) API παρέχει τη λειτουργεία της ονομασίας και του καταλόγου, επιτρέποντας στις εφαρμογές να έχουν πρόσβαση σε πολλαπλές υπηρεσίες ονοματοδοσίας και κατάλογου, συμπεριλαμβανομένων των υφιστάμενων υπηρεσιών ονοματοδοσίας και καταλόγου, όπως LDA, NDS, το DNS και NIS. Το JNDI API παρέχει εφαρμογές με τις μεθόδους τους για την εκτέλεση δραστηριοτήτων τυπικού καταλόγου όπως η συσχέτιση χαρακτηριστικών με τα αντικείμενα και ψάξιμο για αντικείμενα χρησιμοποιώντας τις ιδιότητές τους. Χρησιμοποιώντας JNDI, μια εφαρμογή Java EE μπορεί να αποθηκεύσει και να ανακτήσει κάθε είδους ονομαζόμενο Java αντικείμενο. Σελίδα 37 από 218

39 Οι Java EE υπηρεσίες ονοματοδοσίας παρέχουν στους πελάτες της εφαρμογής, στα enterprise beans καθώς και στα web συστατικά πρόσβαση σε JNDI περιβάλλον ονοματοδοσίας. Ένα περιβάλλον ονοματοδοσίας επιτρέπει σε ένα συστατικό να προσαρμοστεί χωρίς την ανάγκη να έχει πρόσβαση ή να αλλάξει το πηγαίο κώδικα του. Ένα container υλοποιεί το περιβάλλον του συστατικού και το παρέχει στα συστατικά ως ένα πλαίσιοo ονομασίας JNDI (JNDI naming context) Πλαίσιο ενεργοποίησης JavaBeans Το JavaBeans Activation Framework (JAF) χρησιμοποιείται από το JavaMail API. Το JAF παρέχει τυποποιημένες υπηρεσίες για να καθορίσει το είδος των αυθαίρετων κομματιών των δεδομένων, να ενσωματώσει το πώς θα έχει την πρόσβαση να το κάνει αυτό, να ανακαλύπτει τις λειτουργίες που διατίθενται σε αυτό και δημιουργεί τα κατάλληλα JavaBeans συστατικά για την εκτέλεση των εργασιών αυτών Java API για την επεξεργασία XML Το Java API για την επεξεργασία XML (JAXP), είναι μέρος της πλατφόρμας Java SE, υποστηρίζει την επεξεργασία εγγράφων XML με τη χρήση Document Object Model (DOM), Simple API για XML (SAX) και Extensible Stylesheet Language Transformations (XSLT). Το JAXP επιτρέπει στις εφαρμογές να αναλύουν και να μετατρέψουν τα έγγραφα XML, ανεξάρτητα από μια συγκεκριμένη εφαρμογή επεξεργασίας XML. Το JAXP παρέχει επίσης υποστήριξη namespace, το οποίο σας επιτρέπει να εργάζεστε με τα σχήματα που θα μπορούσαν διαφορετικά να έχουν συγκρούσεις ονοματοδοσίας Java Αρχιτεκτονική για XML Binding Η Java Αρχιτεκτονική για XML Binding (JAXB) παρέχει έναν εύκολο τρόπο για τη δέσμευση ενός σχήματος XML για μια αναπαράσταση σε προγράμματα Java. Η JAXB μπορεί να χρησιμοποιηθεί αυτοτελώς ή σε συνδυασμό με το JAX-WS, όπου παρέχει ένα πρότυπο δεδομένων δέσμευσης για μηνύματα web υπηρεσίας. Όλα τα container της εφαρμογής πελάτη Java EE, τα web containers και τα containers EJB υποστηρίζουν το JAXB API. Σελίδα 38 από 218

40 1.9.6 SOAP με Συνημμένα API για Java Το SOAP με Συνημμένα API για Java (SAAJ) είναι ένα χαμηλού επιπέδου API από το οποίο εξαρτάται το JAX-WS. Το SAAJ επιτρέπει την παραγωγή και την κατανάλωση των μηνυμάτων που είναι σύμφωνα με τις προδιαγραφές SOAP 1.1 και 1.2 και SOAP με σημειώσεις συνημμένων. Πλέον οι προγραμματιστές δεν χρησιμοποιούν το SAAJ API, χρησιμοποιούν το υψηλότερου επιπέδου JAX-WS API Java API για XML Υπηρεσίες Web Το Java API για XML Web Services (JAX-WS) παρέχει υποστήριξη για τις υπηρεσίες web που χρησιμοποιούν το JAXB API για τη δέσμευση των δεδομένων XML στα αντικείμενα Java. Η JAX WS προδιαγραφή ορίζει APIs πελάτη για πρόσβαση σε web υπηρεσίες, καθώς και τεχνικές για την εφαρμογή των τελικών web υπηρεσιών. Οι Implementing Enterprise Web Services λεπτομέρειες περιγράφουν την ανάπτυξη των υπηρεσιών και των πελατών βασισμένων σε JAX-WS. Οι EJB και προδιαγραφές Java Servlet περιγράφουν επίσης τις πτυχές της εν λόγω εγκατάστασης Υπηρεσία Πιστοποίησης και Εξουσιοδότησης Java Η Υπηρεσία Πιστοποίησης και Εξουσιοδότησης Java (JAAS) παρέχει τον τρόπο σε μια εφαρμογή Java να πιστοποιήσει και να εξουσιοδοτήσει ένα συγκεκριμένο χρήστη ή ομάδα χρηστώνγια να τον τρέξει. Η JAAS είναι μια γλώσσα προγραμματισμού Java έκδοσης του προτύπου Pluggable Authentication Module (Pam) πλαισίου, που επεκτείνει εκ νέου την Java Platform αρχιτεκτονική ασφάλειας για την υποστήριξη της βασισμένης στον χρή-στη εξουσιοδότησης GlassFish ServerTools Ο διακομιστής GlassFish είναι συμβατός της πλατφόρμας Java EE 6. Εκτός από την υποστήριξη σε όλα τα API που περιγράφονται στα προηγούμενα κεφάλαια, ο GlassFish διακομιστής περιλαμβάνει μια σειρά από εργαλεία Java EE, που δεν αποτελούν μέρος της πλατφόρμας Java EE 6 αλλά παρέχονται ως διευκόλυνση του έργου του κατασκευαστή. Σελίδα 39 από 218

41 2. JavaServer Faces Η JavaServer Faces είναι μια server-side διεπαφή χρήστη (UI) για web εφαρμογές που βασίζονται σε Java. Η JSF σας επιτρέπει να: Δημιουργήσετε μια ιστοσελίδα με ένα σύνολο από επαναχρησιμοποιήσιμα στοιχεία UI που ακολουθούν το πρότυπο σχεδιασμού Model-View Controller (MVC). Δεσμεύσετε συστατικά σε ένα server-side μοντέλο. Αυτό επιτρέπει μία αμφίδρομη ανταλλαγή των δεδομένων της εφαρμογής με το UI. Χειριστείτε τη σελίδα πλοήγησης σε απάντηση των γεγονότων UI και του μοντέλου των αλληλεπιδράσεων. Διαχείριστείτε τη κατάσταση του συστατικού UI στα αιτημάτα του server. Παρέχετε ένα απλό μοντέλο για την καλωδίωση του πελάτη που δημιουργεί γεγονότα με τον server-side κώδικα της εφαρμογής. Δημιουργήσετε και επαναχρησιμοποιήσετε ύκολα τα custom UI συστατικά. Μια εφαρμογή JSF αποτελείται από : Ένα σύνολο από ιστοσελίδες στις οποίες τα στοιχεία UI είναι εκτός. Ένα σύνολο managed beans. Ένα σύνολο των beans δεσμεύει συστατικά σε ένα πρότυπο της πλευράς του διακομιστή (συνήθως CDI beans) και ένα άλλο σύνολο δρα ως ελεγκτής (συνήθως EJB ή CDI beans). Έναν προαιρετικό DD, web.xml. Ένα προαιρετικό αρχείο διαμόρφωσης, Faces - config.xml. Ένα προαιρετικό σύνολο προσαρμοσμένων αντικείμενων, όπως μετατροπείς και ακροατές, που δημιουργήθηκε από τον προγραμματιστή της εφαρμογής. 2.1 Facelets H Facelets είναι η view decleration γλώσσα για την JSF. Είναι η αντικατάσταση για την JSP, η οποία σήμερα διατηρείται μόνο για συμβατότητα με προηγούμενες εκδόσεις. Βασικά πλεονεκτήματα της facelets είναι ότι παρεχει ένα ισχυρό πρότυπο συστήματος, την επαναχρησιμοποίηση και την ευκολία ανάπτυξης, καλύτερη αναφορά σφαλμάτων και φιλική σχεδίαση. Σελίδα 40 από 218

42 Οι Facelets σελίδες συγγράφονται με XHTML 1.0 και Cascade Style Sheets (CSS). Ένα XHTML 1.0 έγγραφο είναι μια αναδιατύπωση ενός HTML 4 έγγραφου σύμφωνο με τους κανόνες της XML 1.0. Οι σελίδες πρέπει να είναι σύμφωνες με το XHTML-1.0-Transitional DTD. Μπορείτε να ορίσετε μια απλή σελίδα Facelets χρησιμοποιώντας XHTML: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " <html xmlns=" <h:head> xmlns:h=" <title>my Facelet Page Title</title> </h:head> <h:body> Hello from Facelets </h:body> </html> Σε αυτόν τον κώδικα, ένας πρόλογος XML ακολουθείτε από ένα document type decleration (DTD). Το στοιχείο root της html σελίδας υπάρχει στο namespace Ένα namespace XML δηλώνεται για τη βιβλιοθήκη tag που χρησιμοποιείται στην ιστοσελίδα. Οι Facelets HTML ετικέτες (αυτές που αρχίζουν με h:) και οι τακτικές ετικέτες της HTML χρησιμοποιούνται για να προσθέσουν τα συστατικά. Πίνακας 1: Ο πίνακας δείχνει το τυπικό σύνολο των ετικετών που υποστηρίζονται από Facelets βιβλιοθήκες. Σελίδα 41 από 218

43 Με σύμβαση, οι ιστοσελίδες που κατασκευάζονται με XHTML έχουν.xhtml επέκταση. Η Facelets παρέχει Expression Language (EL) ολοκλήρωση. Αυτό επιτρέπει την αμφίδρομη σύνδεση δεδομένων μεταξύ των backing beans και του UI: Hello from Facelets, my name is #{name.value! Σε αυτόν τον κώδικα, το #{name είναι ένα EL που αναφέρεται στο πεδίο της τιμής ενός public class Name { private String value; //... Είναι σημαντικό να στο CDI bean για να ενεργοποιηθεί η έγχυσή του σε μία EL. Στην JSF 2.2, το@ javax.faces.bean.managedbean έχει ως στόχο την υποτίμησή του σε μια μελλοντική έκδοση, γι 'αυτό είναι προτεινόμενο να Παρομοίως, ένα EJB μπορεί να εγχυθεί σε μια public class CustomerSessionBean { public List<Name> getcustomernames() { //... Αυτό είναι ένα stateless session bean και έχει μια επιχειρηματική μέθοδο που επιστρέφει μια λίστα των ονομάτων των πελατών. σηματοδοτεί για έγχυση σε EL. Μπορεί να χρησιμοποιηθεί σε Facelets EL: <h:datatable value="#{customersessionbean.customernames" var="c"> Σελίδα 42 από 218

44 <h:column>#{c.value</h:column> </h:datatable> Σε αυτόν τον κώδικα, η λίστα με τα ονόματα των πελατών εμφανίζεται σε έναν πίνακα. Παρατηρήστε πως η getcustomernames μέθοδος είναι διαθέσιμη ως ιδιοκτησία της EL.H Facelets παρέχει επίσης compile-time επικύρωση της EL. Επιπλέον, η Facelets παρέχει ένα ισχυρό πρότυπο σύστημα που σας επιτρέπει να παρέχετε μια συνεπή εμφάνιση και αίσθηση σε πολλαπλές σελίδες μιας web εφαρμογής. Μια σελίδα βάση, που ονομάζεται template (πρότυπο), δημιουργείται μέσω Facelets πρότυπων ετικετών. Η σελίδα αυτή καθορίζει μια προεπιλεγμένη δομή για τη σελίδα, συμπεριλαμβανομένων placeholders για το περιεχόμενο που θα καθοριστεί μέσα από τις σελίδες χρησιμοποιώντας το πρότυπο. Ένα πρότυπο σελίδας πελάτη χρησιμοποιεί το πρότυπο και παρέχει πραγματικό περιεχόμενο για τους placeholders που ορίζεται στο πρότυπο. Μια σελίδα πρότυπο μοιάζει κάπως έτσι: <h:body> <div id="top"> <ui:insert name="top"> <h1>facelets are Cool!</h1> </ui:insert> </div> <div id="content" class="center_content"> </div> <ui:insert name="content">content</ui:insert> <div id="bottom"> <ui:insert name="bottom"> <center>powered by GlassFish</center> </ui:insert> </div> </h:body> Σελίδα 43 από 218

45 Σε αυτόν τον κώδικα, η σελίδα καθορίζει τη δομή χρησιμοποιώντας <div> και CSS (δεν φαίνεται εδώ). Το ui: insert καθορίζει το περιεχόμενο που αντικαθίσταται από ένα πρότυπο σελίδας πελάτη. Ένα πρότυπο σελίδας πελάτη μοιάζει: <html xmlns=" xmlns:ui=" xmlns:h=" <body> <ui:composition template="./template.xhtml"> <ui:define name="content"> <h:datatable value="#{customersessionbean.customernames" var="c"> <h:column>#{c.value</h:column> </h:datatable> </ui:define> </ui:composition> </body> </html> Σε αυτόν τον κώδικα, το ui: insert με top και bottom ονόματα δεν ορίζεται, οπότε τα τμήματα αυτά χρησιμοποιούνται από τη σελίδα. Υπάρχει ένα ui:define συστατικό με ένα όνομα που ταιριάζει στο ui:insert συστατικό του προτύπου, έτσι ώστε τα περιεχόμενα να αντικατασταθούν. 2.2 Χειρισμός των πόρων Η JSF ορίζει έναν πρότυπο τρόπο χειρισμού πόρων, όπως των εικόνων, του CSS, ή των JavaScript αρχείων. Οι πόροι αυτοί χρειάζονται από ένα συστατικό για να καταστούν κατάλληλοι.οι πόροι αυτοί μπορούν να συσκευάζονται στον κατάλογο /resourceς στην εφαρμογή web ή στο / META-INF/resources classpath. Οι πόροι αυτοί μπορεί επίσης να εντοπισθo;yn και να συλλέγονται σε βιβλιοθήκες. Ένας πόρος μπορεί να αναφέρεται σε EL: Σελίδα 44 από 218

46 <a href="#{resource['header.jpg']">click here</a> Σε αυτόν τον κώδικα, η header.jpg είναι συνδυασμένη στον πρότυπο κατάλογο resources.εάν ένας πόρος ομαδοποιείται σε μια βιβλιοθήκη corp (ένα φάκελο στη θέση όπου είναι οι πόροι συσκευασμέοι), τότε μπορείτε να έχετε πρόσβαση χρησιμοποιώντας το χαρακτηριστικό library: <h:graphicimage library="corp" name="header.jpg" /> Μπορεί να συμπεριλαμβάνεται και Javascript: <h:outputscript name="myscript.js" library="scripts" target="head"/> Σε αυτόν τον κώδικα, το MyScript.js είναι ένας πόρος JavaScript συσκευασμένος στον κατάλογο scripts στον πρότυπο κατάλογο resources. Ένα CSS stylesheet μπορεί να περιλαμβάνεται: <h:outputstylesheet name="mycss.css" library="css" /> 2.3 Composite Components Χρησιμοποιώντας τις δυνατότητες του Facelets και του χειρισμού των πόρων, η JSF ορίζει ένα σύνθετο συστατικό (composite component), ώς ένα συστατικό που αποτελείται από ένα ή περισσότερα συστατικά JSFπου ορίζονται σε ένα αρχείο σήμανσης Facelets. Αυτό το αρχείο. xhtml υπάρχει μέσα σε μια βιβλιοθήκη των πόρων. Αυτό σας επιτρέπει να δημιουργήσετε ένα επαναχρησιμοποιήσιμο συστατικό από μια αυθαίρετη περιοχή μιας σελίδας. Το σύνθετο συστατικό ορίζεται στην defining page και χρησιμοποιείται στην using page.η defining page καθορίζει τα μεταδεδομένα (ή παράμετρους) χρησιμοποιώντας <cc:interface> και η εφαρμογή χρησιμοποιώντας <cc: implementation>, όπου cc είναι το πρόθεμα για το / JSF / composite / namespace. Σελίδα 45 από 218

47 Μπορείτε να ορίσετε ένα σύνθετο συστατικό χρησιμοποιώντας JSF 1.2, επίσης, αλλά απαιτεί πολύ βαθύτερη κατανόηση του κύκλου ζωής της JSF και συγγραφής πολλαπλών αρχείων. Η JSF2 πραγματικά απλοποιεί τη συγγραφή των σύνθετων συστατικών, χρησιμοποιώντας μόνο ένα αρχείο XHTML. Ας πούμε ένα Facelet έχει τον παρακάτω κώδικα για να εμφανίσετε μια φόρμα σύνδεσης : <h:form> <h:panelgrid columns="3"> <h:outputtext value="name:" /> <h:inputtext value="#{user.name" id="name"/> <h:message for="name" style="color: red" /> <h:outputtext value="password:" /> <h:inputtext value="#{user.password" id="password"/> <h:message for="password" style="color: red" /> </h:panelgrid> <h:commandbutton actionlistener="#{userservice.register" id="loginbutton" action="status" value="submit"/> </h:form> Αυτός ο κωδικός καθιστά έναν πίνακα με δύο γραμμές και τρεις στήλες, όπως φαίνεται στο σχήμα: Η πρώτη στήλη εμφανίζει μια προτροπή για το πεδίο που πρέπει να εισαχθεί, η δεύτερη στήλη ένα πλαίσιο εισαγωγής κειμένου, όπου μπορούν να εισαχθούν τα δεδομένα και η τρίτη στήλη (η οποία είναι άδεια για να αρχίσετε), είναι για την εμφάνιση ενός μηνύματος για το αντίστοιχο πεδίο. Η πρώτη γραμμή συνδέει την Σελίδα 46 από 218

48 τιμή εισόδου στο πεδίο User.name, και η δεύτερη σειρά συνδέει την τιμή εισόδου στο πεδίο User.password. Υπάρχει επίσης ένα κουμπί εντολής και κάνοντας κλικ στο κουμπί επικαλείται τη μέθοδο register του UserService bean. Εάν αυτή η μορφή σύνδεσης εμφανίζεται σε πολλαπλές σελίδες, στη συνέχεια, αντί να επαναλάβει αυτόν τον κώδικα παντού, είναι καλό να μετατραπεί αυτό το τμήμα σε ένα σύνθετο συστατικό. Αυτό απαιτεί το κομμάτι κώδικα να αντιγραφεί σε ένα αρχείο.xhtml και το ίδιο το αρχείο να αντιγραφεί σε μια βιβλιοθήκη στον πρότυπο κατάλογο resources. Μέσω σύμβασης στη συνέχεια στο τμήμα αποδίδεται αυτόματα ένα namespace και το όνομα ετικέτας. Αν το κομμάτι που αναφέρθηκε νωρίτερα αντιγράφεται στο login.xhtml στον κατάλογο των resources / Mycomp, η defining σελίδα μοιάζει με: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " <html xmlns=" xmlns:cc=" xmlns:h=" <!-- INTERFACE --> <cc:interface> </cc:interface> <!-- IMPLEMENTATION --> <cc:implementation> <h:form> <h:panelgrid columns="3"> <h:outputtext value="name:" /> <h:inputtext value="#{user.name" id="name"/> <! > </h:form> </cc:implementation> </html> Σε αυτόν τον κώδικα, το cc:interface ορίζει τα μεταδεδομένα που περιγράφουν τα χαρακτηριστικά του συστατικού, όπως χαρακτηριστικά υποστήριξης, τις πτυχές και Σελίδα 47 από 218

49 τα σημεία προσαρμογής για τους ακροατές του γεγονότος. Το cc: implementation περιλαμβάνει τη σήμανση που αντικαθιστά το σύνθετο συστατικό. Το namespace του σύνθετου συστατικού κατασκευάζεται από τη συνένωση xmlns.jcp.org / JSF / composite / και Mycomp. Το όνομα της ετικέτας είναι το όνομα αρχείου, χωρίς την κατάληξη.xhtml στην σελίδα χρήσης: <html xmlns=" xmlns:mc=" <! > <mc:login/> </html> Ας πούμε ότι το κομμάτι κώδικα πρέπει να περάσει διαφορετικές εκφράσεις τιμών (αντί του # {user.name) και να επικαλείται μια διαφορετική μέθοδο (αντί του #{userservice.register) όταν το κουμπί υποβολής κλικάρεται σε μια διαφορετική using σελίδα. Η defining σελίδα μπορεί, στη συνέχεια, να περάσει τις τιμές: <!-- INTERFACE --> <cc:interface> <cc:attribute name="name"/> <cc:attribute name="password"/> <cc:attribute name="actionlistener" method-signature= "void action(javax.faces.event.event)" targets="ccform:loginbutton"/> </cc:interface> <!-- IMPLEMENTATION --> <cc:implementation> <h:form id="ccform"> <h:panelgrid columns="3"> <h:outputtext value="name:" /> <h:inputtext value="#{cc.attrs.name" id="name"/> <h:message for="name" style="color: red" /> <h:outputtext value="password:" /> <h:inputtext value="#{cc.attrs.password" Σελίδα 48 από 218

50 id="password"/> <h:message for="password" style="color: red" /> </h:panelgrid> <h:commandbutton id="loginbutton" action="status" value="submit"/> </h:form> </cc:implementation> Σε αυτόν τον κώδικα, όλες οι παράμετροι ορίζονται ρητά στο cc: interface για λόγους σαφήνειας. H τρίτη παράμετρος έχει μια ιδιότητα targets που αναφέρεται στο ccform: loginbutton. Στο cc: implementation: Η h: form έχει ένα χαρακτηριστικό id. Αυτό είναι απαραίτητο, έτσι ώστε το κουμπί μέσα στη φόρμα να μπορεί να αναφέρεται ρητά. Το h: inputtext χρησιμοποιεί τώρα #{cc.attrs.xxx αντί {# user.xxx. # {cc.attrs η οποπίαείναι μια προεπιλεγμένη EL έκφραση που είναι διαθέσιμη για συγγραφείς σύνθετων συστατικών και παρέχει πρόσβαση σε χαρακτηριστικά του τρέχοντος σύνθετου συστατικού. Στην περίπτωση αυτή,το # { cc.attrs έχει το όνομα και τον κωδικό πρόσβασης που ορίζονται ως χαρακτηριστικά. Ο ActionListener είναι ένα σημείο επαφής για έναν event listener. Ορίζεται ως ένα methodsignature και περιγράφει την υπογραφή της μεθόδου. Το h: CommandButton έχει ένα χαρακτηριστικό id έτσι ώστε να μπορεί να προσδιοριστεί με σαφήνεια στο πλαίσιο της h: form. Το user,password και actionlistener στη συνέχεια διαβιβάζονται ως απαιτούμενα χαρακτηριστικά στη using page: <ez:login name="#{user.name" password="#{user.password" actionlistener="#{userservice.register"/> Σελίδα 49 από 218

51 Τώρα, η using page μπορεί να περάσει διάφορα beans υποστήριξης και διαφορετικές επιχειρηματικές μεθόδους που μπορούν να επικαλεστούν όταν το κουμπί υποβολής έχει πατηθεί. Συνολικά, το σύνθετο συστατικό παρέχει τα ακόλουθα πλεονεκτήματα: Ακολουθεί το πρότυπο σχέδιο Don t Repeat Yourself (DRY) και σας επιτρέπει να κρατήσετε κώδικα που μπορεί να επαναληφθεί σε πολλαπλές θέσεις σε ένα ενιαίο αρχείο. Επιτρέπει στους προγραμματιστές να συγγράφουν νέα συστατικά χωρίς οποιοδήποτε κώδικα Java ή XML διαμόρφωση. 2.4 Αίτηση επεξεργασίας φάσεων κύκλου ζωής (Request Processing Life-Cycle Phases) Η JSF ορίζει φάσεις του κύκλου ζωής επεξεργασίας του αιτήματος. Οι προγραμματιστές εφαρμογών δεν πρέπει απαραίτητα να γνωρίζουν τις λεπτομέρειες του κύκλου ζωής, αλλά βοηθάει στο να ξέρουν πληροφορίες, όπως τις επικυρώσεις, τις μετατροπές και τα γεγονότα που αντιμετωπίζουν συνήθως και τι μπορούν να κάνουν για να αλλάξουν τον τρόπο και το πότε τα χειρίζονται. Μια σελίδα JSF παριστάται από ένα δέντρο των συστατικών UI και ονομάζεται view. Όταν ένας πελάτης κάνει αίτηση για τη σελίδα, ο κύκλος ζωής ξεκινά. Κατά τη διάρκεια του κύκλου ζωή, η JavaServer Faces εφαρμογή πρέπει να φτιάξει τη view, ενώ εξετάζει την κατάσταση που έσωσε από μια προηγούμενη υποβολής της σελίδας. Όταν ο πελάτης υποβάλει μια σελίδα, η JavaServer Faces εφαρμογή πρέπει να εκτελεί διάφορες λειτουργίες, όπως την επικύρωση της εισόδου των δεδομένων των στοιχείων στην view, τη μετατροπή των δεδομένων εισόδου σε τύπους που καθορίζονται από την πλευρά του server, και να δεσμεύσει δεδομένα στα backing beans. Η JavaServer Faces εφαρμογή εκτελεί όλα τα καθήκοντα αυτά ως μια σειρά από στάδια του κύκλου ζωής. Τα διάφορα συστατικά της εφαρμογής περνούν από τις ακόλουθες καθορισμένες φάσεις επεξεργασίας του κύκλου ζωής: Resτore view: Αποκαθιστά και δημιουργεί ένα server-side δέντρο συστατικό για να εκπροσωπεί τις UI πληροφορίες από έναν πελάτη. Σελίδα 50 από 218

52 Εάν η αίτηση γίνεται σε μια διεύθυνση URL για πρώτη φορά, στη συνέχεια, ένα νέο αντικείμενο View δημιουργείται και προσφέρεται στον πελάτη. Η view αυτή είναι επίσης αποθηκευμένη στη τρέχον FacesContext υπόδειξη. Εάν η κατάσταση προβολής βρίσκεται ήδη σε FacesContext, τότε αποκαθίσταται και εμφανίζεται. Κάθε συνηθισμένοι μετατροπείς, validators, renderers, εάν είναι συνδεδεμένοι για τα UI συστατικά, αποκαθίστανται σε αυτή τη φάση. Εάν οι τιμές συστατικών UI αντιστοιχιστούν απευθείας στην ιδιότητα που καθορίζεται σε ένα managed bean, τότε η τιμή για την ιδιότητα έχει αποκατασταθεί και συνδέεται με την view. Το μεγαλύτερο μέρος της εργασίας γίνεται από την μέθοδο ViewHandler.re storeview. Apply request values: Η φάση αυτή ανανεώνει τα server-side συστατικά με παραμέτρους αίτησης, κεφαλίδες, cookies και ούτω καθεξής από τον πελάτη. Ειδικότερα, η μέθοδος UIComponent.processDecodes καλείται σε όλα τα συστατικά. Το αποτέλεσμα αυτής της φάσης μπορεί να καταλήξει στη φάση process validations ή στη φάση render response. Εάν κάποια από τις μετατροπές ή οι επικυρώσεις αποτύχει, τότε η τρέχουσα επεξεργασία τερματίζεται και ο έλεγχος πηγαίνει απευθείας στη render response για την απόδοση της μετατροπής ή τα σφάλματα επικύρωσης για τον πελάτη. Process validations: Η φάση αυτή θα επεξεργαστεί τις επικυρώσεις και τις μετατροπές τύπου δεδομένων που έχουν ρυθμιστεί για τα UIComponents. Σε αυτή τη φάση, η μέθοδος UIComponent.processValidators καλείται σε όλα τα συστατικά. Εάν κάποιο σφάλμα μετατροπής ή επικύρωση συμβαίνει εδώ, τότε η τρέχουσα διαδικασία τερματίζεται και ο έλεγχος κατευθύνεται στη φάση render response για την αναφορά τυχόν λαθών. Update model values: Η επίτευξη αυτού του σταδίου σημαίνει ότι οι τιμές αιτήματος είναι συντακτικά έγκυρες. Οι τιμές από UIComponents συγχρονίζονται με τα αντικείμενα υποδείγματα, τα οποία είναι συνήθως backing beans. Σε αυτή τη φάση, η μέθοδος UIComponent.processUpdates καλείται από όλα τα συστατικά. Η ρύθμιση της τιμής αίτησης στο μοντέλο αντικειμένου μπορεί επίσης να οδηγήσει τα γεγονότα να βρίσκονται σε σειρά αναμονής και να πυροδοτούνται. Σελίδα 51 από 218

53 Invoke applications: Επικαλείται τη λογική της εφαρμογής και εκτελεί την επεξεργασία πλοήγησης. Καλούνται όλοι οι listeners που έχουν καταχωρηθεί για τα UIComponents. Για παράδειγμα, όλα τα στοιχεία δράσης, όπως το κουμπί εντολής ή της υπερσύνδεσης, διαθέτουν προεπιλεγμένους action listeners που καλούνται σε αυτή τη φάση. Render response: Αποδίδει την απάντηση πίσω στην εφαρμογή πελάτη. Πριν από την απόδοση της απάντησης, η εφαρμογή αποθηκεύει την κατάσταση του χρήστη στη μνήμη cache καλώντας τη μέθοδο UIViewRoot.saveState. 2.5 Ajax Η JSF προσφέρει υποστήριξη για την προσθήκη δυνατοτήτων Ajax σε ιστοσελίδες. Επιτρέπει partial view processing, όπου μόνο μερικά συστατικά από την view χρησιμοποιούνται για την επεξεργασία της απόκρισης. Επίσης, επιτρέπει partial page rendering, όπου αποδίδονται επιλεγμένα συστατικά από τη σελίδα. Υπάρχουν δύο τρόποι που αυτή η υποστήριξη μπορεί να ενεργοποιηθεί: Με χρήση προγραμματισμού JavaScript πόρων Χρησιμοποιώντας f: ajax Η προγραμματική ολοκλήρωση Ajax έχει ενεργοποιηθεί μέσω του μηχανισμού χειρισμού των πόρων. Η jsf.js είναι μια προκαθορισμένη πηγή στη βιβλιοθήκη javax.faces. Αυτός ο πόρος περιέχει το JavaScript API που διευκολύνει την Ajax αλληλεπίδραση με τις σελίδες JSF. Μπορείτε να το κάνετε διαθέσιμο στις σελίδες που χρησιμοποιούν την ετικέτα outputscript: <h:body> <! > <h:outputscript name="jsf.js" library="javax.faces" target="body"/> <! > </h:body> Σελίδα 52 από 218

54 Μπορείτε επίσης να κάνετε μια ασύγχρονη αίτηση στο διακομιστή: <h:form prependid="false"> <h:inputtext value="#{user.name" id="name"/> <h:inputtext value="#{user.password" id="password"/> <h:commandbutton value="login" type="button" actionlistener="#{user.login" onclick="jsf.ajax.request(this, event, {execute: 'name password', render: 'status'); return false;"/> <h:outputtext value="#{user.status" id="status"/> </h:form> Σε αυτόν τον κώδικα : Δύο πεδία εισαγωγής κειμένου αποδέχονται το όνομα χρήστη και τον κωδικό πρόσβασης και το τρίτο πεδίο εξόδου εμφανίζει την κατάσταση (αν ο χρήστης είναι συνδεδεμένος ή όχι). Το έντυπο έχει prependid ορισμένο σε false για να διασφαλιστεί ότι η ταυτότητα του κάθε στοιχείου διατηρείται όπως αναφέρεται στο έντυπο. Σε αντίθετη περίπτωση, η JSF τοποθετεί μπροστά το id της φόρμας από το id των παιδιών της. Το πλήκτρο εντολής έχει ένα ActionListener να προσδιορίζει την μέθοδο στο backing bean που επικαλείται, όταν το κουμπί πατηθεί. Αντί της συνήθους απόκρισης απόδοσης και εμφάνισης μιας διαφορετικής σελίδας,το jsf.ajax.request στέλνει μια ασύγχρονη αίτηση στον server. Αυτή η αίτηση γίνεται με το κουμπί εντολής στο γεγονός click. Η execute και η render παρέχουν έναν χώρο αναγνωριστικών των συστατικών. Η execute είναι η λίστα των στοιχείων εισόδου αυτών που επικαλούνται τα beans και render είναι η λίστα των συστατικών που πρέπει να αποδίδονται μετά την ασύγχρονηλήψη της απάντησης. Η ικανότητα να επεξεργάζονται μόνο μέρος της view (όνομα και κωδικό πρόσβασης σε αυτή την περίπτωση) αναφέρεται ως partial view processing. Ομοίως, απόδίδοντας μόνο μέρος της σελίδα εξόδου (το συστατικό κατάστασης στην προκειμένη περίπτωση) αναφερόμαστε σε partial output rendering. Σελίδα 53 από 218

55 Πίνακας 2: Ο πίνακας παραθέτει τις πιθανές τιμές του χαρακτηριστικού render Το χαρακτηριστικό execute λαμβάνει ένα παρόμοιο σύνολο τιμών, αλλά η προεπιλεγμένη τιμή για το execute χαρακτηριστικό Το User bean έχει πεδία, setters / getters και μια απλή public class User implements Serializable { private String name; private String password; private String status; public void login(actionevent evt) { if (name.equals(password)) status = "Login successful"; else status = "Login failed"; Η ολοκλήρωση του Ajax ενεργοποιείται μέσω της f: ajax. Αυτή η ετικέτα μπορεί να είναι ένθετη σε ένα ενιαίο συστατικό (επιτρέποντας Ajax για ένα μόνο συστατικό), ή μπορεί να είναι "τυλιγμένη" γύρω από πολλαπλά συστατικά (που επιτρέπει Ajax για πολλά συστατικά). Ο παραπάνω κώδικας μπορεί να ενημερωθεί για να χρησιμοποιήσετε αυτό το στυλ του Ajax: Σελίδα 54 από 218

56 <h:form prependid="false"> <h:inputtext value="#{user.name" id="name"/> <h:inputtext value="#{user.password" id="password"/> <h:commandbutton value="login" type="button" actionlistener="#{user.login"> <f:ajax execute="name password" render="status"/> </h:commandbutton> <h:outputtext value="#{user.status" </h:form> id="status"/> Σε αυτόν τον κώδικα, χρησιμοποιούμε την f: ajax για να καθορίσουμε τη λίστα των στοιχείων εισόδου χρησιμοποιώντας το execute χαρακτηριστικό και τα στοιχεία εξόδου που πρόκειται να αποδοθούν χρησιμοποιώντας το χαρακτηριστικό render. Από προεπιλογή, αν η f: ajax είναι τοποθετημένη μέσα σε ένα μόνο συστατικό και κανένα γεγονός δεν έχει καθοριστεί, η ασύγχρονη αίτηση πυροδοτείται με βάση το προεπιλεγμένο συμβάν για το μητρικό συστατικό (το on click γεγονός, στην περίπτωση ενός κουμπιού εντολής). Ένα χαρακτηριστικό deleay μπορεί να ορισθεί για την ετικέτα f: ajax. Το χαρακτηριστικό αυτό παίρνει μια τιμή σε χιλιοστά του δευτερολέπτου. Αν οι πολλαπλές αιτήσεις εκδόθηκαν πριν από την παρέλευση του χρόνου delay, τότε μόνο η πιο πρόσφατη αίτηση αποστέλλεται και όλες οι άλλες απορρίπτονται. <f:ajax delay="200"...>... </f:ajax> Αυτό το κομμάτι κώδικα ορίζει την καθυστέρηση σε 200 χιλιοστά του δευτερολέπτου. Η προεπιλεγμένη τιμή είναι 300 χιλιοστά του δευτερολέπτου, αλλά θα Σελίδα 55 από 218

57 μπορούσατε επίσης να καθορίσετε την ειδική τιμή του κενού και να απενεργοποιήσετε το μηχανισμό αυτό. Η f: ajax ετικέτα μπορεί να τυλιχτεί γύρω από πολλαπλά συστατικά: <f:ajax listener="#{user.checkformat"> <h:inputtext value="#{user.name" id="name"/> <h:inputtext value="#{user.password" id="password"/> </f:ajax> Σε αυτόν τον κώδικα, η f: ajax έχει ένα χαρακτηριστικό listener και την αντίστοιχη Java μέθοδο: public void checkformat(ajaxbehaviorevent evt) { //... Γίνεται επίκληση της μεθόδου listener για το προεπιλεγμένο συμβάν για τα συστατικά του παιδιού ( το value h:change γεγονός για την h: inputtext, σε αυτήν την περίπτωση). Μπορείτε να καθορίσετε πρόσθετη Ajax λειτουργικότητα σχετικά με τα συστατικά των παιδιών χρησιμοποιώντας μια ένθετη f: ajax. 2.6 HTTP GET Η JSF παρέχει υποστήριξη για τον καθορισμό URL παραμέτρων σε HTTP GET αιτήσεις σε μια EL. Επίσης, παρέχει υποστήριξη για τη δημιουργία GET-friendly URLs. Οι View παράμετροι μπορούν να χρησιμοποιηθούν για τον καθορισμό των παραμέτρων URL για αιτήσεις GET σε EL. Αυτό μπορείτε να το κάνετε προσθέτοντας το ακόλουθο κομμάτι σε μια σελίδα Facelets: <f:metadata> <f:viewparam name="name" value="#{user.name"/> </f:metadata> Η πρόσβαση μιας web εφαρμογής στο index.xhtml?name=jack θα κάνει τα εξής: Θα πάρει την παράμετρο του αίτηματος με το όνομα name. Σελίδα 56 από 218

58 Θα μετατρέψει και θα επικυρώσει αν είναι απαραίτητο. Αυτό επιτυγχάνεται με τη χρήση ενός ένθετου f:validator ακριβώς όπως και με κάθε h:inputtext και μπορεί να γίνει όπως φαίνεται: <f:metadata> <f:viewparam name="name" value="#{user.name"> <f:validatelength minimum="1" maximum="5"/> </f:viewparam> </f:metadata> Αν είναι επιτυχής, θα συνδεθεί με το #{user.name. Μπορείτε να επεξεργαστείτε μετά τις παραμέτρους view πριν την απόδοση της σελίδας χρησιμοποιώντας την f:event: <f:metadata> <f:viewparam name="name" value="#{user.name"> <f:validatelength minimum="1" maximum="5"/> </f:viewparam> <f:event type="prerenderview" listener="#{user.process"/> </f:metadata> Σε αυτόν τον κώδικα, η μέθοδος που προσδιορίζεται από #{user.process μπορεί να χρησιμοποιηθεί για να εκτελέσετε οποιαδήποτε αρχικοποίηση απαιτείται πριν από την απόδοση της σελίδας. Μπορείτε να δημιουργήσετε GET-friendly URLs χρησιμοποιώντας h:link και h: button. Μπορείτε να καθορίσετε την επιθυμητή σελίδα Facelets αντί της κατασκευής του URL: <h:link value="login" outcome="login"/> Αυτό μεταφράζεται στην ακόλουθη ετικέτα HTML: <a href=".../faces/login.xhtml">login</a> Οι View παράμετροι μπορούν να προσδιορίζονται εύκολα: <h:link value="login" outcome="login"> <f:param name="name" value="#{user.name"/> </h:link> Σελίδα 57 από 218

59 Σε αυτόν τον κώδικα, αν η #{ user.name είναι προορισμένη για "Jack", τότε αυτό το κομμάτι μεταφράζεται στην ακόλουθη ετικέτα HTML: <a href=".../faces/login.xhtml?name=jack">login</a> Ομοίως, η h:button μπορεί να χρησιμοποιηθεί για να διευκρινίσει το αποτέλεσμα: <h:button value="login"/> Ο κώδικας αυτός θα δημιουργήσει την ακόλουθη ετικέτα HTML: <input type="button" onclick="window.location.href='/jsfsample/faces/index.xhtml'; return false;" value="login" /> 2.7 Server and Client extension points Οι converters, οι validators και οι listeners είναι server-side προσαρτημένα αντικείμενα που προσθέτουν περισσότερη λειτουργικότητα για τα συστατικά σε μια σελίδα. Ένας converter μετατρέπει τα δεδομένα που έχουν εισαχθεί σε ένα στοιχείο από μια μορφή σε άλλη (π.χ., string σε number). Η JSF προσφέρει πολλούς ενσωματωμένους μετατροπείς όπως f:convertnumber και f:convertdatetime. Μπορούν να εφαρμοστούν σε οποιοδήποτε επεξεργάσιμο στοιχείο: <h:form> Age: <h:inputtext value="#{user.age" id="age"> <f:convertnumber integeronly="true"/> </h:inputtext> <h:commandbutton value="submit"/> </h:form> Σε αυτόν τον κώδικα, το κείμενο που εισάγεται στο πλαίσιο κειμένου θα μετατραπεί σε έναν ακέραιο αριθμό, εάν είναι δυνατόν. Ένα μήνυμα λάθους ρίχνεται αν το κείμενο δεν μπορεί να μετατραπεί. Ένας μετατροπέας μπορεί εύκολα να δημιουργηθεί: Σελίδα 58 από 218

60 @FacesConverter("myConverter") public class MyConverter implements Converter public Object getasobject( FacesContext context, UIComponent component, String value) { public String getasstring( FacesContext context, UIComponent component, Object value) { //... Σε αυτόν τον κώδικα, οι μέθοδοι getasobject και getasstring εκτελούν object to string και string to object μετατροπές μεταξύ των δεδομένων των αντικειμένων και μιας αναπαράστασης συμβολοσειράς αυτών των αντικείμενων που είναι κατάλληλα για την απόδοση. Το POJO υλοποιεί το περιβάλλον Converter και χαρακτηρίζεται επίσης Αυτός ο μετατροπέας μπορεί στη συνέχεια να χρησιμοποιηθεί σε μια JSF σελίδα: <h:inputtext value="#{user.age" id="age"> <f:converter converterid="myconverter"/> </h:inputtext> Το χαρακτηριστικό value πρέπει να συμφωνεί με την τιμή του converterid χαρακτηριστικού. Ένας validator χρησιμοποιείται για την επικύρωση των δεδομένων που λαμβάνονται από τα στοιχεία εισόδου. Η JSF παρέχει πολλούς ενσωματωμένους Σελίδα 59 από 218

61 validators όπως f:validatelength και f:validatedoublerange. Αυτοί οι validators μπορούν να εφαρμοστούν σε οποιοδήποτε επεξεργάσιμο συστατικό: <h:inputtext value="#{user.name" id="name"> <f:validatelength min="1" maximum="10"/> </h:inputtext> Σε αυτόν τον κώδικα, το μήκος του κειμένου που έχετε εισάγει επικυρώνεται να είναι μεταξύ 1 και 10 χαρακτήρων. Ένα μήνυμα λάθους ρίχνεται αν το μήκος είναι εκτός της καθορισμένης περιοχής. Ένας συνηθισμένος validator μπορεί εύκολα να public class NameValidator implements Validator public void validate( FacesContext context, UIComponent component, Object value) throws ValidatorException { //... Σε αυτόν τον κώδικα, η μέθοδος validate επιστρέφει εάν η τιμή επικυρωθεί με επιτυχία. Διαφορετικά ρίχνεται ένα ValidatorException. Αυτός ο validator μπορεί να εφαρμοστεί σε οποιοδήποτε επεξεργάσιμο συστατικό: <h:inputtext value="#{user.name" id="name"> <f:validator id="namevalidator"/> </h:inputtext> Το χαρακτηριστικό value πρέπει να συμφωνεί με την τιμή της id χαρακτηριστικό του f:validator. Ένας listener ακούει τα γεγονότα σε ένα συστατικό. Ένα γεγονός μπορεί να είναι μια μεταβολή της τιμής, με ένα κλικ ενός κουμπιού, ένα κλικ σε ένα σύνδεσμο ή Σελίδα 60 από 218

62 κάτι άλλο. Ένας listener μπορεί να είναι μια μέθοδος σε ένα managed bean ή μια κατηγορία από μόνη της. Ένας ValueChangeListener μπορεί να καταχωρηθεί σε οποιοδήποτε επεξεργάσιμο στοιχείο: <h:inputtext value="#{user.age" id="age" valuechangelistener="#{user.nameupdated"> Σε αυτόν τον κώδικα, η μέθοδος nameupdated στο bean χρήστη καλείται όταν υποβάλλεται η συνδεδεμένη φόρμα. Μπορείτε να δημιουργήσετε έναν listener class-level με την εφαρμογή της ValueChan gelistener interface και να τον καθορίσετε στη σελίδα χρησιμοποιώντας την ετικέτα f: valuechangelistener. 2.8 Επικύρωση δεδομένων Εκτός από τη χρήση ενσωματωμένων και τη δημιουργία προσαρμοσμένων JSF validators, μπορείτε να καθορίσετε περιορισμούς σε ένα backing bean χρησιμοποιώντας bean validation. Σκεφτείτε μια απλή web εφαρμογή που έχει μια σελίδα με διάφορα πεδία κειμένου μέσα σε μια φόρμα: <h:form> Name: <h:inputtext value="#{mybean.name"/> Age: <h:inputtext value="#{mybean.age"/> Zip: <h:inputtext value="#{mybean.zip"/> <h:commandbutton value="submit"/> </h:form> Ας υποθέσουμε ότι κάθε πεδίο κειμένου είναι συνδεδεμένο με μια ιδιότητα του managed bean που έχει τουλάχιστον έναν περιορισμό bean validator σχολιασμού που επισυνάπτεται public class MyBean implements Serializable = 3, message = "At least 3 characters") private String name; Σελίδα 61 από 218

63 private int = "[0-9]{5") private String zip; //... Κάθε h:inputtext συτσατικό που υποστηρίζεται από ένα συστατικό UIInput έχει μια παρουσία του Validator με javax.faces.bean id που επισυνάπτεται σε αυτό. Η μέθοδος validate αυτού του Validator καλείται για καθορισμένους περιορισμούς επικύρωσης από τον χρήστη κατά τη διάρκεια της φάσης process validations. 2.9 Κανόνες πλοήγησης Η JSF ορίζει έμμεσους και άμεσους κανόνες πλοήγησης. Οι σιωπηροί κανόνες πλοήγησης ψάχνουν για την έκβαση μιας δράσης (π.χ., ένα κλικ σε ένα σύνδεσμο ή ένα κουμπί). Εάν βρεθεί μια σελίδα Facelets να ταιριάζει με την έκβαση της δράσης, αυτή η σελίδα γίνεται στη συνέχεια μετάφραση: <h:commandbutton action="login" value="login"/> Σε αυτόν τον κώδικα, κάνοντας κλικ στο κουμπί θα τοποθετήσετε το login.xhtml της σελίδας στον ίδιο κατάλογο. Μπορείτε να καθορίσετε πλοήγηση με τη χρήση <navigation-rule> στα faces-config.xml, και μπορείτε να καθορίσετε όρους πλοήγησης με τη χρήση <if>: <navigation-rule> <from-view-id>/index.xhtml</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/login.xhtml</to-view-id> <if>#{user.ispremium</if> </navigation-case> </navigation-rule> Σελίδα 62 από 218

64 Σε αυτόν τον κώδικα, η πλοήγηση της σελίδας από το index.xhtml στο login.xhtml εμφανίζεται μόνο εάν ο χρήστης είναι ένας premium πελάτης Faces Flow Η JSF 2.2 εισάγει τη Faces Flow. Αυτό το χαρακτηριστικό δανείζεται από βασικές έννοιες ADF Task Flows,Spring Web Flow, και Apache MyFaces CODI για να παρέχει μια σπονδυλωτή προσέγγιση για τον καθορισμό της ροής ελέγχου σε μια εφαρμογή και να τη τυποποιεί ως μέρος του JSF 2.2. Η Faces Flow παρέχει έναν εγκλεισμό σχετικών ιστοσελίδων και των αντίστοιχων backing beans ως μια μονάδα.στη μονάδα αυτή έχουν δημιουργηθεί από τον προγραμματιστή της εφαρμογής καθορισμένα σημεία εισόδου και εξόδου. Συνήθως τα αντικείμενα σε μια faces flow έχουν σχεδιαστεί για να επιτρέπουν στο χρήστη να ολοκληρώσει μια εργασία που απαιτεί την εισαγωγή σε μια σειρά διαφορετικων views. Η εφαρμογή έτσι γίνεται μια συλλογή των flows και όχι μόνο των views. Φανταστείτε ένα πολυσέλιδο καλάθι αγορών με μια σελίδα για την επιλογή των προϊόντων, μια δεύτερη σελίδα για τις επιλογές αποστολής, μια τρίτη σελίδα για την εισαγωγή των στοιχείων της πιστωτικής κάρτας, και μια τέταρτη σελίδα για την επιβεβαίωση της παραγγελίας. Μπορείτε να χρησιμοποιήσετε τα managed beans για να συλλάβουν τα δεδομένα, τις μεταβλητές πεδίου συνεδρίας για να περάσει τις πληροφορίες μεταξύ των σελίδων, το κουμπί κλικ για να επικαλεστεί την επιχειρηματική λογική στα backing EJBs και (υπό όρους) κανόνες πλοήγησης για να μεταβείτε από τη μία σελίδα στην άλλη. Υπάρχουν μερικά προβλήματα με την προσέγγιση αυτή: Η ροή της ακολουθίας θα είναι τυπικά μέρος μιας μεγαλύτερης εφαρμογής. Η εφαρμογή αυτή, συνήθως με πολλές σελίδες, είναι μία μεγάλη ροή και οτιδήποτε έχει παγκόσμια προβολή χωρίς λογική κατάτμηση. Η ροή των σελίδων ή views δεν μπορεί να ενθυλακώνεται σαν μια λογική μονάδα και ως εκ τούτου δεν μπορεί να επαναχρησιμοποιηθεί, δηλαδή, να ενσωματωθεί σε μια άλλη μεγαλύτερη εφαρμογή ή ροή εύκολα. Σελίδα 63 από 218

65 Η ίδια ροή δεν μπορεί να ανοίξει σε πολλαπλά παράθυρα, επειδή οι session scoped μεταβλητές χρησιμοποιούνται για να περάσουν τις πληροφορίες μεταξύ των σελίδων. Το CDI ορίζει αλλά αυτό είναι μόνο μερος της λύσης. Ένα request based πεδίο είναι για ένα συγκεκριμένο αίτημα. Ένα πεδίο session based είναι περισσότερο από ένα πεδίο αίτησης, αλλά καθίσταται άκυρο μετά από το κλείσιμο του προγράμματος περιήγησης. Χρειαζόμαστε ένα πεδίο κάτι στο μεταξύ που μπορεί να εκτείνεται σε πολλές σελίδες ανά αίτηση της λογικής της εφαρμογής. Αυτό είναι ό, τι λείπει. Το χαμηλότερο λογικό διακριτό είναι μια σελίδα. Ο μόνος τρόπος για να επικαλεστεί τη λογική της εφαρμογής είναι να τη συνδέσει με ένα συστατικό UI που θα ενεργοποιηθεί από το χρήστη σε μια σελίδα. Η επιχειρηματική λογική δεν μπορεί να κληθεί χωρίς καμία ενέργεια από το χρήστη που θα την ξεκινήσει. Οι Faces Flow παρέχουν μια λύση για αυτά τα προβλήματα: Η εφαρμογή χωρίζεται σε μια σειρά από modular ροές που μπορούν να καλούν η μια την άλλη. Η ροή των σελίδων μπορεί να συσκευάζεται σαν μονάδα που μπορεί να επαναχρησιμοποιηθεί εντός της ίδιας ή μιας εντελώς διαφορετικής εφαρμογής. Κοινό πεδίο μνήμης (για παράδειγμα, το πεδίο εφαρμογής ροής) επιτρέπει στα δεδομένα να περάσουν ανάμεσα από views στο πλαίσιο της ροής εργασιών. Ένα νέο πεδίο CDI, μπορεί να καθοριστεί σε ένα bean. Αυτό επιτρέπει την αυτόματη ενεργοποίηση / αδρανοποίηση του bean όσο το πεδίο εγγράφεται / εξέρχεται. Μπορεί να γίνει επίκληση της επιχειρηματικής λογικής από οπουδήποτε στη σελίδα με βάση τον ορισμό της ροής. Η ροή της εφαρμογής δεν περιορίζεται πλέον στο να ρέει μεταξύ των σελίδων, αλλά αντ' αυτού ορίζεται ως ροή μεταξύ «κόμβων». Υπάρχουν πέντε διαφορετικά είδη κόμβων: View: Κάθε JSF σελίδα στην εφαρμογή. Method call: Επικαλείται τη λογική της εφαρμογής από το γράφημα ροής μέσω EL. Σελίδα 64 από 218

66 Switch Αποφάσεις πλοήγησης στο διάγραμμα ροής με βάση Boolean EL. Flow call: Καλεί άλλη ροή με παραμέτρους και λαμβάνει τιμές επιστροφής. Flow return: Επιστρέφη στην ροή κλήσης. Αυτοί οι κόμβοι καθορίζουν τα σημεία εισόδου και εξόδου της ροής. Το νεοεισαχθέν πεδίο ορίζει το πεδίο εφαρμογής του bean στην καθορισμένη ροή. Αυτό επιτρέπει την αυτόματη ενεργοποίηση/παθητικοποίηση του bean, όταν το πεδίο είναι entered / public class MyFlow1Bean { String address; String creditcard; //... Σε αυτόν τον κώδικα, το bean έχει δύο flow scoped μεταβλητές: address και creditcard. Το bean ορίζεται για τη ροή flow1. Ένα νέο αντικείμενο EL για την απόθήκευση της ροής, #{ flowscope, επίσης εισάγεται. Αυτό χαρτογραφείται στο facescontext.getapplication (). getflowhandler().getcurrentflowscope(): value: <h:inputtext id="input" value="#{flowscope.value" /> Σε αυτόν τον κώδικα, η τιμή που εισάγεται στο πλαίσιο κειμένου είναι συνδεδεμένη στο #{flowscope.value. Αυτή η EL έκφραση μπορεί να χρησιμοποιηθεί σε άλλες σελίδες στη ροή για την πρόσβαση της τιμής. Μπορείτε να ορίσετε ροές χρησιμοποιώντας <flow-definition> ή μέσω προγραμματισμού, χρησιμοποιώντας FlowBuilder API. Οι δύο μηχανισμοί είναι αμοιβαία α- πόκλειστικοί. Ροές μπορούν να συσκευάζονται σε αρχεία JAR ή σε καταλόγους. Στη συσκευασία JAR οι ροές πρέπει να είναι δηλωμένες στην META-INF/faces-config.xml στο αρχείο JAR. Οι κόμβοι ροής συσκευάζονται σε META-INF/flows / <flowname> όπου <flowname> είναι μια καταχώρηση καταλόγου JAR του οποίου η ονομασία αυτή είναι ταυτόσημη με εκείνη μιας id ροής στις αντίστοιχες FlowDefinition κλά- Σελίδα 65 από 218

67 σεις. Αν bean και μια ροή που ορίζεται μέσω FlowBuilder συσκευάζονται στο αρχείο JAR, πρέπει να συνοδεύονται από META-INF/beans.xml: META-INF/faces-config.xml META-INF/flows/flow1/entry.xhtml META-INF/flows/flow1/next.xhtml META-INF/flows/flow1/end.xhtml META-INF/flows/flow2/start.xhtml META-INF/flows/flow2/next.xhtml META-INF/flows/flow2/end.xhtml META-INF/beans.xml org/glassfish/sample/myflow1bean.class org/glassfish/sample/myflow2bean.class org/glassfish/sample/myflow1defintion.class org/glassfish/sample/myflow2defintion.class Σε αυτό το πακέτο JAR: Υπάρχουν δύο ροές, flow1 και flow2. Το META-INF/beans.xml απαιτείται για την ενεργοποίηση CDI. Μπορεί να ενεργοποιηθεί αν bean-definigg σχόλια χρησιμοποιούνται στο αρχείο. MyFlow1Bean και MyFlow2Bean είναι τα beans flow-scoped. Αυτά τα beans χρησιμοποιούνται για να αποθηκεύουν τα flow-local δεδομένα. MyFlow1Definition ορίζει τα σημεία εισόδου και εξόδου της ροής, την εισερχόμενη παράμετρο το όνομα και την τιμή που προέρχεται από άλλη ροή, την εξερχόμενη παράμετρο το όνομα και την τιμή για άλλη ροή και την πλοήγηση σε άλλους κόμβους: public class public Flow defineflow(@flowbuilderparameter FlowBuilder flowbuilder) { String flowid = "flow1"; flowbuilder.id("unique", flowid); flowbuilder.viewnode(flowid, "/" + flowid + "/" + flowid + ".xhtml").markasstartnode(); flowbuilder.returnnode("gohome"). Σελίδα 66 από 218

68 fromoutcome("#{flow1bean.homevalue"); flowbuilder.inboundparameter("param1fromflow2", "#{flowscope.param1value"); flowbuilder.flowcallnode("call2").flowreference("", "flow2"). outboundparameter("param1fromflow1", "param1 flow1 value"); return flowbuilder.getflow(); Σε αυτόν τον κώδικα : -Η Flow ορίζεται μέσω του παραγωγού CDI. είναι ένα class level σχόλιο που καθορίζει τη ροή με το Flow Builder API. -Ένα στιγμιότυπο FlowBuilder εγχύεται ως παράμετρος μέσω και χρησιμοποιείται για να καθορίσει τη ροή. -Η Flow1 ορίζεται ως αναγνωριστικό ροής και το flow1.xhtml χαρακτηρίζεται ως το σημείο του κόμβου εκκίνησης. -Η μέθοδος returnnode χρησιμοποιείται για να καθορίσει ένα σημείο εξόδου από τη ροή. Σε αυτή την περίπτωση, η ροή κατευθύνεται προς το / Index για τη gohome δράση. Η τιμή του κόμβου καθορίζεται ως έκφραση EL. -Οι Named εισερχόμενες παράμετροι ονομάζονται παράμετροι από μια άλλη ροή και ορίζονται μέσω της μεθόδου inboundparameter. -Η FlowCallNode μέθοδος χρησιμοποιείται για να καθορίσει ένα σημείο εξόδου από τη ροή. Στην περίπτωση αυτή,η ροή ονομάζεται flow. Μια παράμετρος που ονομάζεται εξερχόμενη και η τιμή της έχουν ρυθμιστεί μέσω της μεθόδου outboundparameter. Ομοίως η MyFlow2Definition κλάση ορίζει τη flow2. Σελίδα 67 από 218

69 2.11 Συμβάσεις Βιβλιοθήκης Πόρων Η JSF 2 εισήγαγε τα Facelets ως προεπιλεγμένη View Declaration Language.Τα Facelets σας επιτρέπουν να δημιουργήσετε πρότυπα χρησιμοποιώντας XHTML και CSS που μπορούν στη συνέχεια να χρησιμοποιηθούν για να παρέχουν μια συνεπή εμφάνιση και αίσθηση σε διαφορετικές σελίδες της εφαρμογής. Η JSF 2.2 ορίζει τη Resource Library Contracts, μια βιβλιοθήκη των προτύπων και των σχετικών πόρων που μπορούν να εφαρμοστούν σε μια ολόκληρη εφαρμογή με ένα επαναχρησιμοποιήσιμο και εναλλάξιμο τρόπο. Συμβάσεις βιβλιοθήκης των πόρων υπάρχουν στον κατάλογο contacts της ρίζας της web εφαρμογής: index.xhtml new/index.xhtml contracts/blue/layout.css contracts/blue/template.xhtml contracts/blue/footer.png contracts/red contracts/red/layout.css contracts/red/template.xhtml contracts/red/logo.png WEB-INF/faces-config.xml Σε αυτόν τον κώδικα : Η εφαρμογή έχει δύο σελίδες : index.xhtml και new /index.xhtml. Αυτές είναι οι σελίδες πρότυπο πελάτη. Όλες οι συμβάσεις βρίσκονται στο κατάλογο των contracts του WAR. Όλα τα πρότυπα και οι πόροι για μια σύμβαση είναι στο δικό τους κατάλογο. Για παράδειγμα, η δομή που προηγείται έχει δύο καθορισμένες συμβάσεις, blue και red. Κάθε σύμβαση έχει ένα αρχείο template.xhtml, ένα CSS και μια εικόνα. Κάθε πρότυπο ονομάζεται ως declared πρότυπο. Στο πρότυπο, συνιστάται να ανατρέξετε στην stylesheets χρησιμοποιώντας h:outputstylesheet. Το αρχείο template.xhtml έχει <ui:insert> ετικέτες που ονομάζονται ως declared insertion points. Σελίδα 68 από 218

70 Οι CSS, οι εικόνες και άλλοι πόροι ομαδοποιούνται στον κατάλογο declared resources. Το δηλωθέν πρότυπο, τα δηλωθέντα σημεία εισαγωγής και οι δηλωθέν πόροι από κοινού καθορίζουν τη σύμβαση βιβλιοθήκης των πόρων. Ένας πελάτης πρότυπο πρέπει να γνωρίζει την τιμή και των τριών για να χρησιμοποιήσει τη σύμβαση. Οι σελίδες πελάτη θα χρησιμοποιήσουν τη σύμβαση με αναφορά στο πρότυπο : <ui:composition template="/template.xhtml"> <ui:define name="content"> </ui:define> </ui:composition> Το WEB-INF/faces-config.xml καθορίζει τη χρήση της σύμβασης: <application> <resource-library-contracts> <contract-mapping> <url-pattern>/new/*</url-pattern> <contracts>blue</contracts> </contract-mapping> <contract-mapping> <url-pattern>*</url-pattern> <contracts>red</contracts> </contract-mapping> </resource-library-contracts> </application> Μια σύμβαση εφαρμόζεται με βάση το μοτίβο διεύθυνσης URL που επικαλείται. Με βάση τη διαμόρφωση που ορίζεται εδώ, η red σύμβαση θα εφαρμόζεται στο faces / index.xhtml και η blue σύμβαση θα εφαρμόζεται στο faces / new / index.xhtml. Σελίδα 69 από 218

71 Οι συμβάσεις μπορούν να συσκευαστούν στην είσοδο META-INF/contracts ενός αρχείου JAR. Κάθε σύμβαση στο αρχείο JAR πρέπει να έχει ένα αρχείο δείκτη. Το όνομα του αρχείου δίνεται από την τιμή της συμβολικής σταθεράς javax.faces. application.resourcehandler.resource_con TRACT_XML: META-INF/contracts/blue/javax.faces.contract.xml META-INF/contracts/blue/layout.css META-INF/contracts/blue/template.xhtml META-INF/contracts/blue/footer.png META-INF/contracts/red/javax.faces.contract.xml META-INF/contracts/red/layout.css META-INF/contracts/red/template.xhtml META-INF/contracts/red/logo.png Τα περιεχόμενα του καταλόγου contracts από την εφαρμογή μας μπορεί να συσκευάζεται εντός της εισόδου META-INF/contracts ενός αρχείου JAR, layout.jar. Αυτό το JAR μπορεί στη συνέχεια να συσκευάζεται σε WEB-INF/lib και τα δηλωθείσα πρότυπα μπορούν να χρησιμοποιηθούν στην εφαρμογή: index.xhtml new/index.xhtml WEB-INF/lib/layout.jar Μπορείτε να χρησιμοποιήσετε ένα νέο αρχείο layout.jar, παρέχοντας ένα παρόμοιο σύνολο των δηλωμένων σημείων εισαγωγής και τους πόρους (πιθανόν με διαφορετική CSS), για να αλλάξετε την εμφάνιση και την αίσθηση της εφαρμογής. Μπορείτε να αλλάξετε το πρότυπο σελίδας δυναμικά, εσωκλείοντας το πρότυπο σελίδας πελάτη ui:composition σε f:view: <f:view contracts="#{contractsbean.contract"> <ui:composition template="/template.xhtml"> <ui:define name="content">... <h:form> <h:selectoneradio value="#{contractsbean.contract"> Σελίδα 70 από 218

72 <f:selectitem itemvalue="red" itemlabel="red"/> <f:selectitem itemvalue="blue" itemlabel="blue"/> </h:selectoneradio> <h:commandbutton value="apply" action="index" /> </h:form> </ui:define> </ui:composition> </f:view> Σε αυτόν τον κώδικα: Η f: view έχει ένα χαρακτηριστικό, contracts, που συνδέεται με μια EL. Η τιμή αυτής της EL βρίσκεται από το κουμπί στο εσωτερικό του εντύπου ui: define. Οι τιμές του κουμπιού ταιριάζουν με τα ονόματα της σύμβασης. Κάνοντας κλικ στο κουμπί εντολής Apply θα εφαρμοστεί το επιλεγμένο πρότυπο σε αυτή τη σελίδα. Ο ορισμός του backing bean public class ContractsBean implements Serializable { String contract = "red"; // getter & setter 2.12 Χαρακτηριστικά Διέλευσης και HTML5-Friendly Markup Η HTML5 προσθέτει μια σειρά από νέα χαρακτηριστικά για τα υπάρχοντα συστατικά. Αυτά τα χαρακτηριστικά περιλαμβάνουν το χαρακτηριστικό type, για τα συστατικά εισόδου, το οποίο υποστηρίζει τιμές, όπως , url, tel,number, range και date: <input type=" " name="my "/> Σελίδα 71 από 218

73 Αυτό το κομμάτι κώδικα επιτρέπει στο πρόγραμμα περιήγησης να ελέγξει αν το κείμενο που εισαγάγατε είναι σε μορφή . Επιπλέον, προσαρμοσμένα χαρακτηριστικά δεδομένων, επίσης γνωστά ως data-* γνωρίσματα, μπορούν να αποθηκεύσουν ιδιωτικά δεδομένα στην σελίδα ή την εφαρμογή. Κάθε στοιχείο HTML μπορεί να έχει οποιονδήποτε αριθμό των προσαρμοσμένων δεδομένων με οποιαδήποτε τιμή: <input id="mydata" type="text" data-length="3"/> Αυτό το κομμάτι κώδικα εισάγει data-length ως ένα προσαρμοσμένο χαρακτηριστικό των δεδομένων. Αυτά τα χαρακτηριστικά δεν αποδίδονται, αλλά μπορούν να διαβαστούν με JavaScript. Αυτό το χαρακτηριστικό μπορεί να είναι προσβάσιμο στη JavaScript, όπως: document.getelementbyid("mydata").dataset.length; Πριν από την JSF 2.2, από προεπιλογή, αυτά τα νεοεισαχθέντα types και data -* χαρακτηριστικά δεν υποστηρίζονταν από τα συστατικά. Το σύνολο των διαθέσιμων χαρακτηριστικών που υποστηρίζονται από ένα συστατικό JSF καθορίζεται από το συνδυασμό των UIComponent και Renderer για αυτό το tag. Σε ορισμένες περιπτώσεις, η τιμή του χαρακτηριστικού ερμηνεύεται από το UIComponent ή Renderer (για παράδειγμα, οι στήλες αποδίδουν του h: panelgrid) και σε άλλες, η τιμή διοχετεύεται κατ 'ευθείαν μέσα στον πράκτορα χρήστη (για παράδειγμα, το χαρακτηριστικό lang h: inputtext ). Σε αμφότερες τις περιπτώσεις, η UIComponent /Renderer έχει προηγούμενη γνώση του συνόλου των επιτρεπόμενων χαρακτηριστικών. Η JSF 2.2 εισάγει χαρακτηριστικά διέλευσης, τα οποία μας επιτρέπουν να κάνουμε μια αυθαίρετη λίστα name / value ζευγών σε ένα συστατικό που έχουν περάσει κατ 'ευθείαν μέσα στον πράκτορα χρήστη χωρίς διερμηνεία από την UIComponent ή Renderer. Μπορείτε να καθορίσετε τις ιδιότητες διέλευσης με τρεις διαφορετικούς τρόπους: Προτάσσοντας το χαρακτηριστικό με την ανάθεση shortname στο JSF / Passthrough XML namespace: Σελίδα 72 από 218

74 <h:inputtext p:type=" " value="#{user. "/> Σε αυτόν τον κώδικα, το p είναι το shortname για το namespace. Να τοποθετηθεί η ετικέτα <f:passthroughattribute> μέσα σε ένα συστατικό: <h:inputtext value="#{user. "> <f:passthroughattribute name="type" value=" "/> </h:inputtext> Σε αυτόν τον κώδικα, ένα type χαρακτηριστικό της τιμής χαρακτηρίζεται ως χαρακτηριστικό διέλευσης. Να τοποθετηθεί η ετικέτα <f:passthroughattributes> μέσα σε ένα συστατικό: <h:inputtext value="#{user.data"> <f:passthroughattributes value="#{user.myattributes"/> </h:inputtext> Το #{ user.myattributes πρέπει να δείχνει προς ένα map <String, Object> όπου οι τιμές μπορεί να είναι είτε λεκτικές είτε έκφρασης. Ο μηχανισμός αυτός μπορεί να εφαρμοστεί σε οποιοδήποτε συστατικό JSF και δεν περιορίζεται μόνο σε HTML5 συστατικά. Σελίδα 73 από 218

75 3. Web Services Οι υπηρεσίες Web είναι client και server εφαρμογές που επικοινωνούν μέσω του World Wide Web (WWW) με HyperText Transfer Protocol (HTTP). Όπως περιγράφεται από τον World Wide Web Consortium, (W3C), οι υπηρεσίες web παρέχουν ένα πρότυπο τρόπο λειτουργικότητας μεταξύ των εφαρμογών λογισμικού που τρέχουν σε μια ποικιλία από πλατφόρμες και frameworks. Οι υπηρεσίες Web χαρακτηρίζονται από μεγάλη διαλειτουργικότητα και επεκτασιμότητα, καθώς και για τις μηχανικά επεξεργάσιμες περιγραφές τους, χάρη στη χρήση του XML. Οι υπηρεσίες Web μπορεί να συνδυαστούν με ένα χαλαρά συνδεδεμένο τρόπο για να επιτευχθεί ένα σύνολο λειτουργιών. Προγράμματα που παρέχουν απλές υπηρεσίες μπορούν να αλληλεπιδρούν το ένα με το άλλο για να παραδώσουν προηγμένες υπηρεσίες προστιθέμενης αξίας. 3.1 Τύποι Web services Σε εννοιολογικό επίπεδο, η υπηρεσία είναι ένα συστατικό λογισμικού που παρέχεται μέσω ενός δικτυακού σημείου. Η υπηρεσία καταναλωτή και παρόχου χρησιμοποιεί μηνύματα για ανταλλαγή αιτημάτων επίκλησης και απάντησης πληροφοριών με τη μορφή έγγραφων. Σε τεχνικό επίπεδο, υπηρεσίες web μπορούν να υλοποιηθούν με διάφορους τρόπους. Οι δύο τύποι διαδικτυακών υπηρεσιών είναι οι"big" web services και οι "RESTful" web services Big Web Services Στην Java EE 6, το JAX-WS παρέχει τη λειτουργικότητα για "big" διαδικτυακές υπηρεσίες. Οι Big web υπηρεσίες χρησιμοποιούν XML μηνύματα που ακολουθούν το πρότυπο Simple Object Access Protocol (SOAP), μια γλώσσα XML που ορίζει ένα μήνυμα αρχιτεκτονικής και μορφές μηνυμάτων. Τέτοια συστήματα συχνά περιέχουν μια μηχανικά αναγνώσιμη περιγραφή των ενεργειών που προσφέρονται από την υπηρεσία, γραμμένη στη Web Services Description Language (WSDL), μια γλώσσα XML για τον καθορισμό των διεπαφών συντακτικά. Σελίδα 74 από 218

76 3.1.2 RESTful Web services Στην Java EE 6, το JAX-RS παρέχει τη λειτουργικότητα για Representational State Transfer (RESTfull) web υπηρεσίες. Το REST είναι κατάλληλη για τα βασικά ad hoc σενάρια ολοκλήρωσης. Οι RESTfull web υπηρεσίες, συχνά ολοκληρώνονται καλύτερα με HTTP από τις βασισμένες σε SOAP υπηρεσίες, δεν απαιτούν μηνύματα XML ή WSDL ορισμούς των service-api. 3.2 Ποιον από τους δύο τύπους Web service πρέπει να χρησιμοποιήσουμε; JAX - WS: διευθυνσιοδοτεί προχωρημένες απαιτήσεις QoS που συμβαίνουν συνήθως σε υπολογιστές για επιχειρήσεις. Όταν συγκρίνεται με το JAX -RS, το JAX -WS καθιστά ευκολότερη την υποστήριξη του συνόλου WS - * πρωτοκόλλων, τα οποία παρέχουν τα πρότυπα για την ασφάλεια και αξιοπιστία, μεταξύ άλλων, και τη διαλειτουργικότητα με άλλους WS- * συμμορφωμένους πελάτες και διακομιστές. JAX - RS: καθιστά πιο εύκολο να γράψει web εφαρμογές που εφαρμόζουν ορισμένους ή όλους τους περιορισμούς του στυλ REST για να προκαλέσουν επιθυμητές ιδιότητες στην εφαρμογή, όπως χαλαρή σύνδεση (η μετεξέλιξη του server είναι πιο εύκολη χωρίς να σπάσουν οι υφιστάμενοι πελάτες), επε-κτασιμότητα (να ξεκινήσει μικρή και να αναπτυχθεί) και την αρχιτεκτονική απλότητα (χρήση off-the shelf συστατικών, όπως proxies ή δρομολογητές HTTP). Θα επιλέξετε να χρησιμοποιήσετε JAX RS για την web εφαρμογή σας, επειδή είναι πιο εύκολο για πολλούς τύπους πελατών να καταναλώνουν RESTful web services, ενώ επιτρέπει την πλευρά του server να εξελιχθεί και να κλιμακωθεί. Οι πελάτες μπορούν να επιλέγουν να καταναλώνουν κάποιες ή όλες τις πτυχές της υπηρεσίας και να τη συνδυάσουν με άλλες web-based υπηρεσίες. 3.3 Δημιουργία web service με JAX-WS Αυτή η ενότητα δείχνει πώς να δημιουργήσετε και να αναπτύξετε μια απλή web υπηρεσία και δύο πελάτες: έναν πελάτη εφαρμογής και έναν πελάτη web. Ο πηγαίος κώδικας για την υπηρεσία είναι στον κατάλογο tut-install/examples/jaxws/helloservice/ και οι πελάτες στους καταλόγους Σελίδα 75 από 218

77 tut-install/examples/jaxws/appclient/ και tut-install/examples/jaxws/webclient/. Εικόνα 8: Το σχήμα δείχνει πώς η τεχνολογία JAX-WS διαχειρίζεται την επικοινωνία ανάμεσα σε μια web υπηρεσία και έναν πελάτη. Το σημείο εκκίνησης για την ανάπτυξη μιας web service JAX-WS είναι μια κλάση Java που σημειώνεται με τον σχολιασμό javax.jws.webservice. Ο προσδιορίζει την κατηγορία ως το τελικό σημείο της υπηρεσίας web. Ένα service endpoint interface ή service endpoint implementation (SEI) είναι μια διεπαφή Java ή κλάση, αντίστοιχα, που δηλώνει τις μεθόδους που ένας πελάτης μπορεί να επικαλεστεί. Μια διασύνδεση δεν απαιτείται κατά την οικοδόμηση ενός τελικού σημείου JAX-WS. Η web service implementation κλάση ορίζει ένα SEI. Μπορείτε να καθορίσετε μια ρητή διασύνδεση με την προσθήκη του στοιχείου endpointinterface στον WebService σχολιασμό στην implementation κλάση. Θα πρέπει στη συνέχεια να παρέχεται μια διεπαφή που καθορίζει τις δημόσιες μεθόδους που διατίθενται στο τελικό σημείο της implementation κλάσης. Τα βασικά βήματα για τη δημιουργία μιας web υπηρεσίας και του πελάτη έχουν ως εξής: 1. Κωδικοποιείστε την κλάση εφαρμογής. 2. Μεταγλωττίστε την κλάση εφαρμογής. 3. Πακετάρετε τα αρχεία σε έναν φάκελο WAR. 4. Αναπτύξτε τον φάκελο WAR. Τα αντικείμενα της υπηρεσίας web, τα οποία χρησιμοποιούνται για την επικοινωνία με τους πελάτες, δημιουργούνται από το διακομιστή GlassFish κατά τη διάρκεια της εγκατάστασης. 5. Κωδικοποιείστε την κλάση του πελάτη. 6. Χρησιμοποιήστε μια wsimport Ant εργασία για να δημιουργήσει και να συγκεντρώσει τα αντικείμενα της web service που απαιτούνται για να συνδεθείτε στην υπηρεσία. 7. Μεταγλωττίστε την κλάση πελάτη. Σελίδα 76 από 218

78 8. Εκτελέστε τον πελάτη Απαιτήσεις του JAX-WS Endpoint Τα JAX - WS άκρα πρέπει να ακολουθούν αυτές τις προϋποθέσεις. Η κλάση υλοποίησης πρέπει να συμπληρώνεται ή με την javax.jws.webservice ή με το σχόλιο javax.jws.webserviceprovider. Η κλάση υλοποίησης μπορεί να αναφέρει ρητά την SEI μέσω του endpoint Interface στοιχείου του αλλά δεν απαιτείται να το πράξει. Εάν η endpointinterface καθορίζεται ένα SEI ορίζεται για την κλάση υλοποίησης. Οι επιχειρηματικές μέθοδοι της κλάσης υλοποίησης πρέπει να είναι δημόσιες και δεν πρέπει να δηλώνονται ως static ή final. Οι επιχειρηματικοί μέθοδοι που εκτίθενται για τους πελάτες web service πρέπει να συμπληρώνονται με javax.jws.webmethod. Οι επιχειρηματικοί μέθοδοι που εκτίθενται για τους πελάτες web service πρέπει να έχουν JAXB συμβατές παραμέτρους και τους τύπους επιστροφής. Η κλάση υλοποίησης δεν πρέπει να ανακηρυχθεί final και δεν πρέπει να είναι abstract. Η κλάση υλοποίησης πρέπει να έχει έναν προεπιλεγμένο public constructor. Η κλάση υλοποίησης δεν πρέπει να καθορίζει τη μέθοδο finalize. Η κλάση υλοποίησης μπορεί να χρησιμοποιήσει τα javax.annotation. PostConstruct ή javax.annotation.predestroy σχόλια σχετικά με τις μεθόδους της για τα γεγονότα οπισθοκλήσεων του κύκλου ζωής. Η καλείται από το container πριν η κλάση υλοποίησης αρχίζει να ανταποκρίνεται σε πελάτες της web υπηρεσίας.η καλείται από το container πριν το τελικό σημείο αφαιρεθεί από τη λειτουργία Κωδικοποίηση του endpoint της implementation κλάσης της υπηρεσίας Σε αυτό το παράδειγμα, η implementation κλάση, Hello, σχολιάζεται ως endpoint της web υπηρεσίας χρησιμοποιώντας το Η Hello δηλώ- Σελίδα 77 από 218

79 νει μια ενιαία μέθοδο που ονομάζεται sayhello, σχολιασμένη με την η οποία εκθέτει τη σχολιασμένη μέθοδο για την εξυπηρέτηση web πελατών. Η μέθοδος sayhello επιστρέφει ένα χαιρετισμό στον πελάτη, χρησιμοποιώντας το όνομα που διαβιβάζεται σε αυτήν για να συνθέσει το χαιρετισμό. Η implementation κλάση, επίσης, πρέπει να καθορίσει έναν προεπιλεγμένο, δημόσιο δομητή χωρίς ορίσματα. package helloservice.endpoint; import javax.jws.webservice; import public class Hello { private String message = new String("Hello, "); public void Hello() public String sayhello(string name) { return message + name + "."; Ένας απλός JAX-WS Πελάτης Εφαρμογής Η κλάση HelloAppClient είναι ένας stand-alone πελάτης εφαρμογής που έχει πρόσβαση στη μέθοδο sayhello της HelloService. Αυτή η κλήση γίνεται μέσω μιας θύρας, ενός τοπικού αντικείμενου που λειτουργεί ως proxy για την απομακρυσμένη υπηρεσία. Η port έχει δημιουργηθεί κατά το χρόνο ανάπτυξης από την εργασία wsimport, η οποία παράγει JAX-WS φορητά αντικείμενα με βάση ένα WSDL αρχείο. Σελίδα 78 από 218

80 Κωδικοποίηση του Application Client Όταν επικαλούμαστε τις εξ αποστάσεως μεθόδους στο port, ο πελάτης εκτελεί τα παρακάτω βήματα: 1.Χρησιμοποιεί την παραγόμενη κλάση helloservice.endpoint.helloservice, η ο- ποία αντιπροσωπεύει την υπηρεσία στο URI του αρχείου WSDL της υπηρεσίας που αναπτύσσεται: import helloservice.endpoint.helloservice; import javax.xml.ws.webserviceref; public class HelloAppClient = "META-INF/wsdl/localhost_8080/helloservice/HelloService.wsdl") private static HelloService service; 2. Ανακτά ένα proxy στην υπηρεσία, γνωστό και ως port, με την επίκληση gethelloport στην υπηρεσία: helloservice.endpoint.hello port = service.gethelloport(); Το port υλοποιεί το SEI που ορίζεται από την υπηρεσία. 3. Επικαλείται τη μέθοδο sayhello του port, περνώντας ένα string στην υπηρεσία: return port.sayhello(arg0); Εδώ είναι η πλήρης πηγή HelloAppClient που βρίσκεται στον ακόλουθο κατάλογο: tut-install/examples/jaxws/appclient/src/appclient/ package appclient; import helloservice.endpoint.helloservice; import javax.xml.ws.webserviceref; public class HelloAppClient = "META-INF/wsdl/localhost_8080/helloservice/HelloService.wsdl") private static HelloService service; Σελίδα 79 από 218

81 /** args the command line arguments */ public static void main(string[] args) { System.out.println(sayHello("world")); private static String sayhello(java.lang.string arg0) { helloservice.endpoint.hello port = service.gethelloport(); return port.sayhello(arg0); Ένας απλός JAX-WS Web πελάτης Η HelloServlet είναι ένας servlet, όπως ο πελάτης Java, που καλεί τη μέθοδο sayhello της web service. Όπως και o πελάτης εφαρμογής, καθιστά την παρούσα κλήση μέσω μιας θύρας. Κωδικοποίηση του Servlet Για να επικαλεστείτε τη μέθοδο στο port, ο πελάτης εκτελεί τα παρακάτω βήματα: 1.Εισάγει το endpoint HelloService και το σχολιασμό WebServiceRef: import helloservice.endpoint.helloservice;... import javax.xml.ws.webserviceref; 2.Καθορίζει μια αναφορά στην υπηρεσία web καθορίζοντας τη WSDL = "WEB-INF/wsdl/localhost_8080/helloservice/HelloService.wsdl") 3.Δηλώνει την web υπηρεσία, μετά ορίζει μια private μέθοδο που καλεί τη sayhello μέθοδο στο port: private HelloService service;... Σελίδα 80 από 218

82 private String sayhello(java.lang.string arg0) { helloservice.endpoint.hello port = service.gethelloport(); return port.sayhello(arg0); 4.Στο servlet, καλεί αυτήν την private μέθοδο: out.println("<p>" + sayhello("world") + "</p>"); Ακολουθούν τα σημαντικά μέρη του κώδικα HelloServlet. Ο κώδικας βρίσκεται στον κατάλογο tut-install/examples/jaxws/src/java/webclient. package webclient; import helloservice.endpoint.helloservice; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import urlpatterns={"/helloservlet") public class HelloServlet extends HttpServlet = "WEB-INF/wsdl/localhost_8080/helloservice/HelloService.wsdl") private HelloService service; /** * Processes requests for both HTTP <code>get</code> * and <code>post</code> methods. request servlet request response servlet response ServletException if a servlet-specific error occurs IOException if an I/O error occurs Σελίδα 81 από 218

83 */ protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); PrintWriter out = response.getwriter(); try { out.println("<html>"); out.println("<head>"); out.println("<title>servlet HelloServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>servlet HelloServlet at " + request.getcontextpath () + "</h1>"); out.println("<p>" + sayhello("world") + "</p>"); out.println("</body>"); out.println("</html>"); finally { out.close(); // doget and dopost methods, which call processrequest, and // getservletinfo method private String sayhello(java.lang.string arg0) { helloservice.endpoint.hello port = service.gethelloport(); return port.sayhello(arg0); 3.4 Δημιουργώντας μια RESTful Root Resource κλάση Οι Root resource classes είναι POJOs που ή σχολιάζονται ή έχουν τουλάχιστον μία μέθοδο που σχολιάζεται ή μια request method Σελίδα 82 από 218

84 @ POST, DELETE. Οι resource methods είναι οι μέθοδοι μιας κλάσης πόρων σχολιασμένες με ένα προσδιοριστικό αίτημα μεθόδου. Αυτή η ενότητα εξηγεί πώς να χρησιμοποιήσετε το JAX-RS να σχολιάσετε Java κλάσεις για τη δημιουργία RESTfull web service Ανάπτυξη RESTful Web service με JAX-RS Το JAX - RS είναι ένα API γλώσσας Java σχεδιασμένο ώστε να είναι εύκολο να αναπτύξει εφαρμογές που χρησιμοποιούν την αρχιτεκτονική REST. Το JAX - RS API χρησιμοποιεί σχολιασμούς γλώσσας Java για την απλοποίηση της ανάπτυξης των RESTful web υπηρεσιών. Προγραμματιστές διακοσμούν τα αρχεία class της γλώσσας Java με JAX -RS σχολιασμούς για τον καθορισμό των πόρων και των δράσεων που μπορούν να εκτελεστούν επί των πόρων αυτών. Οι JAX-RS σχολιασμοί είναι runtime σημειώσεις. Ένα Java EE αρχείο εφαρμογής περιέχει τις κλάσεις των πόρων JAX -RS, τους διαμορφωμένους πόρους, τις βοηθητικές κλάσεις και τα αντικείμενα καθώς και τον πόρο που εκτίθεται στους πελάτες με την εγκατάσταση του αρχείου σε ένα διακομιστή Java EE Επισκόπηση μιας εφαρμογής JAX-RS Το ακόλουθο δείγμα κώδικα είναι ένα πολύ απλό παράδειγμα μιας root resource class που χρησιμοποιεί JAX-RS σχολιασμούς: package com.sun.jersey.samples.helloworld.resources; import javax.ws.rs.get; import javax.ws.rs.produces; import javax.ws.rs.path; // The Java class will be hosted at the URI path public class HelloWorldResource { // The Java method will process HTTP GET // The Java method will produce content identified by the MIME Media // type Σελίδα 83 από 218

85 public String getclichedmessage() { // Return some cliched textual content return "Hello World"; Οι ακόλουθες ενότητες περιγράφουν τους σχολιασμούς που χρησιμοποιούνται σε αυτό το παράδειγμα. Η τιμή του είναι μια σχετική διαδρομή URI. Στο προηγούμενο παράδειγμα, η Java κλάση θα φιλοξενηθεί στο URI path / helloworld. Αυτή είναι μια εξαιρετικά απλή χρήση του με μια στατική διαδρομή URI. Οι μεταβλητές μπορούν να ενσωματωθούν σε URIs. Τα URI path templates είναι URIs με μεταβλητές που υπάρχουν εντός του URI συντακτικού. Ο είναι ένα προσδιοριστικό μεθόδου αιτήματος, μαζί @DELETE, που ορίζεται από JAX-RS και αντιστοιχεί στις ομώνυμες HTTP μεθόδους. Στο παράδειγμα, η σχολιασμένη μεθοδος Java θα επεξεργάζεται HTTP GET αιτήσεις. Η συμπεριφορά ενός πόρου προσδιορίζεται από την μέθοδο ΗΤΤΡ στην οποία ο πόρος ανταποκρίνεται. Ο χρησιμοποιείται για να καθορίσετε τους τύπους μεσων MIME ενός πόρου που μπορεί να παράγει και να στείλει πίσω στον πελάτη. Σε αυτό το παράδειγμα, η Java μέθοδος θα παράγει αναπαραστάσεις που προσδιορίζονται από τον MIME " text / plain " τύπο μέσων. Ο χρησιμοποιείται για να καθορίσετε τους τύπους μέσων MIME ενός πόρου πουμπορεί να καταναλώνει αυτά που εστάλησαν από τον πελάτη. Το παράδειγμα θα μπορούσε να τροποποιηθεί για να οριστεί το μηνυμα που επιστρέφεται από τη μέθοδο getclichedmessage, όπως φαίνεται σε αυτόν public void postclichedmessage(string message) { // Store the message Σελίδα 84 από 218

86 3.4.3 Ο και τα URI Path Templates Ο προσδιορίζει το πρότυπο path URI στο οποίο απαντά ο πόρος και ορίζεται στο επίπεδο κλάσης ή μεθόδου ενός πόρου. Η τιμή του είναι μία URI διαδρομή προτύπου σε σχέση με τη βάση URI του διακομιστή στον οποίο ο πόρος έχει αναπτυχθεί, τη ρίζα πλαίσιο της εφαρμογής, και το μοτίβο διεύθυνσης URL στο οποίο το runtime JAX-RS ανταποκρίνεται. Τα URI πρότυπα διαδρομής είναι URIs με τις μεταβλητές να εντάσσονται στο πλαίσιο της σύνταξης URI. Αυτές οι μεταβλητές υποκαθίστανται κατά το χρόνο εκτέλεσης, προκειμένου ένας πόρος να ανταποκριθεί σε ένα αίτημα με βάση το υποκατεστημένο URI. Οι μεταβλητές συμβολίζονται με άγκιστρα ({και ). Για παράδειγμα, δείτε τον Σε αυτό το είδος παραδείγματος, ένας χρήστης έχει ζητηθεί να πληκτρολογήσετε το όνομα του ή της, και στη συνέχεια μια JAX-RS web υπηρεσία ρυθμίζεται ώστε να ανταποκριθεί σε αιτήματα για αυτό το URI. Για παράδειγμα, αν ο χρήστης πληκτρολογήσει το όνομα χρήστη "Galileo", η web υπηρεσία ανταποκρίνεται στην ακόλουθη διεύθυνση URL: Για να αποκτήσετε την τιμή του ονόματος χρήστη, ο μπορεί να χρησιμοποιηθεί στην παράμετρο μιας μεθόδου αιτήματος, όπως φαίνεται στο ακόλουθο παράδειγμα public class public String getuser(@pathparam("username") String username) {... Σελίδα 85 από 218

87 Από προεπιλογή, η μεταβλητή URI πρέπει να ταιριάζει με την κανονική έκφραση "[^ /] +?". Αυτή η μεταβλητή μπορεί να προσαρμοστεί καθορίζοντας μια διαφορετική κανονική έκφραση μετά από το όνομα της μεταβλητής. Για παράδειγμα, εάν ένα όνομα χρήστη πρέπει να αποτελείται μόνο από πεζά και κεφαλαία γράμματα αλφαριθμητικών χαρακτήρων, παρακάμψετε την προεπιλεγμένη κανονική έκφραση στον ορισμό της [a-za-z][a-za-z_0-9]") Σε αυτό το παράδειγμα, η μεταβλητή username θα ταιριάξει μόνο ονόματα χρηστών που αρχίζουν με ένα πεζό ή κεφαλαίο γράμμα και μηδέν ή περισσότερους αλφαριθμητικούς χαρακτήρες και τον υπογραμμισμένο χαρακτήρα. Εάν ένα όνομα χρήστη δεν ταιριάζει με αυτό το πρότυπο, απάντηση 404 (Not Found) θα απόστέλλεται στον πελάτη. Μια δεν απαιτείται να έχει αρχική ή τελική καθέτο (/). Το runtime JAX- RS αναλύει το ίδιο URI πρότυπες διαδρομές αν έχουν ή δεν έχουν αρχικά ή τελικά κενά. Ένα πρότυπο μονοπάτι URI έχει μία ή περισσότερες μεταβλητές, με κάθε όνομα μεταβλητής να περιβάλλεται με άγκιστρα: {για να ξεκινήσει το όνομα της μεταβλητής και για το τέλος. Στο προηγούμενο παράδειγμα, το username είναι το όνομα της μεταβλητής. Κατά το χρόνο εκτέλεσης, ένας πόρος ρυθμίζεται ώστε να ανταποκριθεί στη προηγούμενη URI πρότυπη διαδρομή και θα προσπαθήσει να επεξεργαστεί τα δεδομένα URI που αντιστοιχούν στη θέση του {username στο URI όπως τα μεταβλητά δεδομένα για το username. Για παράδειγμα, αν θέλετε να αναπτύξετε έναν πόρο που θα ανταποκρίνεται στο πρότυπο μονοπάτι URI {name1 / {name2 /, θα πρέπει να αναπτύξετε την εφαρμογή σε ένα διακομιστή Java EE, που ανταποκρίνεται σε αιτήματα για την URI και στη συνέχεια να διακοσμήσετε τους πόρους σας με τον public class SomeResource {. Σελίδα 86 από 218

88 Σε αυτό το παράδειγμα, το πρότυπο URL για το βοηθητικό servlet JAX-RS, που ορίζεται στο web.xml, είναι το προεπιλεγμένο: <servlet-mapping> <servlet-name>my JAX-RS Resource</servlet-name> <url-pattern>/resources/*</url-pattern> </servlet-mapping> Το όνομα μιας μεταβλητής μπορεί να χρησιμοποιηθεί περισσότερο από μία φορά στο πρότυπο URI διαδρομής. Εάν ένας χαρακτήρας στην τιμή μιας μεταβλητής θα ερχόταν σε αντίθεση με τους διατηρούντες χαρακτήρες ενός URI, ο αντιφατικός χαρακτήρας θα πρέπει να αντικατασταθεί με το ποσοστό κωδικοποίησης. Για παράδειγμα, κενά στην τιμή μιας μεταβλητής θα πρέπει να είναι υποκατεστημένα με 20%. Κατά τον καθορισμό URI πρότυπων διαδρομής, να είστε προσεκτικοί ώστε η προκύπτουσα URI μετά την αντικατάσταση είναι έγκυρη Απαντώντας σε HTTP Πόρους Η συμπεριφορά ενός πόρου προσδιορίζεται με τις μεθόδους HTTP (τυπικά, GET, POST, PUT, DELETE) στις οποίες ο πόρος ανταποκρίνεται. Οι σχολιασμοί μεθόδου αίτησης προσδιοριστικού: είναι runtime σχολιασμοί, ορίζονται από το JAX-RS και αντιστοιχούν στις παρόμοιες ονομαζόμενες HTTP μεθόδους. Μέσα σε ένα αρχείο καάσης των πόρων, οι μέθοδοι HTTP αντιστοιχίζονται σε μεθόδους Java γλώσσας με τη χρήση του σχολιασμού της request μεθόδου προσδιοριστικού. Η συμπεριφορά ενός πόρου προσδιορίζεται από την μέθοδο HTTP στην οποία ο πόρος ανταποκρίνεται. Το JAX-RS ορίζει ένα σύνολο από αιτήματα μεθόδων προσδιοριστικών για τις κοινές Μπορείτε επίσης να δημιουργήσετε τη δική σας προσαρμοσμένη προσδιοριστική αίτηση μεθόδου. Δημιουργώντας μέθοδο αιτήματος οι ενδείξεις είναι εκτός του πεδίου εφαρμογής του παρόντος εγγράφου. Σελίδα 87 από 218

89 Το ακόλουθο παράδειγμα, ένα απόσπασμα από το δείγμα υπηρεσίας αποθήκευσης, παρουσιάζει τη χρήση της μεθόδου PUT για να δημιουργήσετε ή να ενημερώσετε ένα container public Response putcontainer() { System.out.println("PUT CONTAINER " + container); URI uri = uriinfo.getabsolutepath(); Container c = new Container(container, uri.tostring()); Response r; if (!MemoryStore.MS.hasContainer(c)) { r = Response.created(uri).build(); else { r = Response.noContent().build(); MemoryStore.MS.createContainer(c); return r; Από προεπιλογή, ο JAX RS runtime θα υποστηρίξει αυτόματα τις μεθόδους HEAD και OPTIONS αν δεν εφαρμοστούν ρητά. Για τη HEAD, ο χρόνος εκτέλεσης θα επικαλεστεί την εφαρμοσμένη μέθοδο GET, αν υπάρχει και θα αγνοήσει την οντότητα απάντησης, εάν έχει ρυθμιστεί. Για την OPTIONS, η κεφαλίδα απάντησης Allow θα οριστεί στο σύνολο των μεθόδων HTTP που υποστηρίζονται από τον πόρο. Επιπλέον, ο χρόνος εκτέλεσης JAX - RS θα επιστρέψει ένα Web Application Definition Language ( WADL ) έγγραφο που περιγράφει τον πόρο. Τόσο όσο και μπορούν να χρησιμοποιηθούν για να δημιουργήσετε ή να ενημερώσετε έναν πόρο. Η POST μπορεί να μη σημαίνει τίποτα, έτσι όταν χρησιμοποιεί τη POST, εναπόκειται στην αίτηση για τον καθορισμό της σημασιολογίας. Η PUT έχει σαφώς καθορισμένη σημασιολογία. Όταν χρησιμοποιείτε PUT για τη δημιουργία, ο πελάτης δηλώνει το URI για το νεοσύστατο πόρο. Σελίδα 88 από 218

90 Η PUT έχει πολύ σαφή σημασιολογία για τη δημιουργία και την ενημέρωση ενός πόρου. Η αναπαράσταση του πελάτη πρέπει να είναι η ίδια αναπαράσταση που λαμβάνεται με τη χρήση GET, δεδομένου του ίδιου τύπου των μέσων. Η PUT δεν επιτρέπει ένας πόρος να ενημερώνεται εν μέρει, ένα κοινό λάθος όταν προσπαθούμε να χρησιμοποιήσουμε τη μέθοδο PUT. Οι Entity providers εφοδιάζουν τις υπηρεσίες χαρτογράφησης μεταξύ των παραστάσεων και των συναφών τύπων Java. Οι δύο τύποι των παρόχων οντότητας (entity provider) είναι ο MessageBodyReader και ο MessageBodyWriter. Για τα αιτήματα HTTP, ο MessageBodyReader χρησιμοποιείται για την αντιστοίχιση μιας οντότητας αίτησης HTTP στις παραμέτρους της μεθόδου. Από την πλευρά της απάντησης, μια τιμή που επιστρέφεται έχει αντιστοιχιστεί σε μια οντότητα απόκρισης HTTP χρησιμοποιώντας ένα MessageBodyWriter.Εάν η εφαρμογή θα πρέπει να προσκομίσει πρόσθετα μεταδεδομένα, όπως κεφαλίδες HTTP ή ένα διαφορετικό κωδικό κατάστασης, μια μέθοδος μπορεί να επιστρέψει μια απάντηση που έχει την οντότητα και ότι μπορεί να δομηθεί χρησιμοποιώντας το Response.ResponseBuilder. Το παρακάτω παράδειγμα δείχνει πώς μπορείτε να χρησιμοποιήσετε το Message BodyReader με τους public class FormReader implements MessageBodyReader<NameValuePair> { Το παρακάτω παράδειγμα δείχνει πώς μπορείτε να χρησιμοποιήσετε το Message BodyWriter με τους public class FormWriter implements MessageBodyWriter<Hashtable<String, String>> { Το παρακάτω παράδειγμα δείχνει πώς μπορείτε να χρησιμοποιήσετε το Σελίδα 89 από 218

91 public Response getitem() { System.out.println("GET ITEM " + container + " " + item); Item i = MemoryStore.MS.getItem(container, item); if (i == null) throw new NotFoundException("Item not found"); Date lastmodified = i.getlastmodified().gettime(); EntityTag et = new EntityTag(i.getDigest()); ResponseBuilder rb = request.evaluatepreconditions(lastmodified, et); if (rb!= null) return rb.build(); byte[] b = MemoryStore.MS.getItemData(container, item); return Response.ok(b, i.getmimetype()). lastmodified(lastmodified).tag(et).build(); για την προσαρμογή αιτήσεων και απαντήσεων Η πληροφορία που αποστέλλεται σε έναν πόρο και στη συνέχεια περνά πίσω στον πελάτη ορίζεται ως τύπος μέσου MIME στις επικεφαλίδες ενός αιτήματος ή απάντησης HTTP. Μπορείτε να καθορίσετε ποιοι τύποι μέσων MIME αναπαραστάσεων ενός πόρου μπορούν να ανταποκριθούν ή να παράγουν χρησιμοποιώντας τις ακόλουθες ενδείξεις: javax.ws.rs.consumes javax.ws.rs.produces Από προεπιλογή, μια κατηγορία των πόρων μπορεί να ανταποκριθεί και να παράγει όλους τους τύπους μέσων αναπαράστασης MIME που ορίζονται στην αίτηση HTTP και στις κεφαλίδες απόκρισης. Ο σχολιασμός Produces χρησιμοποιείται για να καθορίσει τους τύπους ή τις αναπαραστάσεις των μέσων MIME ενός πόρου που μπορεί να παράγει και να στείλει πίσω στον πελάτη. Εάν εφαρμόζεται στο επίπεδο κλάσης, όλες οι μέθοδοι σε έναν πόρο μπορούν να παράγουν τους συγκεκριμένους τύπους Σελίδα 90 από 218

92 MIME από προεπιλογή. Αν εφαρμόζονται σε επίπεδο μεθόδου, ο σχολιασμός αντικαθιστά οποιαδήποτε σχόλια Produces εφαρμόζονται σε επίπεδο κλάσης. Αν καμία από τις μεθόδους σε ένα πόρο δεν είναι σε θέση να παράγει τον τύπο MIME στο αίτημα του πελάτη, η JAX-RS runtime στέλνει πίσω ένα σφάλμα HTTP "406 Not acceptable". Η τιμή είναι μια σειρά από String τύπων MIME. Ο χρησιμοποιείται για να προσδιορίσει ποια είδη μέσων MIME αναπαραστάσεων ενός πόρου μπορεί να δεχτεί, ή να καταναλώσει, ο πελάτης. Αν εφαρμοστεί στο επίπεδο της κλάσης, όλες οι μέθοδοι ανταπόκρισης αποδέχονται τους συγκεκριμένους τύπους MIME από προεπιλογή. Εάν εφαρμοστεί σε επίπεδο μεθόδου, υπερισχύει κάθε που εφαρμόζεται στο επίπεδο της κλάσης. Εάν ο πόρος είναι σε θέση να καταναλώνει τον τύπο MIME του αιτήματος του πελάτη, οι JAX-RS runtime στέλνει πίσω ένα HTTP 415 ("Unspported Media Type") σφάλμα. Η τιμή είναι μια σειρά από String των αποδεκτών τύπων MIME Εξαγωγή Παραμέτρων Αιτήματος Οι παράμετροι μιας μεθόδου πόρου μπορεί να συμπληρώνεται με παράμετρο που βασίζεται σε σχολιασμούς για να συλλέγονται πληροφορίες από ένα αίτημα.μπορείτε να εξαγάγετε τους ακόλουθους τύπους παραμέτρων για χρήση στην κλάση των πόρων σας: Query, URI path, Form, Cookie, Header, Matrix Οι query parameters εξάγονται από το αίτημα URI παράμετρων ερωτήματος και καθορίζονται χρησιμοποιώντας το σχολιασμό javax.ws.rs.queryparam στην παράμετρο μεθόδου arguments. Το ακόλουθο παράδειγμα, από το δείγμα της εφαρμογής Sparklines, αποδεικνύει τη για να εξαγάγει παραμέτρους ερωτήματος από Query συστατικό του URL public Response smooth( Σελίδα 91 από 218

93 ColorParam lastcolor ) {... Εάν υπάρχει η step παραμέτρος στο συστατικό του URI αίτηματος, η τιμή του step θα εξαχθεί και θα αναλυθεί ως ένα 32-bit signed integer και θα ανατεθεί στην παράμετρο step της μεθόδου. Αν το step δεν υπάρχει,μια προκαθορισμένη τιμή του 2, όπως έχει δηλωθεί σχόλιο, θα πρέπει να ανατεθεί στην παράμετρο step της μεθόδου. Αν η τιμή του step δεν μπορεί να αναλυθεί ως ένα 32-bit signed integer, επιστρέφεται μια απάντηση HTTP 400 ("client error"). Ορισμένοι τύποι Java γλώσσας μπορούν να χρησιμοποιηθούν ως παράμετροι ερωτήματος. Το ακόλουθο παράδειγμα κώδικα δείχνει την κλάση ColorParam που χρησιμοποιείται στο προηγούμενο παράδειγμα: public class ColorParam extends Color { public ColorParam(String s) { super(getrgb(s)); private static int getrgb(string s) { if (s.charat(0) == # ) { try { Color c = Color.decode("0x" + s.substring(1)); return c.getrgb(); catch (NumberFormatException e) { throw new WebApplicationException(400); else { try { Field f = Color.class.getField(s); return ((Color)f.get(null)).getRGB(); Σελίδα 92 από 218

94 catch (Exception e) { throw new WebApplicationException(400); Ο δομητής για τη ColorParam παίρνει μία μόνο παράμετρο String. Τόσο όσο και μπορούν να χρησιμοποιηθούν μόνο για τους ακόλουθους τύπους Java: Όλοι οι τύποι εκτός από char Όλες οι wrapper κλάσεις των αρχικών τύπων εκτός Character Κάθε κλάση με μια δομή που να δέχεται ένα μόνο String argument Κάθε κλάση με τη static μέθοδο που ονομάζεται valueof ( String ) η οποία δέχεται ένα μονό String argument Κάθε κλάση με ένα δομητή που έχει ένα μόνο String ως παράμετρο List <T>, Set <T> ή SortedSet <T>, όπου T ταιριάζει με τα ήδη εισηγμένα κριτήρια. Μερικές φορές, οι παράμετροι μπορούν να περιέχουν περισσότερες από μία τιμές για το ίδιο όνομα. Αν είναι αυτή η περίπτωση, αυτοί οι τύποι μπορούν να χρησιμοποιηθούν για την απόκτηση όλων των τιμών. Εάν δεν χρησιμοποιείται σε συνδυασμό με και η παράμετρος ερωτήματος δεν είναι παρούσα στην αίτηση, η τιμή θα είναι μια άδεια συλλογή List, Set ή SortedSet, null για άλλους τύπους αντικειμένου και η προεπιλογή για αρχικούς τύπους. Οι παράμετροι της διαδρομής URI που προέρχονται από το αίτημα URI και τα ονόματα των παραμέτρων αντιστοιχούν στις URI διαδρομές ονόματα πρότυπων μεταβλητών που καθορίζονται στο επιπέδου κλάσης. Οι URI παράμετροι ορίζονται με τη χρήση του javax.ws.rs.pathparam σχολιασμού των επιχειρημάτων της παραμέτρου της μεθόδου. Το παρακάτω παράδειγμα δείχνει πώς μπορείτε να χρησιμοποιήστε τις και το σε μια μέθοδο: Σελίδα 93 από 218

95 @Path("/{username") public class MyResourceBean public String printusername(@pathparam("username") String userid) {... Στο προηγούμενο απόσπασμα, η URI πρότυπη μεταβλητή path ονόματος username ορίζεται ως μια παράμετρος της μεθόδου printusername. Ο έχει οριστεί στη μεταβλητή username. Κατά το χρόνο εκτέλεσης, πριν κληθεί η printusername, η τιμή του username εξάγεται από το URI και μετατρέπεται σε String. Το προκύπτον String τότε διατίθεται με την μέθοδο ως μεταβλητή userid. Αν η μεταβλητής URI πρότυπου διαδρομής δεν μπορεί να μετατρέπεται στον καθορισμένο τύπο, το JAX RS runtime επιστρέφει σφάλμα HTTP 400 (" Bad Request ") στον πελάτη. Αν σχολιασμός δεν μπορεί να μετατραπεί στον καθορισμένο τύπο ο χρόνος εκτέλεσης JAX - RS επιστρέφει σφάλμα HTTP 404 ("Not Found" ) στον πελάτη. Η και τα άλλα σχόλια @CookieParam και FormParam ) υπακούουν στους ίδιους κανόνες Σελίδα 94 από 218

96 4. Enterprise beans Γραμμένο στη γλώσσα προγραμματισμού Java, ένα enterprise bean είναι ένα server-side συστατικό που ενθυλακώνει την επιχειρηματική λογική μιας εφαρμογής. Η επιχειρηματική λογική είναι ο κώδικας που πληροί τον σκοπό της εφαρμογής. Σε μια εφαρμογή έλεγχου της απογραφής, για παράδειγμα, τα enterprise beans μπορούν να εφαρμόσουν τη επιχειρηματική λογική σε μεθόδους που καλούνται checkinventorylevel και orderproduct. Με την επίκληση αυτών των 32-bit μεθόδων, οι πελάτες μπορούν να έχουν πρόσβαση στις υπηρεσίες απογραφής που προβλέπεται από την εφαρμογή. 4.1 Οφέλη των Enterprise beans Για διάφορους λόγους, τα enterprise beans απλοποιούν την ανάπτυξη μεγάλων διανεμημένων εφαρμογών: Πρώτον, γιατί το container EJB παρέχει υπηρεσίες σε επίπεδο συστήματος για τα enterprise beans και ο σχεδιαστής bean μπορεί να επικεντρωθεί στην επίλυση των επιχειρηματικών προβλημάτων. Το container EJB και όχι ο σχεδιαστής του bean, είναι υπεύθυνο για τις υπηρεσίες επίπεδου συστήματος, όπως η διαχείριση των συναλλαγών και η έγκριση της ασφάλειας. Δεύτερον, επειδή τα bean και όχι οι πελάτες περιέχουν την επιχειρηματική λογική της εφαρμογής, ο σχεδιαστής πελάτη μπορεί να επικεντρωθεί στην παρουσίαση του πελάτη. Ο σχεδιαστής πελάτη δεν πρέπει να κωδικοποιήσει τις ρουτίνες που εφαρμόζουν τους κανόνες των επιχειρήσεων ή την πρόσβαση στις βάσεις δεδομένων. Ως αποτέλεσμα, οι πελάτες είναι λεπτότεροι, ένα πλεονέκτημα που είναι ιδιαίτερα σημαντικό για τους πελάτες που τρέχουν σε μικρές συσκευές. Τρίτον, επειδή τα enterprise beans είναι φορητά τμήματα, ο assembler της εφαρμογής μπορεί να αναπτύξει νέες εφαρμογές από τα υπάρχοντα beans. Υπό την προϋπόθεση ότι χρησιμοποιούν το πρότυπο API, αυτές οι εφαρμογές μπορούν να τρέξουν σε οποιονδήποτε συμβατό server Java EE. Σελίδα 95 από 218

97 4.1.1 Πότε να χρησιμοποιήσετε Enterprise Beans Θα πρέπει να εξετάσετε τη χρήση enterprise beans, εάν η εφαρμογή σας έχει οποιαδήποτε από τις ακόλουθες απαιτήσεις. Η εφαρμογή πρέπει να είναι επεκτάσιμη. Για να φιλοξενήσει έναν αυξανόμενο αριθμό χρηστών, μπορεί να χρειαστεί να διανείμει τα συστατικά μιας εφαρμογής σε πολλαπλές μηχανές. Όχι μόνο μπορούν τα enterprise beans της εφαρμογής να τρέχουν σε διαφορετικά μηχανήματα, αλλά επίσης η θέση τους θα παραμείνει διαφανής για τους πελάτες. Οι συναλλαγές πρέπει να διασφαλίζουν την ακεραιότητα των δεδομένων. Τα enterprise beans υποστηρίζουν τις συναλλαγές και τους μηχανισμούς που διαχειρίζονται την ταυτόχρονη πρόσβαση των κοινών αντικειμένων. Η εφαρμογή θα έχει μια ποικιλία πελατών. Με μόνο λίγες γραμμές κώδικα, η εξ αποστάσεως πελάτες μπορούν εύκολα να εντοπίσουν τα enterprise beans. Οι πελάτες αυτοί μπορεί να είναι διαφορετικοί και πολυάριθμοι Τύποι Enterprise Beans Πίνακας 3: Ο πίνακας συνοψίζει τα δύο είδη των Enterprise Beans. 4.2 Τι είναι ένα session bean; Ένα session bean ενσωματώνει την επιχειρηματική λογική που μπορεί να γίνει επίκληση από έναν πελάτη στις τοπικές,στις απομακρυσμένες ή τις views του web service πελάτη. Για να αποκτήσει πρόσβαση σε μια εφαρμογή που έχει αναπτυχθεί στο διακομιστή, ο πελάτης επικαλείται τις μεθόδους του session bean. Το session bean εκτελεί τη δουλειά για τον πελάτη του, προστατεύοντάς τον από την πολυπλοκότητα με την εκτέλεση των καθηκόντων των επιχειρήσεων στο εσωτερικό του διακομιστή. Σελίδα 96 από 218

98 4.2.1 Τύποι session beans Τα session beans είναι τριών τύπων: stateful, stateless και singleton. Stateful Session Beans Η κατάσταση ενός αντικειμένου αποτελείται από τις τιμές του στιγμιοτύιπου των μεταβλητών της. Σε ένα stateful session bean, οι μεταβλητές του στιγμιοτύπου, αντιπροσωπεύουν την κατάσταση μιας μοναδικής client / bean συνόδου. Επειδή o πελάτης αλληλεπιδρά («talks») με το bean της, αυτή η κατάσταση συχνά απόκαλείται η conversational state. Όπως υποδηλώνει το όνομά του, ένα session bean είναι παρόμοιο με μια διαδραστική συνεδρία. Ένα session bean δεν μοιράζεται, μπορεί να έχει μόνο έναν πελάτη, με τον ίδιο τρόπο που μια διαδραστική συνεδρία μπορεί να έχει μόνο ένα χρήστη. Όταν ο πελάτης διακόψει, το session bean του φαίνεται να τερματίζει και δεν συνδέεται πλέον με τον πελάτη. Η κατάσταση αυτή διατηρείται κατά τη διάρκεια της συνόδου του client / bean. Αν ο πελάτης αφαιρεί το bean, τελειώνει η συνεδρία και η κατάσταση εξαφανίζεται. Αυτή η παροδική φύση της κατάστασης δεν είναι πρόβλημα, ωστόσο, όταν η συνομιλία μεταξύ του πελάτη και του bean τελειώνει, δεν υπάρχει καμία ανάγκη να διατηρηθεί η κατάσταση. Stateless session beans Ένα stateless session bean δεν διατηρεί κατάσταση συνομιλίας με τον πελάτη. Όταν ένας πελάτης καλεί τις μεθόδους του για ένα stateless bean, οι μεταβλητές εκείνης της στιγμής των beans μπορεί να περιέχουν μια κατάσταση ειδικά για αυτόν τον πελάτη, αλλά μόνο κατά τη διάρκεια της επίκλησης. Όταν η μέθοδος έχει τελειώσει, η συγκεκριμένη κατάσταση πελάτη δεν θα πρέπει να διατηρηθεί. Οι πελάτες μπορούν, ωστόσο, να αλλάξουν την κατάσταση της μεταβλητής του στιγμιοτύπου συγκεντρώνοντας stateless beans και αυτή η κατάσταση αναβάλλεται για την επόμενη επίκληση των συγκεντρωμένων stateless beans. Εκτός από τη μέθοδο κατά τη διάρκεια της επίκλησης, όλα τα στιγμιότυπα ενός stateless bean είναι ισοδύναμα, επιτρέποντας το EJB container να ορίσει ένα στιγμιότυπο για Σελίδα 97 από 218

99 κάθε πελάτη. Δηλαδή, η κατάσταση ενός stateless session bean θα πρέπει να ε- φαρμόζεται σε όλους τους πελάτες. Επειδή μπορεί να υποστηρίξει πολλούς πελάτες, τα stateless session beans μπορούν να προσφέρουν καλύτερη επεκτασιμότητα για εφαρμογές που απαιτούν μεγάλο αριθμό πελατών. Τυπικά, μια εφαρμογή απαιτεί λιγότερα stateless session beans από stateful session beans για τη στήριξη του ίδιου αριθμού πελατών. Ένα stateless session bean μπορεί να εκτελέσει μια web service, αλλά ένα stateful session bean δεν μπορεί. Singleton session beans Ένα singleton session bean αρχικοποιείται μία φορά ανά εφαρμογή και υπάρχει για τον κύκλο ζωής της εφαρμογής. Τα Singleton session beans σχεδιάζονται για περιπτώσεις στις οποίες ένα μόνο στιγμιότυπο του enterprise bean είναι μοιρασμένο παντού και ταυτόχρονα προσβάσιμο από τους πελάτες -. Τα singleton session beans προσφέρουν την ίδια λειτουργικότητα με stateless session beans, αλλά διαφέρουν από αυτά στο ότι υπάρχει μόνο ένα singleton session bean ανά εφαρμογή, σε αντίθεση με τα stateless session beans, στα ο- ποία οποιοδήποτε μπορεί να ανταποκριθεί στο αίτημα του πελάτη. Σαν τα stateless session beans, τα singleton session beans μπορούν να εκτελέσουν τα endpoint των web services. Τα singleton session beans διατηρούν την κατάσταση τους μεταξύ των επικλήσεων του πελάτη, αλλά δεν απαιτούνται για τη διατήρηση της κατάστασής τους σε συντριβές διακομιστή ή διακοπής της λειτουργίας. Οι εφαρμογές που χρησιμοποιούν ένα singleton session bean πρέπει να ορίσουν ότι το singleton θα τεθεί κατά την εκκίνηση της εφαρμογής, η οποία επιτρέπει στο singleton να εκτελέσει εργασίες προετοιμασίας για την εφαρμογή. Το singleton μπορεί να εκτελέσει τα καθήκοντα καθαρισμού για το κλέισιμο της εφαρμογής, επίσης το singleton θα λειτουργεί καθ 'όλη τoυ κύκλου ζωής της εφαρμογής. Σελίδα 98 από 218

100 4.2.2 Πότε χρησιμοποιούνται τα session beans Τα stateful session beans είναι κατάλληλα εάν οποιαδήποτε από τις ακόλουθες συνθήκες είναι αληθής: Η κατάσταση του bean αντιπροσωπεύει την αλληλεπίδραση μεταξύ του bean και ενός συγκεκριμένου πελάτη. Το bean πρέπει να διαθέτει πληροφορίες για τον πελάτη σε όλες τις επικλήσεις μεθόδου. Το bean μεσολαβεί μεταξύ του πελάτη και των άλλων συνιστωσών της αίτησης, παρουσιάζοντας μία απλοποιημένη όψη για τον πελάτη. Παρασκηνιακά, το bean διαχειρίζεται τη ροή εργασιών των διαφόρων enterprise beans. Για να βελτιώσετε τις επιδόσεις, μπορείτε να επιλέξετε ένα stateless session bean αν έχει οποιοδήποτε από αυτά τα χαρακτηριστικά: Η κατάσταση του bean δεν έχει καθόλου δεδομένα για ένα συγκεκριμένο πελάτη. Σε μια ενιαία μέθοδο επίκλησης, το bean εκτελεί ένα γενικό καθήκον για όλους τους πελάτες. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε stateless session bean για να στείλετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου που επιβεβαιώνει την ηλεκτρονική παραγγελία. Το bean υλοποιεί μια υπηρεσία web. Τα Singleton session beans είναι κατάλληλα υπό τις ακόλουθες συνθήκες: Η κατάσταση πρέπει να είναι κοινή σε όλη την εφαρμογή. Ένα μονό enterprise bean πρέπει να είναι προσβάσιμο από πολλαπλά threads ταυτόχρονα. Η εφαρμογή χρειάζεται ένα enterprise bean για την εκτέλεση των καθηκόντων κατόπιν αιτήσεων εκκίνησης και τερματισμού. Το bean υλοποιεί μια υπηρεσία web. Σελίδα 99 από 218

101 4.3 Τι είναι ένα Message-Driven bean; Ένα message-driven bean είναι ένα enterprise bean που επιτρέπει στις εφαρμογές Java EE την επεξεργασία ασύγχρονων μηνυμάτων. Αυτό το είδος των bean ενεργεί συνήθως ως listener μηνύματος JMS, ο οποίος είναι παρόμοιος με ένα listener γεγονότος, αλλά λαμβάνει μηνύματα JMS αντί των γεγονότων. Τα μηνύματα μπορούν να σταλούν από οποιοδήποτε συστατικό Java EE (μια εφαρμογή πελάτη, ένα άλλο enterprise bean, ή ένα συστατικό web) ή από μια εφαρμογή JMS ή συστήματα που δεν χρησιμοποιούν την τεχνολογία Java EE. Το message-driven bean μπορεί να επεξεργαστεί τα μηνύματα JMS ή άλλου είδους μηνύματα Τι κάνει το Message-Driven Bean διαφορετικό από το Session Bean; Η πιο εμφανής διαφορά μεταξύ του message-driven bean και του session bean είναι ότι οι πελάτες δεν έχουν πρόσβαση σε message-driven bean μέσω των διασυνδέσεων. Σε αντίθεση με ένα session bean, ένα message-driven bean έχει μόνο μια κλάση bean. Από πολλές απόψεις, ένα message-driven bean μοιάζει με ένα stateless session bean. Στιγμιότυπα ενός message-driven bean δεν διατηρούν κανένα στοιχείο ή κατάσταση συνομιλίας για έναν συγκεκριμένο πελάτη. Όλες οι περιπτώσεις ενός message-driven bean είναι ισοδύναμες, επιτρέποντας το container EJB να ορίσει ένα μήνυμα σε κάθε message-driven bean στιγμιότυπο. Τα container μπορούν να συγκεντρώσουν αυτές οι περιπτώσεις και να επιτρέψουν σε ροές μηνυμάτων να υποβάλλονται σε επεξεργασία ταυτόχρονα. Ένα μονό message-driven bean μπορεί να επεξεργαστεί μηνύματα από πολλαπλούς πελάτες. Οι μεταβλητές στιγμιότυπου του message-driven bean στιγμιότυπου μπορούν να περιέχουν κάποια κατάσταση του χειρισμού των μηνυμάτων πελάτη, όπως μια σύνδεση ΑΡΙ JMS, μια ανοικτή σύνδεση της βάσης δεδομένων ή αναφορά αντικειμένου σε ένα αντικείμενο των enterprise beans.τα συστατικά του πελάτη δεν εντοπίζουν τα message-driven beans και επικαλούνται απευθείας τις μεθόδους τους. Αντ 'αυτού, ένας πελάτης αποκτά πρόσβαση σε ένα message- Σελίδα 100 από 218

102 driven bean για παράδειγμα στέλνοντας JMS μηνύματα προς τον προορισμό του μηνύματος για το οποίο η message-driven bean κλάση είναι η MessageListener. Μπορείτε να εκχωρήσετε τον προορισμό ένα message-driven bean κατά τη διάρκεια της ανάπτυξης, χρησιμοποιώντας GlassFish πόρους διακομιστή. Τα message-driven beans έχουν τα ακόλουθα χαρακτηριστικά: Εκτελούν κατά την παραλαβή ενός μηνύματος πελάτη. Καλούνται ασύγχρονα. Είναι σχετικά βραχύβια. Δεν αντιπροσωπεύουν κοινά δεδομένα στη βάση δεδομένων, αλλά μπορούν να έχουν πρόσβαση και να ενημερώνουν τα δεδομένα. Μπορούν να είναι transaction-aware. Είναι stateless. Όταν φτάνει ένα μήνυμα, το container καλεί την μέθοδο onmessage του messagedriven bean για να επεξεργαστεί το μήνυμα. Η μέθοδος onmessage τροποποιεί συνήθως το μήνυμα σε έναν από τους πέντε τύπους μηνυμάτων JMS και το χειρίζεται σύμφωνα με την επιχειρηματική λογική της εφαρμογής. Η μέθοδος onmessage μπορεί να καλεί τις μεθόδους βοήθειας ή μπορεί να επικαλεστεί ένα session bean για να επεξεργάζεται τις πληροφορίες του μηνύματος ή να το αποθηκεύσει σε μια βάση δεδομένων. Ένα μήνυμα μπορεί να παραδοθεί σε ένα message-driven bean μέσα σε ένα πλαίσιο συναλλαγής, έτσι όλες οι εργασίες στο πλαίσιο της μεθόδου onmessage απότελούν μέρος μιας ενιαίας πράξης. Εάν η επεξεργασία μηνύματος επανέρχεται, το μήνυμα θα ξαναπαραδωθεί Πότε χρησιμοποιούνται τα message-driven beans Τα session beans σας επιτρέπουν να στέλνετε μηνύματα JMS και να τα λαμβάνετε συγχρόνως όχι όμως και ασύγχρονα. Για να αποφύγετε τη δέσμευση των πόρων διακομιστή, δεν θα χρησιμοποιήσετε το μπλοκάρισμα σύγχρονης λήψης σε ένα server-side συστατικό. Σε γενικές γραμμές, τα μηνύματα JMS δεν πρέπει να απόστέλλονται ή να λαμβάνονται συγχρόνως. Για να λαμβάνετε μηνύματα ασύγχρονα, χρησιμοποιήστε ένα message-driven bean. Σελίδα 101 από 218

103 4.4 Πρόσβαση σε enterprise beans Οι πελάτες έχουν πρόσβαση σε enterprise beans μέσω μιας no-interface view ή μέσω ενός business interface. Μια no-interface view ενός enterprise bean εκθέτει τις Public μεθόδους της enterprise bean implementation κλάσης στους πελάτες. Οι πελάτες που χρησιμοποιούν την no-interface view ενός enterprise bean μπορούν να επικαλεστούν οποιαδήποτε public μέθοδο στην enterprise bean κλάση εφαρμογής ή οποιαδήποτε υπερκλάση της implementation κλάσης. Ένα business interface είναι μια τυπική διασύνδεση σε Java γλώσσα που περιέχει τις business μεθόδους του enterprise bean. Ένας πελάτης μπορεί να έχει πρόσβαση σε ένα session bean μόνο μέσα από τις μεθόδους που ορίζονται στο business interface του bean ή μέσω των public μεθόδων ενός enterprise bean που έχει μια no-interface view. Το business interface ή το no-interface ορίζουν την view του πελάτη ενός enterprise bean. Όλες οι άλλες πτυχές του enterprise bean (μέθοδος εφαρμογής και ρυθμίσεις ανάπτυξης) κρύβονται από τον πελάτη. Καλά σχεδιασμένες διεπαφές και no- interface views απλοποιούν την ανάπτυξη και τη συντήρηση εφαρμογών Java EE. Όχι μόνο κάνουν καθαρές διασυνδέσεις και τις no-interface views να προστατεύουν τους πελάτες από τις περιπλοκές της βαθμίδας EJB, αλλά επιτρέπουν και τα enterprise beans να μεταβάλλονται εσωτερικά, χωρίς να επηρεάζουν τους πελάτες. Για παράδειγμα, αν μεταβάλλουν την εφαρμογή μιας business μεθόδου ενός session bean, δεν θα πρέπει να αλλάξει ο κώδικας του πελάτη. Αλλά αν ήταν να αλλάξετε τους ορισμούς των διεπαφών της μεθόδου, ίσως χρειαστεί να τροποποιήσετε τον κώδικα του πελάτη. Έτσι, είναι σημαντικό ότι σχεδιάζετε τις διασυνδέσεις και τις no-interface views προσεκτικά για να απομονώσετε τους πελάτες σας από πιθανές αλλαγές στα enterprise beans. Τα session beans μπορεί να έχουν περισσότερες από μια business interface. Τα session beans θα έπρεπε, αλλά είναι δεν υποχρεούνται, να εφαρμόσουν το business interface ή interfaces τους. Σελίδα 102 από 218

104 4.4.1 Χρησιμοποιώντας τα enterprise beans σε πελάτες Ο πελάτης ενός enterprise bean αποκτά μια αναφορά σε ένα στιγμιότυπο ενός enterprise bean είτε μέσω dependency injection είτε με JNDI lookup, χρησιμοποιώντας το Java Naming και Directory Interface συντακτικό. Η dependency injection είναι ο απλούστερος τρόπος για την απόκτηση μιας αναφοράς ενός enterprise bean. Οι πελάτες που τρέχουν μέσα σε ένα περιβάλλον Java EE,σε JavaServer Faces web εφαρμογές, σε JAX-RS web υπηρεσίες και σε άλλα enterprise beans υποστηρίζουν τη dependency injection, χρησιμοποιώντας το σχολιασμό javax.ejb.ejb. Τρία JNDI namespace χρησιμοποιούνται για φορητές αναζητήσεις JNDI: java: global, java: module, και java: app. Το java: global namespace JNDI είναι ο φορητός τρόπος για την εξεύρεση εξ αποστάσεως enterprise beans χρησιμοποιώντας JNDI lookups. Διευθύνσεις JNDI είναι της ακόλουθης μορφής: java:global[/application name]/module name/enterprise bean name[/interface name] Το όνομα της εφαρμογής και το όνομα μονάδας ορίζουν το όνομα της εφαρμογής και της μονάδας εκτός της επέκτασης του αρχείου. Τα ονόματα της εφαρμογής απαιτούνται μόνο εάν η εφαρμογή είναι συσκευασμένη μέσα σε ένα EAR. Το όνομα της διεπαφής είναι απαραίτητο μόνο αν το enterprise bean υλοποιεί περισσότερα από ένα business interface. Το java: module namespace χρησιμοποιείται για να αναζητήσετε τα τοπικά enterprise beans εντός της ίδιας μονάδας. Οι διευθύνσεις JNDI χρησιμοποιώντας το java:module namespace είναι της ακόλουθης μορφής: java:module/enterprise bean name/[interface name] Το όνομα της διεπαφής είναι απαραίτητο μόνο αν το enterprise bean υλοποιεί περισσότερες από μία business interface. Σελίδα 103 από 218

105 Το java: app namespace χρησιμοποιείται για την αναζήτηση τοπικών enterprise beans που είναι συσκευασμένα εντός της ίδιας εφαρμογής. Δηλαδή, το enterprise bean είναι συσκευασμένο μέσα σε ένα αρχείο EAR που περιέχει πολλαπλές μονάδες Java EE. Οι διευθύνσεις JNDI που χρησιμοποιούν το java: app namespace είναι της ακόλουθης μορφής: java:app[/module name]/enterprise bean name[/interface name] Το όνομα της μονάδας είναι προαιρετικό. Το όνομα της διεπαφής είναι απαραίτητο μόνο αν το enterprise bean υλοποιεί περισσότερα από ένα business interface Αποφασίζοντας σχετικά με Remote ή Local πρόσβαση Όταν σχεδιάζετε μια εφαρμογή Java EE, μια από τις πρώτες αποφάσεις που παίρνετε είναι ο τύπος της πρόσβασης του πελάτη που επιτρέπεται από τα enterprise beans: απομακρυσμένη, τοπική ή web υπηρεσία. Αν επιτρέψει τοπική ή απόμακρυσμένη πρόσβαση εξαρτάται από τους ακόλουθους παράγοντες: Σφιχτή ή χαλαρή σύνδεση των σχετικών beans: Σφιχτά συνδεμένα beans εξαρτώνται το ένα από άλλο. Για παράδειγμα, αν ένα session bean που επεξεργάζεται εντολές πωλήσεων ζητά ένα session bean που στέλνει ένα μήνυμα επιβεβαίωσης στον πελάτη, αυτά τα beans είναι σφιχτά συνδεμένα. Στενά συνδεδεμένα beans είναι καλοί υποψήφιοι για την τοπική πρόσβαση. Επειδή ταιριάζουν μεταξύ τους σαν μια λογική μονάδα, που συνήθως καλούν το ένα το άλλο συχνά και θα ωφεληθούν από την αυξημένη απόδοση που είναι δυνατή με τη τοπική πρόσβαση. Τύπος πελάτη: Εάν ένα enterprise bean είναι προσβάσιμο από τους πελάτες της εφαρμογής, θα πρέπει να επιτρέπει την απομακρυσμένη πρόσβαση. Σε ένα περιβάλλον παραγωγής, οι πελάτες αυτοί σχεδόν πάντα τρέχουν σε μηχανήματα, εκτός εκείνων για τα οποία εκτελείται ο διακομιστής GlassFis. Διανομή συστατικού: Οι εφαρμογές Java EE είναι επεκτάσιμες επειδή τα server-side συστατικά τους μπορούν να διανέμονται σε πολλαπλές μηχανές. Σε μια κατανεμημένη εφαρμογή, για παράδειγμα, ο server που τρέχουν τα συστατικά μέρη Web μπορεί να μην είναι αυτός ο οποίος τα enterprise beans έχουν Σελίδα 104 από 218

106 πρόσβαση και αναπτύσσονται. Σε αυτό το σενάριο διανομής, τα enterprise beans πρέπει να επιτρέπουν την απομακρυσμένη πρόσβαση. Απόδοση: Λόγω παραγόντων όπως λανθάνουσα κατάσταση του δικτύου, οι απομακρυσμένες κλήσεις μπορεί να είναι βραδύτερες από τοπικές κλήσεις. Από την άλλη πλευρά, αν έχετε τη διανομή των συστατικών μεταξύ των διαφορετικών server, μπορεί να βελτιωθεί η συνολική απόδοση της εφαρμογής. Αν δεν είστε σίγουροι ποιος τύπος πρόσβασης θα πρέπει να έχει ένα enterprise bean, επιλέξτε εξ αποστάσεως πρόσβαση. Η απόφαση αυτή σας δίνει μεγαλύτερη ευελιξία. Στο μέλλον, μπορείτε να διανείμετε τα συστατικά σας για να φιλοξενήσετε τις αυξανόμενες απαιτήσεις σχετικά με την εφαρμογή σας. Αν και είναι ασυνήθιστο, είναι δυνατό για ένα enterprise bean να επιτρέψει τόσο απομακρυσμένη όσο και τοπική πρόσβαση. Εάν είναι αυτή η περίπτωση, είτε η διεπαφή του enterprise bean πρέπει να είναι ρητά ορισμένη ως business interface με το να είναι διακοσμημένη με σχολιασμό, είτε η κλάση bean πρέπει να ορίσει ρητά τα business interfaces χρησιμοποιώντας σχόλιασμούς. Το ίδιο business interface δεν μπορεί να είναι τοπικό και απομακρυσμένο ταυτόχρονα Local Clients Ένας τοπικός πελάτης έχει αυτά τα χαρακτηριστικά. Θα πρέπει να τρέξει στην ίδια εφαρμογή, που το enterprise bean θα έχει πρόσβαση. Μπορεί να είναι ένα συστατικό web ή άλλο enterprise bean. Για τον τοπικό πελάτη, η θέση του enterprise bean που έχει πρόσβαση δεν είναι διαφανής. Η no-interface view ενός enterprise bean είναι μια τοπική view. Οι public μέθοδοι της implementation κλάσης του enterprise bean εκτίθενται σε τοπικούς πελάτες που έχουν πρόσβαση στη no-interface view του enterprise bean.τα enterprise beans που χρησιμοποιούν τη no-interface view δεν εφαρμόζουν ένα business interface. Σελίδα 105 από 218

107 Το local business interface ορίζει την επιχείρηση και τις μεθόδους του κύκλου ζωής του bean. Εάν το business interface του bean δεν είναι διακοσμημένο και αν η κλάση bean δεν διευκρινίζει το interface το business interface είναι από προεπιλογή ένα local interface. Για να φτιάξουμε ένα enterprise bean που επιτρέπει μόνο την τοπική πρόσβαση, ίσως πρέπει, αλλά δεν απαιτείται, να κάνετε ένα από τα εξής: Δημιουργία μιας Implementation κλάσης του enterprise bean που δεν εφαρμόζει ένα business interface, που δείχνει ότι το bean εκθέτει μια no-interface view με τους πελάτες. Για public class MyBean {... Σχολιασμός του business interface του enterprise bean interface. Για public interface InterfaceName {... Καθορίστε τη διεπαφή της bean κλάσης με τη και καθορίστε το όνομα της διεπαφής. Για public class BeanName implements InterfaceName {... Πρόσβαση σε Local Enterprise Beans χρησιμοποιώντας τη No-Interface View Η πρόσβαση πελάτη σε ένα enterprise bean που εκθέτει μια τοπική, no-interface view επιτυγχάνεται είτε μέσω dependency injection είτε μέσω JNDI lookup. Για να αποκτήσετε μια αναφορά στην no-interface view ενός enterprise bean μέσω dependency injection, χρησιμοποιήστε το σχόλιο javax.ejb.ejb για να καθορίσετε την implementationκλάση του enterprise ExampleBean examplebean; Σελίδα 106 από 218

108 Για να αποκτήσετε μια αναφορά στην no-interface view ενός enterprise bean μέσω JNDI lookup, χρησιμοποιήστε τη μέθοδο lookup του interface javax.naming. InitialContext: ExampleBean examplebean = (ExampleBean) InitialContext.lookup("java:module/ExampleBean"); Οι πελάτες δεν χρησιμοποιούν το νέο διαχειριστή για να αποκτήσουν ένα νέο στιγμιότυπο ενός enterprise bean που χρησιμοποιεί μια no-interface view. Πρόσβαση σε Local Enterprise Beans που υλοποιούν Business Interfaces Η πρόσβαση πελάτη σε ένα enterprise bean που εφαρμόζει local business interfaces επιτυγχάνεται είτε μέσω dependency injection είτε με JNDI lookup. Για να αποκτήσετε μια αναφορά σε μια τοπική business interface ενός enterprise bean μέσω dependency injection, χρησιμοποιήστε το σχόλιο javax.ejb.ejb και τo local business interface όνομα του enterprise Example example; Για να αποκτήσετε μια αναφορά σε ένα τοπικό local ενός enterprise bean μέσω JNDI lookup, χρησιμοποιείστε τη μέθοδο lookup του interface του javax.naming.initialcontext: ExampleLocal example = (ExampleLocal) InitialContext.lookup("java:module/ExampleLocal"); Remote clients Ένα απομακρυσμένος πελάτης ενός enterprise bean έχει τα ακόλουθα χαρακτηριστικά. Μπορεί να τρέξει σε μια διαφορετική μηχανή και μια διαφορετική JVM από το enterprise bean που έχει πρόσβαση. Μπορεί να είναι ένα συστατικό ιστού, μια εφαρμογή πελάτη ή άλλο enterprise bean Σελίδα 107 από 218

109 Σε έναν απομακρυσμένο πελάτη, η θέση του enterprise bean είναι διαφανής. Το enterprise bean πρέπει να εφαρμόσει ένα business interface. Δηλαδή, απομακρυσμένοι πελάτες δεν μπορούν να έχουν πρόσβαση σε ένα enterprise bean μιας no-interface view. Για να δημιουργήσετε ένα enterprise bean που επιτρέπει την απομακρυσμένη πρόσβαση, θα πρέπει να: Διακοσμήστε το business interface του enterprise bean με public interface InterfaceName {... Διακοσμήστε την bean κλάση που προσδιορίζει το business interfaceή public class BeanName implements InterfaceName {... Το remote interface καθορίζει τις επιχειρηματικές μεθόδους και του κύκλου ζωής που είναι συγκεκριμένες για το bean. Για παράδειγμα, η απομακρυσμένη διεπαφή ενός bean που ονομάζεται BankAccountBean μπορούσε να έχει business μεθόδους που ονομάζονται deposit και credit. Η Εικόνα 9: Το σχήμα δείχνει πώς η διεπαφή ελέγχει το view του πελάτη ενός enterprise bean. πρόσβαση του πελάτη σε ένα enterprise bean που υλοποιεί ένα απόμακρυσμένο business interface επιτυγχάνεται είτε μέσω dependency injection είτε με JNDI lookup. Για να αποκτήσετε μια αναφορά στο απομακρυσμένο business interface ενός enterprise bean με dependency injection, χρησιμοποιήστε το σχολιασμό javax.ejb. Σελίδα 108 από 218

110 EJB και καθορίστε το απομακρυσμένο όνομα του business interface του enterprise bean να Example example; Για να αποκτήσετε μια αναφορά στο απομακρυσμένο business interface ενός enterprise bean με JNDI lookup, χρησιμοποιείστε τη μέθοδο του interface του lookup javax.naming.initialcontext: ExampleRemote example = (ExampleRemote) InitialContext.lookup("java:global/myApp/ExampleRemote"); Web service clients Ένας πελάτης μιας web service μπορεί να έχει πρόσβαση μια εφαρμογή Java EE με δύο τρόπους.κατ 'αρχάς, ο πελάτης μπορεί να έχει πρόσβαση σε μια υπηρεσία web που δημιουργήθηκε με το JAX-WS και δεύτερον, ένας πελάτης web service μπορεί να επικαλεστεί τις business μεθόδους των stateless session beans. Τα beans μηνύματος δεν μπορούν να είναι προσβάσιμα από τους πελάτες των web υπηρεσιών. Υπό την προϋπόθεση ότι χρησιμοποιεί τα σωστά πρωτόκολλα (SOAP, HTTP, WSDL), οποιοσδήποτε πελάτης web υπηρεσίας μπορεί να έχει πρόσβαση σε stateless session bean, έστω και αν ο πελάτης είναι ή δεν είναι γραμμένος στην Java. Ο πελάτης δεν ξέρει ποια τεχνολογία υλοποιεί την υπηρεσία: stateless session bean, JAX-WS, ή κάποια άλλη τεχνολογία. Επιπλέον enterpsise beans των συστατικών του web μπορεί να είναι πελάτες των web υπηρεσιών. Αυτή η ευελιξία σας δίνει τη δυνατότητα να ενσωματώσετε τις εφαρμογές Java EE με τις web υπηρεσίες. Ένας πελάτης web service αποκτά πρόσβαση σε ένα stateless session bean μέσω του endpoint της implementation κλάσης της web υπηρεσίας του bean. Από προεπιλογή, όλες οι public μέθοδοι στην bean κλάση είναι προσιτές για τους πελάτες των web υπηρεσιών. Ο μπορεί να χρησιμοποιηθεί για να προσαρμόσετε τη συμπεριφορά των μεθόδων των web υπηρεσιών. Εάν χρησιμοποιείται το για να διακοσμήσει τις μεθόδους της Σελίδα 109 από 218

111 bean κλάσης, μόνο οι μέθοδοι αυτές που είναι διακοσμημένες εκτίθενται σε πελάτες της web υπηρεσίας. 4.5 Τα περιεχόμενα ενός enterprise bean Για να αναπτυχθεί ένα enterprise bean, θα πρέπει να παρέχετε τα ακόλουθα αρχεία: Enterprise bean class: Εφαρμόζει τις business μεθόδους του enterprise bean καθώς και τις μεθόδους επανάκλησης του κύκλου ζωής. Business interfaces: Ορίστε τις business μεθόδους που εφαρμόζονται από το enterprise bean. Ένα business interface δεν απαιτείται εάν το enterprise bean εκθέτει μια τοπική no-interface view. Helper classes: άλλες κλάσεις που απαιτούνται από την κλάση του enterprise bean, όπως exception και utility κλάσεις. Πακέταρετε τα αντικείμενα της προηγούμενης λίστας, είτε σε ένα αρχείο EJB JAR (μια stand-alone μονάδα που αποθηκεύει το enterprise bean) είτε μέσα σε ένα αρχείο (WAR) εφαρμογής web Πακετάροντας τα Enterprise beans σε EJB JAR ενότητες Ένα αρχείο JAR EJB είναι φορητό και μπορεί να χρησιμοποιηθεί για διάφορες εφαρμογές. Εικόνα 10: Το σχήμα δείχνει τα περιεχόμενα ενός αρχείου JAR EJB. Σελίδα 110 από 218

112 Για να δημιουργηθεί μια εφαρμογή Java EE, πακετάρει μία ή περισσότερες ενότητες, όπως EJB JAR αρχεία, σε ένα αρχείο EAR,που είναι το αρχείο αρχειοθέτησης που κρατά την εφαρμογή. Κατά την ανάπτυξη του αρχείου EAR που περιέχει το αρχείο EJB JAR του enterprise bean, μπορείτε επίσης να αναπτύξετε το enterprise bean στο GlassFish Server. Μπορείτε επίσης να αναπτύξετε ένα JAR EJB που δεν περιέχεται σε ένα αρχείο EAR Πακετάροντας τα enterprise beans σε WAR ενότητες Τα enterprise beans παρέχουν συχνά την επιχειρηματική λογική μιας εφαρμογής web. Σε αυτές τις περιπτώσεις, η συσκευασία, του enterprise bean εντός της WAR ενότητας της εφαρμογής απλοποιεί την ανάπτυξη και την οργάνωση της εφαρμογής. Τα enterprise beansμπορούν να συσκευάζονται μέσα σε μια WAR ενότητα ως αρχεία κλάσης Java, είτε σε ένα αρχείο JAR που έχει πακεταριστεί μέσα στην ενότητα WAR. Για να συμπεριλάβετε τα αρχεία class των enterprise beans σε μια WAR ενότητα, τα αρχεία κλάσης θα πρέπει να είναι στον WEB-INF/classes κατάλογο. Για να συμπεριλάβετε ένα αρχείο JAR που περιέχει enterprise beans σε μια WAR ενότητα, προσθέστε το JAR στον κατάλογος WEB-INF/lib της WAR ενότητας. Οι WAR ενότητες που περιέχουν τα enterprise beans δεν απαιτούν EJB - jar.xml deployment descriptor. Εάν η εφαρμογή χρησιμοποιεί EJB - jar.xml, πρέπει να βρίσκεται στον κατάλογο WEB - INF της WAR ενότητας. Τα JAR αρχεία που περιέχουν κλάσεις enterprise bean που συσκευάζονται εντός της WAR ενότητας δεν θεωρούνται EJB JAR αρχεία, ακόμη και αν το πακεταρισμένο αρχείο JAR είναι σύμφωνο με τη μορφή ενός EJB αρχείου JAR. Τα enterprise beans που περιέχονται μέσα στο αρχείο JAR είναι σημασιολογικά ισοδύναμα με enterprise beans που βρίσκονται στον κατάλογο WEB-INF/classes της WAR ενότητας και το περιβάλλον namespace όλων των enterprise beans έχουν ως πεδίο τη WAR ενότητα. Για παράδειγμα, ας υποθέσουμε ότι μια web εφαρμογή αποτελείται από ένα καλάθι αγορών enterprise bean, ένα enterprise bean επεξεργασίας πιστωτικών καρ- Σελίδα 111 από 218

113 τών, και ένα Java servlet άκρο. Το bean του καλαθιού αγορών εκθέτει μια τοπική, no-interface view που ορίζεται ως εξής: package public class CartBean {... Το bean επεξεργασίας πιστωτικών καρτών είναι συσκευασμένο μέσα σε δικό του αρχείο JAR της, cc.jar, εκθέτει μια τοπική no-interface view και ορίζεται ως εξής: package public class CreditCardBean {... Ο servlet, com.example.web.storeservlet, χειρίζεται το άκρο του web και χρησιμοποιεί τόσο CartBean όσο και CreditCardBean. Το σχήμα της WAR ενότητας για αυτή την εφαρμογή έχει ως εξής: WEB-INF/classes/com/example/cart/CartBean.class WEB-INF/classes/com/example/web/StoreServlet WEB-INF/lib/cc.jar WEB-INF/ejb-jar.xml WEB-INF/web.xml 4.6 Συμβάσεις ονομασίας των enterprise beans Επειδή τα enterprise beans αποτελούνται από πολλά μέρη, είναι χρήσιμο να ακολουθήσετε μια σύμβαση ονομασίας για τις εφαρμογές σας. Πίνακας 4:Ο πίνακας συνοψίζει τις συμβάσεις για τα παραδείγματα beans. Σελίδα 112 από 218

114 4.7 Ο κύκλος ζωής των Enterprise Beans Ένα enterprise bean περνά από διάφορα στάδια κατά τη διάρκεια της ζωής του, ή του κύκλου ζωής. κάθε είδος enterprise bean (stateful session, stateless session, singleton session ή message-driven) έχει διαφορετικό κύκλο ζωής Ο κύκλος ζωής του Stateful session bean Ο πελάτης ξεκινά τον κύκλο ζωής με τη λήψη μιας αναφοράς σε ένα stateful session bean. Το container εκτελεί οποιαδήποτε dependency injection και στη συνέχεια καλεί τη μέθοδο σχολιασμένη αν υπάρχει. Το bean είναι τώρα έτοιμο να έχει τι business μεθόδους του που επικαλούνται από τον πελάτη. Εικόνα 11: Το σχήμα δείχνει τα στάδια που ένα session bean περνά μέσα στη διάρκεια της ζωής του. Στο έτοιμο στάδιο, το container EJB μπορεί να αποφασίσει για να απενεργοποιήσει ή να παθητικοποιήσει, το bean με τη μετακίνησή του από τη μνήμη στη δευτεροβάθμια αποθήκευση. Το EJB container επικαλείται τη μέθοδο εάν υπάρχει, αμέσως πριν την παθητικοποίηση του. Εάν ένας πελάτης επικαλείται μια business μέθοδο για το bean, ενώ είναι σε παθητικό στάδιο, το container EJB ενεργοποιεί το bean, καλεί τη μέθοδο σχολιασμένη αν υπάρχει και στη συνέχεια κινείται προς το έτοιμο στάδιο. Στο τέλος του κύκλου ζωής του, ο πελάτης επικαλείται μια μέθοδο και το EJB container καλεί τη μέθοδο σχολιασμένη αν Σελίδα 113 από 218

115 υπάρχει. Το στιγμιότυπο του bean είναι στη συνέχεια έτοιμο για τη συλλογή απορριμμάτων Ο κύκλος ζωής του Stateless session bean Επειδή ένα stateless session bean δεν αδρανοποιείται, στον κύκλο ζωής του έχει μόνο δύο στάδια: Το να είναι ανύπαρκτο και να είναι έτοιμο για την επίκληση των business μεθόδων. Εικόνα 12: Η εικόνα απεικονίζει τα στάδια ενός stateless session bean. Το container EJB συνήθως δημιουργεί και διατηρεί μια πισίνα των stateless session beans αρχίζοντας τον κύκλο ζωής τους. Το container εκτελεί οποιαδήποτε dependency injection και στη συνέχεια καλεί τη μέθοδο αν υπάρχει. Το bean είναι τώρα έτοιμο να έχει business μεθόδους που επίκαλούνται από έναν πελάτη. Στο τέλος του κύκλου ζωής, το container EJB καλεί τη μέθοδο εάν υπάρχει. Το στιγμιότυπο του bean είναι έτοιμο τότε για τη συλλογή απορριμμάτων Ο κύκλος ζωής του singleton session bean Όπως ένα stateless session bean, ένα singleton session bean δεν είναι ποτέ α- δρανοποιημένα και έχει μόνο δύο στάδια,να είναι ανύπαρκτο και να είναι έτοιμο για την επίκληση των business μεθόδων, όπως φαίνεται στο σχήμα: Εικόνα 13: Η εικόνα απεικονίζει τα στάδια ενός singleton session bean. Σελίδα 114 από 218

116 Το container EJB ξεκινά τον κύκλο ζωής του singleton session bean, με τη δημιουργία του singleton στιγμιότυπου. Αυτό συμβαίνει κατά την εγκατάσταση της εφαρμογής, εάν το singleton είναι σχολιασμένο με την το container εκτελεί οποιαδήποτε dependency injection και στη συνέχεια καλεί τη μέθοδο αν υπάρχει. Το singleton session bean είναι τώρα έτοιμο να έχει business μεθόδους της επίκλησης από τον πελάτη. Στο τέλος του κύκλου ζωής, το container EJB καλεί τη μέθοδο εάν υπάρχει. Το singleton session bean είναι τώρα έτοιμο για τη συλλογή απορριμμάτων Ο κύκλος ζωής του message-driven bean Εικόνα 14: Η εικόνα απεικονίζει τα στάδια του κύκλου ζωής ενός message-driven bean. Το container EJB δημιουργεί συνήθως μια πισίνα των message-driven bean στιγμιότυπων. Για καθένα στιγμιότυπο, το container EJB εκτελεί τα καθήκοντα αυτά: 1. Εάν το message driven bean χρησιμοποιεί dependency injection, το container διοχετεύει αυτές τις αναφορές, πριν εμφανίσει το στιγμιότυπο. 2. Το container καλεί τη μέθοδο αν υπάρχει. Όπως ένα stateless session bean, ένα message-driven bean ποτέ δεν αδρανοποιείται και έχει μόνο δύο καταστάσεις: να είναι ανύπαρκτο και να είναι έτοιμο να λάβει τα μηνύματα. Στο τέλος του κύκλου ζωής του, το container καλεί τη μέθοδο εάν υπάρχει. Το στιγμιότυπο του bean είναι έτοιμο για τη συλλογή απορριμμάτων. Σελίδα 115 από 218

117 5. Contexts και dependency injection Το Contexts και Dependency Injection (CDI) ορίζει έναν ασφαλή τύπου μηχανισμό dependency injection στην πλατφόρμα Java EE. Ένα bean προσδιορίζει μόνο τον τύπο και τη σημασιολογία των άλλων bean που εξαρτάται, χωρίς ένα όνομα συμβολοσειράς και χρησιμοποιώντας τον τύπο πληροφοριών που διατίθενται στο μοντέλο αντικειμένου Java. Αυτό επιτρέπει εκτός από την ανάπτυξη και την επικύρωση κατά τη μεταγλώττιση. Το αίτημα της injection δεν χρειάζεται να γνωρίζει τον πραγματικό κύκλο ζωής, για τη συγκεκριμένη εφαρμογή, το threading μοντέλο ή για άλλους πελάτες του bean. Αυτός ο strong typing, loose coupling συνδυασμός καθιστά τον κώδικα σας πιο εύκολο να διατηρηθεί. Το bean έτσι εγχέεται, έχει ένα καλά καθορισμένο κύκλο ζωής και ορίζεται σε life-cycle contexts. Το bean αυτό επίσης ονομάζεται contextual instance, επειδή πάντοτε εγχέεται σε ένα context (πλαίσιο). Σχεδόν κάθε POJO μπορεί να εγχυθεί ως CDI bean. Αυτό περιλαμβάνει EJBs, JNDI πόρους, κλάσεις οντοτήτων, μονάδες persistence και contexts. Ακόμη και τα αντικείμενα που είχαν νωρίτερα δημιουργηθεί από μια μέθοδο factory μπορούν τώρα να εγχυθούν εύκολα. Συγκεκριμένα, το CDI επιτρέπει EJB συστατικά να χρησιμοποιηθούν ως JSF managed beans, γεφυρώνοντας έτσι το χάσμα μεταξύ της συναλλακτικής και της web βαθμίδας. Επίσης,είναι ενσωματωμένο με Unified Expression Language (UEL), επιτρέποντας σε οποιαδήποτε contextual αντικείμενο να χρησιμοποιηθεί απευθείας μέσα σε ένα JSF ή μια JSP σελίδα. 5.1 Εξερεύνηση των beans Οι κλάσεις των bean αναπτύσσονται στα bean archives. Ένα bean archive έχει τους τρόπους εξερεύνησης των beans που παρατίθενται στον πίνακα. Πίνακας 5: Tρόποi εξερεύνησης των beans Σελίδα 116 από 218

118 Ένα αρχείο bean που δεν περιέχει beans.xml, αλλά περιέχει μία ή περισσότερες κλάσεις bean με ένα bean σχολιασμό, ένα ή περισσότερα session beans, θεωρείται implicit bean archive. Ένα bean με ένα δηλωμένο τύπο πεδίου λέγεται για ότι έχει έναν bean-defining annotation. Ένα explicit bean archive είναι ένα αρχείο που περιέχει ένα αρχείο beans.xml με οποιαδήποτε από τις ακόλουθες προϋποθέσεις: Ένας αριθμός έκδοσης 1.1 (ή νεότερη έκδοση), με το bean-descovery-mode του all: <beans xmlns=" xmlns:xsi=" xsi:schemalocation=" bean-discovery-mode="all"> </beans> Ένα δείγμα αρχείου beans.xml περιέχει την ετικέτα beans έναρξης και beans τερματισμού, με namespaces και χαρακτηριστικά. Χωρίς αριθμό έκδοσης: <beans xmlns=" </beans> Ένα κενό αρχείο. Ένα explicit bean αρχείο έχει μια λειτουργία ανακάλυψης beans του all. Ένα αρχείο bean που περιέχει ένα αρχείο beans.xml με την έκδοση 1.1 (ή νεότερη έκδοση), πρέπει να καθορίσει το χαρακτηριστικό bean-discovey-mode. Η προεπιλεγμένη τιμή για το χαρακτηριστικό είναι annotated. Αν υπάρχει στο αρχείο, τότε θα πρέπει να είναι παρόν στις ακόλουθες θέσεις: Στον WEB-INF κατάλογο ή WEB-INF/classes/META-INF για δικτυακές εφαρμογές. Στον κατάλογο META-INF για τις ενότητες EJB ή τα αρχεία JAR. Σελίδα 117 από 218

119 Το beans.xml μπορεί να καθορίσει exclude filters για να αποκλείσει τα beans και τα ονόματα των πακέτων από την εξερεύνηση. Μπορείτε να τα ορίσετε χρησιμοποιώντας <Exclude> συστατικά, όπως τα παιδιά του <scan> συστατικού: <beans...> <scan> <exclude name="...">... </exclude> </scan> </beans> Τα ονόματα των πακέτων μπορούν να αποκλειστούν εάν βρεθεί μια συγκεκριμένη κλάση: <exclude name="org.sample.beans.*"> <if-class-available name="org.sample.beans.simplegreeting"/> </exclude> Σε αυτόν τον κώδικα, όλα τα beans στα org.sample.beans.* πακέτα αποκλείονται εάν βρίσκεται η org.sample.beans.simplegreeting κλάση. Τα ονόματα των πακέτων μπορούν να αποκλειστούν, αν δεν έχει βρεθεί μια συγκεκριμένη κλάση: <exclude name="org.sample.beans.*"> <if-class-not-available name="org.sample.beans.fancygreeting"/> </exclude> Σε αυτόν τον κώδικα, όλα τα beans στο org.sample.beans* πακέτο αποκλείονται εάν η org.sample.beans.fancygreeting κλάση δεν έχει βρεθεί. Τα ονόματα των πακέτων μπορούν να αποκλειστούν εάν δεν ορίζεται μια ιδιότητα του συστήματος για ένα συγκεκριμένο όνομα ή ένα ακίνητο σύστημα δεν ορίζεται με μία συγκεκριμένη τιμή: <exclude name="org.sample.beans.*"> <if-system-property name="myproperty" value="myvalue"/> </exclude> Σελίδα 118 από 218

120 Σε αυτόν τον κώδικα, όλα τα beans στo πακέτο org.sample.beans.* αποκλείονται αν δεν ορίζεται μια ιδιότητα συστήματος με την επωνυμία myproperty με τη τιμή MyValue. Το όνομα του πακέτου και όλα τα υποπακέτα μπορούν να αποκλειστούνε άν το όνομα του φίλτρου τελειώνει με.**: <exclude name="org.sample.beans.**"> <if-system-property name="exclude-beans"/> </exclude> Σε αυτόν τον κώδικα, όλα τα beans στo org.sample.beans.* πακέτο και τα υποπακέτα εξαιρούνται εάν έχει οριστεί μια ιδιότητα συστήματος με την ονομασία exclude-beans. Το CDI 1.1 εισάγει ένα νέο Μπορείτε να προλάβετε ένα bean από την έγχυση προσθέτοντας το public class SimpleGreeting implements Greeting {... Σε αυτόν τον κώδικα, το SimpleGreeting bean δεν λαμβάνεται υπόψη για injection. Όλα τα beans σε ένα πακέτο μπορούν να εμποδιστούν από την package org.sample.beans; import javax.enterprise.inject.vetoed; Αυτός ο κώδικας του package-info.java στο πακέτο org.sample.beans θα αποτρέψει το σύνολο των beans σε αυτό το πακέτο να εγχυθεί. Τα Java EE συστατικά, όπως τα stateless EJBs ή τελικά σημεία των πόρων JAX- RS, μπορούν να σημειώνονται με το για να τα αποτρέψουμε από το να θεωρούνται διαθέσιμα beans. 5.2 Σημεία injection Μπορείτε να κάνετε inject ένα bean σε ένα πεδίο, στη μέθοδο, ή στον δομητή Σελίδα 119 από 218

121 Ο κώδικας που ακολουθεί δείχνει μια διεπαφή Greeting, ένα POJO SimpleGreeting σαν την εφαρμογή του και η injection της διεπαφής ως ένα πεδίο στο GreetingService: public interface Greeting { public String greet(string name); public class SimpleGreeting implements Greeting { public String greet(string name) { return "Hello" + public class GreetingService Greeting greeting; public String greet(string name) { return greeting.greet(name); καθορίζει το σημείο της injection, το Greetings καθορίζει τι πρέπει να εγχυθεί, και το greeting είναι η μεταβλητή που παίρνει την injection. Ένα bean μπορεί να καθορίζει μία ή περισσότερες μεθόδους ως στόχους της injection: Greeting public setgreeting(greeting greeting) { this.greeting = greeting; Τέλος, ένα bean μπορεί να έχει το πολύ έναν κατασκευαστή που σημειώνεται με το Greeting public SimpleGreeting(Greeting greeting) { this.greeting = greeting; Σελίδα 120 από 218

122 Όλες οι παράμετροι μεθόδου στη συνέχεια εγχέονται αυτόματα. Αυτός ο constructor μπορεί να έχει οποιοδήποτε αριθμό παραμέτρων και όλοι τους είναι σημεία εγχύσεως. Ένας δομητής που σημειώνεται δεν πρέπει να έχει public πρόσβαση. Αυτό επιτρέπει σε ένα bean με injection δομητή να είναι αμετάβλητο. Εδώ είναι η ακολουθία εκκίνησης του bean: 1. Προεπιλεγμένος δομητής ή ένας σχολιασμός 2. Όλα τα πεδία του bean σχολιάζονται 3. Όλες οι μέθοδοι του bean σχολιάζονται (η σειρά κλήσης δεν είναι φορητή) 4. Η αν υπάρχει 5.3 Qualifier και Alternative Η Qualifier σας επιτρέπει να ορίσετε μοναδικά ένα bean που πρέπει να εγχυθεί μεταξύ πολλαπλών υλοποιήσεων του. Για παράδειγμα, ο κώδικας αυτός δηλώνει ένα FIELD, PARAMETER, TYPE) Fancy { Αυτό ορίζει μια νέα εφαρμογή της διεπαφής public class FancyGreeting implements Greeting { public String greet(string name) { return "Nice to meet you, hello" + name; και διοχετεύει στην GreetingService καθορίζοντας ως public class Greeting greeting; Σελίδα 121 από 218

123 public String sayhello(string name) { return greeting.greet(name); Αυτό αφαιρεί οποιαδήποτε άμεση εξάρτηση σε κάποια συγκεκριμένη εφαρμογή της διεπαφής. Τα Qualifiers μπορούν να λάβουν παραμέτρους για περαιτέρω διακρίσεις. Πολλαπλά qualifiers μπορούν να καθορίζονται σε ένα σημείο injection. Πίνακας 6: Ο πίνακας παραθέτει τα built-in qualifiers και τις έννοιές τους. Χρησιμοποιώντας τις εφαρμογές SimpleGreeting και FancyGreeting που ορίστηκαν προηγουμένως, Τα σημεία έγχυσης εξηγούνται ως @Default Greeting greeting; Τα τρία σημεία injection είναι ισοδύναμα, όπως κάθε bean (εκτός qualifiers και τα προσδιορίζει χωρίς να παρέχει πρόσθετες πληροφορίες.το SimpleGreeting bean εγχέεται σε κάθε @Fancy Greeting greeting; Αυτό θα εγχύσει την υλοποίηση FancyGreeting. Αυτό οφείλεται στο γεγονός ότι προσδιορίζοντας στη FancyGreeting σημαίνει ότι δεν έχει qualifier. Greeting greeting; θα οδηγήσει σε ambiguous dependency και απαιτεί από εμάς να κρίνουμε περαιτέρω το bean, Σελίδα 122 από 218

124 Η χρήση ως ένα injection σημείο qualifier δεν συνιστάται, εκτός από την περίπτωση ολοκλήρωσης με κληρονομικό κώδικα που χρησιμοποιεί string ονόματα για την ταυτοποίηση των bean. Τα beans που σημειώνονται με το δεν είναι διαθέσιμα για injection, lookup ή την λύση EL. Πρέπει να τα επιτρέψουμε ρητά στο beans.xml χρησιμοποιώντας public class SimpleGreeting implements Greeting public class FancyGreeting implements Greeting { //... Τώρα το μετά την injection θα δώσει ένα λάθος για την unresolved dependency επειδή και τα δυο beans έχουν απενεργοποιηθεί για Greeting greeting; Μπορούμε να επιλύσουμε αυτό το σφάλμα ενεργοποιώντας ένα από τα beans στο beans.xml: <beans xmlns=" xmlns:xsi=" xsi:schemalocation=" bean-discovery-mode="annotated"> <alternatives> <class>org.sample.fancygreeting</class> </alternatives> </beans> Σελίδα 123 από 218

125 μας επιτρέπει να συσκευάσουμε πολλαπλές εφαρμογές ενός bean με τα ίδια qualifiers στο αρχείο.war και επιλεκτικά να μπορέσουμε να τα ενεργοποιήσουμε αλλάζοντας τον DD που βασίζεται στο περιβάλλον. Για παράδειγμα, αυτό μπορεί να σας επιτρέψει να στοχεύσετε ξεχωριστά beans για injection στην ανάπτυξη, στη δοκιμή και στα περιβάλλοντα παραγωγής, ενεργοποιώντας τις κλάσεις στο beans.xml. Αυτό παρέχει πολυμορφισμό deployment-type. 5.4 Producer και Disposer παρέχουν στατική έγχυση ενός bean (δηλαδή, το συγκεκριμένο είδος του bean που πρόκειται να εγχυθεί είναι γνωστό). Ωστόσο, αυτό μπορεί να μην είναι πάντοτε δυνατό. Οι producer μέθοδοι παρέχουν πολύμορφισμό runtime όπου ο συγκεκριμένος τύπος του bean που θα εγχυθεί μπορεί να διαφέρει κατά το χρόνο εκτέλεσης ή το εγχεόμενο αντικείμενο μπορεί ακόμη να μην είναι ένα bean και τα αντικείμενα μπορεί να απαιτήσουν προετοιμασία. Αυτό είναι παρόμοιο με το γνωστό factory pattern. Εδώ είναι ένα παράδειγμα που δείχνει πώς η List<string> μπορεί να διατεθεί ως στόχος για public List<String> getgreetings() { List<String> response = new ArrayList<String>(); //... return response; Σε αυτόν τον κώδικα, η μέθοδος getgreetings μπορεί να γεμίσει τη List<string> από Data Source ή καλώντας κάποια άλλη εξωτερική λειτουργία. Και τώρα μπορεί να εγχυθεί ως List<String> list; Από προεπιλογή, ένα bean εγχέεται στο πεδίο αλλά μπορούμε να τo αλλάξουμε προσδιορίζοντας το απαιτούμενο πεδίο. Ας πούμε Connection ότι είναι ένα bean που συμπυκνώνει μια σύνδεση σε μια πηγή για παράδειγμα μια βάση δεδομένων προσβάσιμη μέσω JDBC και ο User παρέχει Σελίδα 124 από 218

126 διαπιστευτήρια στον πόρο. Ο ακόλουθος κώδικας δείχνει πώς ένα bean σύνδεσης είναι διαθέσιμο για injection σε Connection connect(user user) { return createconnection(user.getid(), user.getpassword()); Εδώ είναι ένα άλλο παράδειγμα για το πώς PersistenceContext ενδέχεται να εκτεθεί ως ένα ασφαλή τύπου bean. Αυτό είναι χαρακτηριστικό του πώς ένα EntityManager EntityManager em; Όλες αυτές οι αναφορές μπορούν να ενοποιηθούν σε ένα ενιαίο αρχείο όπου CustomerDatabase είναι ένα @CustomerDatabase EntityManager em; Η EntityManager μπορεί πλέον να χορηγείται με injection EntityManager em; Ορισμένα αντικείμενα που διατίθενται για injection μπορεί να απαιτήσουν να καταστραφούν. Για παράδειγμα, τα JMS και οι προορισμοί πρέπει να κλείσουν. Εδώ είναι ένα παράδειγμα κώδικα που δείχνει πώς η σύνδεση που παράγεται νωρίτερα μπορεί να κλείσει: void close(@disposes Connection connection) { connection.close(); Σελίδα 125 από 218

127 5.5 Interceptors Οι Interceptors χρησιμοποιούνται για την υλοποίηση διατομεακών προβλημάτων, όπως το logging, το auditing και την ασφάλεια της επιχειρηματικής λογικής. Η προδιαγραφή δεν είναι εντελώς νέα, η έννοια υπήρχε ήδη στην EJB 3,0 προδιαγραφή. Ωστόσο, είναι πλέον σε υψηλότερο επίπεδο, έτσι ώστε να μπορεί να εφαρμόζεται σε ένα ευρύτερο σύνολο των προδιαγραφών στην πλατφόρμα. Οι Interceptors κάνουν ό, τι υπονοείτο όνομά τους, αναχαιτίζουν επικλήσεις και γεγονότα του κύκλου ζωής σε μια κλάση στόχο. Βασικά, ένας interceptor είναι μια κλάση της οποίας οι μέθοδοι γίνονται επίκληση όταν καλούνται οι business μεθοδοι σε μία κλάση στόχο, προκύπτουν τα γεγονότα του κύκλου ζωής όπως είναι οι μέθοδοι που δημιουργούν/καταστρέφουν το bean ή συμβαίνει μια EJB μέθοδος χρονικού ορίου. Οι προδιαγραφές CDI ορίζουν ένα μηχανισμό ασφαλή τύπου για τη συμμετοχή interceptor σε beans χρησιμοποιώντας τα interceptor bindings. Πρέπει να ορίσετε έναν interceptor binding type, προκειμένου να παρακολουθήσει μια επιχειρηματική μέθοδο. Μπορούμε να το κάνουμε αυτό καθορίζοντας Logging { καθορίζει το συστατικό του προγράμματος στο οποίο μπορεί να εφαρμοστεί αυτός ο interceptor. Σε αυτή τη την περίπτωση, η μπορεί να εφαρμοστεί σε μια μέθοδο ή έναν τύπο (κλάση, διασύνδεση ή enum). Ο Interceptor υλοποιείται public class LoggingInterceptor public Object log(invocationcontext context) throws Exception { String name = context.getmethod().getname(); Σελίδα 126 από 218

128 String params = context.getparameters().tostring(); //... return context.proceed(); Προσθέτοντας το σηματοδοτεί αυτή την κλάση ως Interceptor και διευκρινίζει ότι αυτή είναι μια υλοποίηση του προγενέστερου καθορισμένου interceptor binding δείχνει ότι αυτή η μέθοδος interceptor παρεμβάλλεται στις business μεθόδους. Μόνο μια μέθοδος του interceptor μπορεί να επισημανθεί με αυτό το σχόλιο. Το InvocationContext παρέχει πληροφορίες πλαισίου σχετικά με την επίκληση και λειτουργίες και μπορεί να χρησιμοποιηθεί για τον έλεγχο της συμπεριφοράς της αλυσίδας επίκλησης. Το όνομα της business μεθόδου που επικαλείται και οι παράμετροι περνάν σε αυτό για να μπορούν να ανακτηθούν από το πλαίσιο. Αυτός ο interceptor μπορεί να συνδεθεί με οποιαδήποτε managed public class SimpleGreeting { //... Εναλλακτικά, μπορούμε να συνδεθούμε σε καθεμία από τις μεθόδους με την τοποθέτηση του interceptor: public class SimpleGreeting public String greet(string name) { //... Μπορείτε να ορίσετε πολλαπλούς Interceptors χρησιμοποιώντας την ίδια interceptor binding. Από προεπιλογή, όλοι οι interceptors απενεργοποιούνται. Πρέπει να ενεργοποιηθούν ρητά και να διαταχθούν μέσω του μαζί με μια τιμή προτεραιότητας για την κλάση interceptor: Σελίδα 127 από 218

129 @Priority(Interceptor.Priority.APPLICATION+10) public class LoggingInterceptor { //... Πίνακας 7: Οι τιμές προτεραιότητας στην javax.interceptor.interceptor.priority κλάση, ορίζονται στον πίνακα. Οι Interceptors με τις μικρότερες τιμές προτεραιότητας καλούνται πρώτα. Εάν περισσότεροι από έναν interceptor έχουν την ίδια προτεραιότητα, η σχετική σειρά αυτών των interceptor είναι απροσδιόριστη. Ο LoggingInterceptor που ορίστηκε προηγουμένως εκτελείται μετά από όλους τους application-specific interceptor που καλούνται, αλλά πριν οι interceptors ορίζονται από τις βιβλιοθήκες επέκτασης. Μπορείτε επίσης να ενεργοποιήσετε ρητά interceptror καθορίζοντας τους στο beans.xml: <beans xmlns=" xmlns:xsi=" xsi:schemalocation=" bean-discovery-mode="annotated"> <interceptors> <class>org.sample.logginginterceptor</class> </interceptors> </beans> Σελίδα 128 από 218

130 Σημειώστε ότι η πραγματική κλάση υλοποίησης interceptor αναφέρεται εδώ. Ο καθορισμός interceptor bindings παρέχει ένα επίπεδο πλάγιου μέσου αλλά αφαιρεί την dependency από την πραγματική interceptor κλάση υλοποίησης. Επίσης, επιτρέπει να ποικίλει η πραγματική εφαρμογή interceptor με βάση το περιβάλλον ανάπτυξης, καθώς και να παρέχει μια κεντρική διάταξη των interceptors για το αρχείο. Οι interceptors καλούνται στη σειρά με την οποία καθορίζονται μέσα στο <interceptors> συστατικό. Οι Interceptors υποστηρίζουν επίσης dependency injection. Ένας interceptor που προσθέτει τη βασική συμπεριφορά συναλλαγών σε ένα managed bean μπορεί να public class MyTransactionInterceptor UserTransaction public Object managetransaction(invocationcontext context) { tx.begin(); //... Object response = context.proceed(); //... tx.commit(); return response; Η UserTransaction εγχέεται στον interceptor και στη συνέχεια χρησιμοποιείται για να ξεκινήσει και να δεσμεύσει τη συναλλαγή στη μέθοδο MyTransactional μπορεί τώρα να καθοριστεί σε οποιαδήποτε managed beans ή μια μέθοδο της αναγραφής της συναλλακτικής συμπεριφοράς. To Java Transaction API εισάγει έναν new@javax.transaction.transactional σχολιασμό που επιτρέπει σε μια εφαρμογή να ελέγχει τα όρια συναλλαγών για CDI managed beans, καθώς και κλάσεις που ορίζονται ως managed beans, όπως servlets, JAXRS κλάσεις των πόρων και τα τελικά σημεία JAX-WS υπηρεσίας. Σελίδα 129 από 218

131 Ένας interceptor επανάκλησης κύκλου ζωής μπορεί να υλοποιηθεί ως εξής: public class LifecycleInterceptor public void init(invocationcontext context) { //... Ένας EJB interceptor χρονικού ορίου μπορεί να εφαρμοστεί έτσι: public class TimeoutInterceptor public Object timeout(invocationcontext context) { // Decorators Οι διακοσμητές χρησιμοποιούνται για την εφαρμογή των business concerns. Οι Interceptors αγνοούν την business σημασιολογία του bean που επικαλείται και έτσι είναι πιο ευρέως εφαρμόσιμοι, διακοσμητές συμπληρώνουν τους interceptors, καθώς είναι business-semantics-aware και ισχύουν για τα beans ενός συγκεκριμένου τύπου. Ένας διακοσμητής είναι ένα bean που υλοποιεί το bean που διακοσμεί και είναι σχολιασμένο με class MyDecorator implements Greeting { public String greet(string name) { //... Η κλάση decorator μπορεί να είναι abstract, καθώς δεν μπορεί να υλοποιήσει όλες τις μεθόδους του bean. Σελίδα 130 από 218

132 Μια κλάση decorator έχει ένα delegate injection point που αποτελεί το σημείο της έγχυσης για τον ίδιο τύπο, όπως το bean που διακοσμεί. Το delegate injection point ακολουθεί τους συνήθεις κανόνες για έγχυση και επομένως, πρέπει να είναι ένα πεδίο έγχυσης, initializer παράμετρος μεθόδου, ή παράμετρος της μεθόδου του @Any Greeting greeting; Αυτό το delegate injection point διευκρινίζει ότι ο διακοσμητής είναι δεμένος σε όλα τα beans που υλοποιούν Greeting. Ένα delegate injection point μπορεί να καθορίσει qualifiers και ο decorator συνδέεται στη συνέχεια με beans με τα ίδια qualifiers. Από προεπιλογή, όλοι οι διακοσμητές είναι απενεργοποιημένοι και θα πρέπει να ενεργοποιηθούν ρητά και να διαταχθούν μέσω σχολιασμού, μαζί με μια τιμή προτεραιότητας για την class MyDecorator implements Greeting { public String greet(string name) { //... Οι τιμές προτεραιότητας ορίζονται στην javax.interceptor.interceptor.priority κλάση, όπως εξηγήθηκε νωρίτερα. Διακοσμητές με τις μικρότερες τιμές προτεραιότητας καλούνται πρώτοι. Η σειρά περισσοτέρων του ενός διακοσμητή με την ίδια προτεραιότητα είναι απροσδιόριστη. Ένας διακοσμητής που ενεργοποιείται μέσω του είναι ενεργοποιημένος για ολόκληρη την εφαρμογή. Ακριβώς όπως τους interceptors, αυτό σας επιτρέπει να ορίσετε μια κεντρική διάταξη των decorators για αυτό το αρχείο και να μεταρρυθμίσετε την ομάδα διακοσμητών με βάση το περιβάλλον ανάπτυξης. Μπορείτε να ενεργοποιήσετε ένα διακοσμητή, καθορίζοντας τον σε beans.xml: Σελίδα 131 από 218

133 <beans xmlns=" xmlns:xsi=" xsi:schemalocation=" bean-discovery-mode="annotated"> <decorators> <class>org.sample.mydecorator</class> </decorators> </beans> Στην περίπτωση αυτή, ο διακοσμητής είναι ενεργοποιημένος για το αρχείο bean που περιέχει beans.xml. Η σειρά των δηλώσεων διακοσμητή χρησιμοποιώντας <class> καθορίζει τη διάταξη του διακοσμητή. Οι διακοσμητές που συμβαίνουν νωρίτερα στην λίστα ονομάζονται πρώτοι. Οι διακοσμητές που ενεργοποιούνται καλούνται πριν τους διακοσμητές που ενεργοποιούνται μέσω beans.xml. Στην σειρά της εκτέλεσης, οι interceptors για μια μέθοδο καλούνται πριν από τους decorators που ισχύουν για την μέθοδο. 5.7 Scopes και Contexts Ένα bean λέγεται ότι είναι σε scope και συνδέεται με ένα context. Το σχετικό πλαίσιο (context) διαχειρίζεται τον κύκλο ζωής και την προβολή όλων των beans σε αυτό το πεδίο (scope). Ένα bean έχει δημιουργηθεί μία φορά ανά πεδίο εφαρμογής και στη συνέχεια θα ξαναχρησιμοποιηθεί. Όταν ένα bean ζητείται σε ένα συγκεκριμένο πεδίο, ένα νέο στιγμιότυπο δημιουργείται εάν δεν υπάρχει ήδη. Αν δεν υπάρχει, το στιγμιότυπο επιστρέφεται αντ 'αυτού. Το runtime εξασφαλίζει το bean να δημιουργείται στο σωστό πεδίο, εφόσον απαιτείται, ο πελάτης δεν πρέπει να είναι scope-aware. Αυτό παρέχει χαλαρή σύνδεση μεταξύ του πελάτη και του bean που πρέπει να εγχυθεί. Μια συμφραζόμενη αναφορά στο bean δεν είναι μια άμεση αναφορά στο bean (εκτός αν είναι πεδίο). Αντ 'αυτού, είναι ένα client proxy object. Αυτός ο πληρεξούσιος πελάτης είναι υπεύθυνος για τη διασφάλιση ότι το στιγμιότυπο του bean που λαμβάνει επίκληση μεθόδου είναι το στιγμιότυπο που σχετί- Σελίδα 132 από 218

134 ζεται με το τρέχον πλαίσιο. Αυτό σας επιτρέπει να επικαλείστε το bean στην τρέχουσα συγκυρία αντί να χρησιμοποιείτε μια παλιά αναφορά. Αν το bean είναι πεδίο, στη συνέχεια, ο πελάτης κατέχει μια άμεση αναφορά στο στιγμιότυπό του. Ένα νέο στιγμιότυπο του bean είναι συνδεδεμένο με τον κύκλο ζωής του νεοσύστατου αντικείμενου. Ένα bean πεδίο δεν είναι κοινό μεταξύ πολλών σημείων injection. Εάν bean χρησιμοποιείται σε μια έκφραση EL, στη συνέχεια, ένα στι-μιότυπο του bean δημιουργείται για κάθε έκφραση EL. Έτσι, ένα ευρύτερο πλαί-ιο του κύκλου ζωής, όπως ή πρέπει να χρησιμοποιηθεί εάν οι τιμές που αξιολογούνται από την έκφραση EL πρέ-ει να είναι προσβάσιμες σε άλλα beans. Μπορείτε να ορίσετε ένα νέο πεδίο χρησιμοποιώντας το επεκτάσιμο μοντέλο και αλλά γενικά δεν απαιτείται από έναν προγραμματιστή εφαρμογής. 5.8 Στερεότυπα Ένα στερεότυπο συμπυκνώνει αρχιτεκτονικά πρότυπα ή κοινά μεταδεδομένα για τα beans που παράγουν επαναλαμβανόμενους ρόλους σε μια κεντρική θέση. Θα συμπυκνώνει το πεδίο, interceptor bindings, qualifiers και άλλες ιδιότητες του ρόλου. Ένα στερεότυπο είναι ένας meta-σχολιασμός σημειωμένος //... MyStereotype { Ένα στερεότυπο που προσθέτει συναλλακτική συμπεριφοράς μπορεί να @Target(TYPE) Σελίδα 133 από 218

135 @Transactional MyStereotype { Σε αυτόν τον κώδικα, ένα interceptor binding ορίστηκε προηγουμένως, χρησιμοποιείται για να καθορίσει το στερεότυπο. Ένα ενιαίο interceptor binding ορίζει αυτό το στερεότυπο, αντί του interceptor binding. Ωστόσο, σας επιτρέπει να ενημερώσετε τον ορισμό του στερεότυπου αργότερα με άλλα πεδία, qualifiers και ιδιότητες, και στη συνέχεια οι τιμές αυτές εφαρμόζονται αυτόματα στο bean. Ένα στερεότυπο μπορεί να καθοριστεί σε ένα bean στόχο όπως και κάθε άλλο public class MyBean { //... Τα μεταδεδομένα που ορίζονται από το στερεότυπο ισχύουν πλέον για το bean. Ένα στερεότυπο μπορεί να δηλώσει το προεπιλεγμένο πεδίο MyStereotype { Καθορίζοντας αυτό το στερεότυπο σε ένα bean το σηματοδοτεί να εκτός αν το bean ορίζει ρητά το πεδίο. Ένα στερεότυπο μπορεί να δηλώσει το πολύ ένα πεδίο. Ένα στερεότυπο μπορεί να δηλώσει μηδέν, ένα ή πολλά @Target(TYPE) MyStereotype { Σελίδα 134 από 218

136 Προσθέτοντας για τα σημεία ορισμού του στερεότυπου όλα τα beans στόχοι γίνονται alternatives. Τα στερεότυπα μπορούν να στοιβάζονται μαζί για να δημιουργήσουν νέα στερεότυπα, είναι προκαθορισμένα στερεότυπα. Το Model { Αυτό το στερεότυπο παρέχει ένα προεπιλεγμένο όνομα για το bean και σηματοδοτεί Προσθέτοντας αυτό το στερεότυπο σε ένα bean θα του επιτρέψει να περάσει τιμές από μια JSF view σε ένα ελεγκτή, ας πούμε, ένα EJB. 5.9 Events Τα events (γεγονότα) παρέχουν ένα μοντέλο γεγονότος που βασίζεται σε σχολιασμό με βάση το πρότυπο του Observer. Οι producers γεγονότων αυξάνουν τα γεγονότα που καταναλώνονται από τους observers. Το αντικείμενο γεγονότος, τυπικά ένα POJO, μεταφέρει την κατάσταση από τον παραγωγό μέχρι τον κατάναλωτή. Ο producer και ο observer είναι αποσυνδεμένοι πλήρως ο ένας από τον άλλο και επικοινωνούν μόνο με την κατάσταση. Ένας bean producer θα πυροδοτήσει ένα γεγονός χρησιμοποιώντας το Event<Customer> event; //... event.fire(customer); Ένας bean observer, με την ακόλουθη υπογραφή μεθόδου θα λάβει το γεγονός: Σελίδα 135 από 218

137 void Customer event) { //... Σε αυτόν τον κώδικα, ο Customer μεταφέρει την κατάσταση του γεγονότος. Το producer bean μπορεί να καθορίσει μια σειρά από qualifiers όταν κάνετε έγχυση @Added Event<Customer> event; Η υπογραφή της μεθόδου του bean observer πρέπει να ταιριάζει με το ακριβές σύνολο των qualifiers για να λάβουν τα γεγονότα που τροφοδοτούνται από αυτό το bean: void Customer event) { //... Τα qualifiers με παραμέτρους και πολλαπλά qualifiers, μπορεί να καθορίζουν περαιτέρω το πεδίο ενός bean παρατηρητή. Από προεπιλογή, η υπάρχουσα παρουσία του bean ή ένα νέο στιγμιότυπο του bean δημιουργείται στο τρέχων πλαίσιο για να παραδώσει το γεγονός. Αυτή η συμπεριφορά μπορεί να τροποποιηθεί έτσι ώστε το γεγονός να παραδίδεται μόνο αν το bean υπάρχει ήδη στο τρέχον πεδίο: void notifyobserver= Customer event){ //... Συναλλακτικές μέθοδοι παρατηρητή λαμβάνουν ειδοποιήσεις συμβάντων κατά τη διάρκεια ή πριν από την ολοκλήρωση ή μετάαπό τις φάσεις ολοκλήρωσης της συναλλαγής κατά την οποία πυροδοτήθηκε το γεγονός. Η transactionphase προ- Σελίδα 136 από 218

138 σδιορίζει το είδος των μεθόδων συναλλαγών παρατηρητή, όπως ορίζεται στον πίνακα. Πίνακας 8: TransactionPhase Για παράδειγμα, η ακόλουθη μέθοδος παρατηρητή θα καλείται αφού η συναλλαγή έχει ολοκληρωθεί με επιτυχία: void during= Customer event) { //... Ένα γεγονός δεν πυροδοτείται για οποιαδήποτε beans σημειώνονται με ή σε ένα πακέτο σχολιασμένο με Vetoed Φορητές Επεκτάσεις (Portable extensions) Το CDI εκθέτει ένα Service Provider Interface (SPI), επιτρέποντας φορητές επεκτάσεις για την επέκταση της λειτουργικότητας του container εύκολα. Μια φορητή επέκταση μπορεί να ενοποιηθεί με το container: Παρέχοντας δικά της beans, interceptors και decorators στο container Παρέχοντας dependency injection στα δικά της αντικείμενα Παρέχοντας πλαίσιο εφαρμογής για ένα προσαρμοσμένο πεδίο Αυξάνοντας ή αντικαθιστώντας τον σχολιασμό με βάση τα μεταδεδομένα από κάποια άλλη πηγή Εδώ είναι μια απλή επέκταση: Σελίδα 137 από 218

139 public class MyExtension implements Extension { <T> void ProcessAnnotatedType<T> pat) { Logger.global.log(Level.INFO, "processing annotation: {0", pat. getannotatedtype(). getjavaclass(). getname()); Η επέκταση αυτή θα εκτυπώσει την λίστα των σχολίων σε beans συσκευασμένα σε μια εφαρμογή web. Η επέκταση πρέπει να εφαρμόσει το Extension marker interface. Στη συνέχεια πρέπει να εγγράψει αυτήν την επέκταση, χρησιμοποιώντας το μηχανισμό service provider, δημιουργώντας ένα αρχείο με όνομα META-INF/services/ javax.enterprise.inject.spi.extension. Αυτό το αρχείο περιέχει τo πλήρως αναγνωρισμένο όνομα της κλάσης για την εφαρμογή της επέκτασης: org.sample.myextension Πίνακας 9: Το bean μπορεί να ακούσει μια ποικιλία των γεγονότων container του κύκλου ζωής, όπως παρατίθενται στον πίνακα. Σελίδα 138 από 218

140 Κάθε ένα από αυτά τα γεγονότα επιτρέπει μια φορητή επέκταση να ενσωματωθεί με την προετοιμασία του container. Για παράδειγμα, η BeforeBeanDiscovery μπορεί να χρησιμοποιηθεί για την προσθήκη νέων interceptors, qualifiers, πεδίων και στερεότυπων σε ένα υπάρχων bean. Ο BeanManager παρέχει λειτουργίες για τη λήψη πλαισίων αναφορών για τα beans, μαζί με πολλές άλλες λειτουργίες χρήσης σε φορητές επεκτάσεις. Μπορεί να εγχέεται στις observer μεθόδους ως εξής: <T> void ProcessAnnotatedType<T> pat, BeanManager bm) { //... Ο BeanManager είναι επίσης διαθέσιμος για έγχυση τομέα και μπορεί να ανευρεθεί από το όνομα java: comp / BeanManager Built-in Beans Ένα Java EE ή ενσωματωμένο container EJB πρέπει να παρέχει τα ακόλουθα built-in beans, όλα εκ των οποίων έχουν το Ένα bean με τον τύπο bean javax.transaction.usertransaction, επιτρέποντας την έγχυση μιας αναφοράς στην JTA public class SimpleGreeting UserTransaction ut; //... public String greet(string name) { ut.start(); //... ut.commit(); Σελίδα 139 από 218

141 Σε αυτόν τον κώδικα, ένα στιγμιότυπο UserTransaction εγχέεται σε μια beanmanaged transaction EJB. Το στιγμιότυπο, μπορεί να χρησιμοποιηθεί για να ξεκινήσει και να δεσμεύσει / επαναφέρει τη συναλλαγή. Ένα bean με τον τύπο bean javax.security.principal, επιτρέποντας την έγχυση ενός Principal, αντιπροσωπεύει την τρέχουσα ταυτότητα του public class SimpleGreeting Principal principal; public String greet(string name) { if (principal.getname().equals("manager")) { //... else { //... Σε αυτόν τον κώδικα, ένα Principal στιγμιότυπο εγχέεται σε ένα EJB. Το στιγμιότυπο της έγχυσης μπορεί να χρησιμοποιηθεί για να ελέγξετε το όνομα του κύριου ασφαλείας. Ένα container servlet πρέπει να προσκομίσει τα ακόλουθα built-in beans, τα οποία έχουν τo Ένα bean με τον τύπο bean javax.servlet.http.httpservletrequest, επιτρέποντας την έγχυση μιας αναφοράς στην HttpServletRequest request; Ένα bean με τον τύπο bean javax.servlet.http.httpsession, επιτρέποντας την έγχυση μιας αναφοράς στην HttpSession session; Ένα bean με τον τύπο bean javax.servlet.servletcontext, επιτρέποντας την έγχυση μιας αναφοράς στην ServletContext: Σελίδα 140 από 218

142 @Inject ServletContext context; 5.12 Επανακλήσεις του Κύκλου Ζωής Το πρότυπο σχολιασμού javax.annotation.postconstruct και javax.annotation. PreDestroy από το JSR 250 μπορεί να εφαρμοστεί σε οποιεσδήποτε μεθόδους σε ένα bean για να εκτελέσει την προετοιμασία των πόρων ή το καθάρισμα: public class MyBean public void setupresources() { public void cleanupresources() { //... public String sayhello() { return "Hello " + name; Η μέθοδος setupresources είναι εκεί όπου όλοι οι πόροι που απαιτούνται κατά τη διάρκεια της εκτέλεσης της business μεθόδου μπορούν να αποκτηθούν και η μέθοδος cleanupresources είναι εκεί όπου οι πόροι αυτοί είναι κλειστοί ή απελευθερώνονται. Οι μέθοδοι επανάκλησης του κύκλου ζωής επικαλούνται μετά τον no-args δομητή. Σελίδα 141 από 218

143 6. Java Persistence (JPA) Το Java Persistence API ορίζει ένα API για τη διαχείριση της persistence και του αντικειμενοσχεσιακού σχεδιασμού χρησιμοποιώντας ένα domain μοντέλο Java. Ένας πίνακας της βάσης δεδομένων, συνήθως με πολλές στήλες, αποθηκεύει την επίμονη κατάσταση (persistent state) της εφαρμογής. Πολλαπλές σειρές αποθηκεύονται στον πίνακα της βάσης δεδομένων για να καταγραφούν διαφορετικές καταστάσεις. Μια ενιαία στήλη ή ο συνδυασμός των στηλών μπορεί να καθορίσει τη μοναδικότητα της κάθε σειράς, χρησιμοποιώντας περιορισμό πρωτεύοντος κλειδιού. Τυπικά, μια εφαρμογή αποκτά πρόσβαση και αποθηκεύει δεδομένα σε πολλαπλούς πίνακες. Οι πίνακες αυτοί έχουν σχέσεις ορισμένες μεταξύ τους χρησιμοποιώντας περιορισμό ξένου κλειδιού. Το JPA καθορίζει ένα πρότυπο χαρτογράφησης μεταξύ ενός πίνακα βάσης δεδομένων και ενός POJO. Ορίζει συντακτικό για να συλλάβει τους πρωτεύοντες και ξένους περιορισμούς κλειδιού και πώς μπορούν να δημιουργηθούν αυτές οι γραμμέ, να διαβαστούν, να ενημερωθούν και να διαγραφούν χρησιμοποιώντας αυτές τις POJO. Συναλλαγές, προσωρινή αποθήκευση, επικύρωση και άλλες παρόμοιες ικανότητες απαιτούνται από μια εφαρμογή για την πρόσβαση σε μια βάση δεδομένων που ορίζεται επίσης από το JPA. 6.1 Entities (οντότητες) Ένα POJO με έναν no-arg public δομητή χρησιμοποιείται για να καθορίσει την αντιστοίχιση με έναν ή περισσότερους σχεσιακούς πίνακες της βάσης δεδομένων. Κάθε τέτοια κλάση σχολιασμένη και τα στιγμιότυπα των μεταβλητών που ακολουθούν ιδιότητες στυλ JavaBeans αντιπροσωπεύουν την επίμονη κατάσταση της οντότητας. Η αντιστοίχιση μεταξύ της στήλης του πίνακα και του ονόματος του πεδίου προέρχεται ακλουθώντας προεπιλεγμένες τιμές και μπορεί να παρακαμφθεί από τους σχολιασμούς. Για παράδειγμα, το όνομα του πίνακα είναι το ίδιο με το όνομα της κλάσης, καθώς και τα ονόματα των στηλών είναι η ίδια με ονόματα τομέα επιμονής. Εδώ είναι ένας απλός ορισμός οντότητας που περιγράφει ένα φοιτητή: Σελίδα 142 από 218

144 @Entity public class Student implements Serializable private int id; private String name; private String private List<Course> courses; //... Λίγα πράγματα που πρέπει να παρατηρηθούν σε αυτόν τον κώδικα: Η κλάση αυτή έχει ένα δομητή no-arg από προεπιλογή, καθώς δεν υπάρχουν άλλοι δομητές που καθορίζονται. Η επίμονη κατάσταση της οντότητας ορίζεται από τέσσερα πεδία, η ταυτότητα ορίζεται από το id τομέα σχολιασμένο Ένα σύνθετο πρωτεύον κλειδί μπορεί επίσης να οριστεί όπου το πρωτεύον κλειδί αντιστοιχεί σε ένα ή περισσότερα πεδία της κλάσης της οντότητας. Η κλάση υλοποιεί ένα Serializable interface και αυτό του επιτρέπει να περάσει τιμή μέσω απομακρυσμένης διεπαφής. Η Address είναι μια κατηγορία POJO που δεν έχει μια ταυτότητα επιμονής δική της και ανήκει αποκλειστικά στην Student κλάση. Η κλάση αυτή ονομάζεται ως embeddable class, που προσδιορίζεται στο πεδίο της κλάσης οντότητας και είναι σχολιασμένη στον ορισμό της public class Address { private String street; private String city; private String zip; Σελίδα 143 από 218

145 Αυτό επιτρέπει τη δομή της βάσης δεδομένων να χαρτογραφηθεί πιο φυσικά σε Java. Το σημαίνει ότι τα μαθήματα ενός μαθητή καταγράφονται σε ένα διαφορετικό πίνακα. Από προεπιλογή, θα προκύψει το όνομα του πίνακα, συνδυάζοντας το όνομα της κλάσης του, το string "_" και το όνομα του πεδίου. μπορεί να χρησιμοποιηθεί για να παρακάμψετε το προεπιλεγμένο όνομα του πίνακα, και μπορεί να χρησιμοποιηθεί για να παρακάμψετε τα προεπιλεγμένα ονόματα των στηλών. μπορεί επίσης να εφαρμοστεί σε μια ενσωματωμένη κλάση. Τα πεδία επιμονής ή οι ιδιότητες μιας οντότητας μπορεί να ανήκουν στους ακόλουθους τύπους: Java primitive java.lang.string java.math.biginteger και java.math.bigdecimal java.util.date και java.util.calendar, σχολιασμός μπορεί να ορίζεται σε πεδία τύπου java.util.date και java.util.calendar για να υποδείξει τον προσωρινό τύπο του πεδίου java.sql.date, java.sql.time και java.sql.timestamp byte [], Byte [], char [], char [], enums και άλλους τύπους Java Τύπους οντότητας, συλλογές τύπων οντοτήτων, ενσωματωμένες κλάσεις και συλλογές των βασικών και των ενσωματωμένων κλάσεων Μια οντότητα μπορεί να κληρονομήσει από μια υπερκλάση που παρέχει την επίμονη κατάστασης της οντότητας και πληροφορίες χαρτογράφησης, αλλά η ίδια μπορεί ή δεν μπορεί να είναι μια οντότητα. Μια υπερκλάση οντότητας είναι abstract και δεν μπορεί να αρχικοποιείται άμεσα, αλλά μπορεί να χρησιμοποιηθεί για τη δημιουργία πολυμορφικών ερωτημάτων. σχολιασμοί χρησιμοποιούνται για να καθορίσουν την κληρονομιά από μια οντότητα υπερκλάσης. Ο χρησιμοποιείται για να ορίσει μια nonentity superclass και Σελίδα 144 από 218

146 συλλαμβάνει πληροφορίες κατάστασης και χαρτογράφησης που είναι κοινές για πολλαπλές οντότητες κλάσεων. Μια τέτοια κλάση δεν έχει ξεχωριστό πίνακα που ορίζεται για αυτό, έτσι ώστε οι αντιστοιχίσεις θα ισχύουν μόνο για τις υποκατηγορίες της. Μια οντότητα μπορεί να κληρονομήσει από μια υπερκλάση που παρέχει μόνο συμπεριφορά κληρονομικότητας. Μια τέτοια κλάση δεν περιέχει καμία επίμονη κατάσταση. Μπορείτε να προσδιορίσετε τις σχέσεις μεταξύ των διαφόρων φορέων @ManyToOne σχολιασμούς στο αντίστοιχο πεδίο της αντίστοιχης οντότητας. Μια μονόδρομη σχέση απαιτεί την πλευρά owning να καθορίσει το σχολιασμό. Μια αμφίδρομη σχέση απαιτεί επίσης την nonowning πλευρά να αναφερθεί στην owning πλευρά με τη χρήση του στοιχείου mappedby του OneToOne, OneToMany ή Many ToMany σχολιασμού. Ο σχολιασμός FetchType.EAGER μπορεί να καθοριστεί σε μια οντότητα για να φορτώσει δεδομένα από τη βάση δεδομένων. Ο σχολιασμός FetchType.LAZY μπορεί να οριστεί ως μια ένδειξη ότι τα δεδομένα πρέπει να πιαστούν νωχελικά, όταν είναι πρώτη φορά προσβάσιμα. Οι οντότητες μπορούν να εμφανίσουν μια συλλογή των στοιχείων και των σχέσεων οντότητας ως τις java.util.map συλλογές. Το κλειδί του χάρτη μπορεί να είναι το πρωτεύον κλειδί ή ένα επίμονο πεδίο ή ιδιότητα της οντότητας. χρησιμοποιείται για να καθορίσει το κλειδί για την ένωση.για παράδειγμα, όλα τα μαθήματα ενός φοιτητή μπορούν να μοντελοποιηθούν ως : public class Student private Map<Integer, Course> courses; //... Σε αυτόν τον κώδικα, στο Map δείχνει ότι το κλειδί χάρτης είναι επίσης το πρωτέυον κλειδί. Σελίδα 145 από 218

147 Το κλειδί του χάρτη μπορεί να είναι ένας βασικός τύπος, μια ενσωματωμένη κλάση ή μια οντότητα. Εάν ένας επίμονος τομέας ή ιδιότητα, εκτός από το πρωτεύον κλειδί χρησιμοποιείται ως map key, τότε αναμένεται να έχει μια μοναδικότητα περιορισμών που συνδέονται με αυτόν. Σε αυτή την περίπτωση, χρησιμοποιείται για να προσδιορίσει τη χαρτογράφηση για την βασική στήλη του χάρτη: public class Student private Map<Integer, Course> courses; //... Σε αυτόν τον κώδικα, Map αντιπροσωπεύει όλα τα μαθήματα που γίνονται από έναν φοιτητή σε ένα χρόνο. Εάν το στοιχείο name δεν έχει καθοριστεί, από προεπιλογή γίνεται με την συνένωση των εξής: το όνομα του πεδίου των σχέσεων συσχέτισης ή της ιδιότητας, "_" και "KEY". Σε αυτή την περίπτωση, το προεπιλεγμένο όνομα θα είναι COURSES_KEY. μπορεί να χρησιμοποιηθεί για να καθορίσετε το κλειδί του χάρτη για την ένωση. Εάν η τιμή είναι μια οντότητα, μπορεί να χρησιμοποιηθεί για να διευκρινίσει τη χαρτογράφηση: public class private Map<PhoneType, Phone> phones; //... και αλληλοαναιρούνται. Αν η τιμή είναι ένας βασικός τύπος ή ενσωματωμένη κλάση, τότε χρησιμοποιείται για διευκρινίζει τη χαρτογράφηση. Σελίδα 146 από 218

148 6.2 Persistence Unit, Persistence Context και Entity Manager Μια οντότητα επεξεργάζεται μέσα σε ένα persistence context. Κάθε οντότητα έχει ένα μοναδικό στιγμιότυπο για οποιαδήποτε επίμονη ταυτότητα οντότητας στο πλαίσιο. Στο πλαίσιο επιμονής, τα στιγμιότυπα οντότητας και του κύκλου ζωής τους τα διαχειρίζεται ο entity manager. Ο διαχειριστής οντότητας μπορεί να είναι container-managed ή application-managed. Ένας container-managed διαχειριστής οντότητας λαμβάνεται από την εφαρμογή απευθείας μέσω dependency EntityManager em; Ο διαχειριστής οντότητας μπορεί επίσης να ληφθεί μέσω Context context = new InitialContext(); EntityManager em = context.lookup("java:comp/env/persistence/myjndi"); Σε αυτόν τον κώδικα, θα εκχωρήσετε ένα όνομα JNDI στο διαχειριστή οντότητας και στη συνέχεια θα αναζητήσετε χρησιμοποιώντας InitialContext. Το persistence context διαδίδεται σε πολλαπλές συναλλαγές για έναν container-managed διαχειριστή οντότητας και το container είναι υπεύθυνο για τη διαχείριση του κύκλου ζωής του διαχειριστή της οντότητας. Ο application-managed διαχειριστής οντότητας αποκτάται από την εφαρμογή από μία οντότητα factory EntityManagerFactory emf; //... EntityManager em = emf.createentitymanager(); Ένα νέο απομονωμένο persistence context δημιουργείται όταν ζητείται νέος διαχειριστής οντότητας και η εφαρμογή είναι υπεύθυνη για τη διαχείριση του κύκλου ζωής του διαχειριστή οντότητας. Σελίδα 147 από 218

149 Ένας container-managed διαχειριστής οντότητας συνήθως χρησιμοποιείται σε περιβάλλον Java EE. Ο application-managed διαχειριστής οντότητας συνήθως χρησιμοποιείται σε περιβάλλον Java SE. Ένας διαχειριστής οντότητας και το persistence context δεν απαιτείται να είναι threadsafe. Αυτό απαιτεί ένας διαχειριστής οντότητας να λαμβάνεται από ένα factory διαχειριστή οντότητας στα Java EE συστατικά που δεν απαιτείται να είναι threadsafe, όπως servlets. Οι διαχειριστές οντότητας, μαζί με πληροφορίες για τη διαμόρφωσή τους, το σύνολο των οντοτήτων που διαχειρίζονται οι διαχειριστές οντότητας και τα μεταδεδομένα που καθορίζουν τη χαρτογράφηση των κλάσεων στη βάση δεδομένων, είναι συσκευασμένα μαζί ως μία persistence unit. Μια persistence unit ορίζεται από ένα αρχείο persistence.xml και περιέχεται μέσα σε ένα EJB -jar,.war,.ear, ή application-client JAR. Πολλαπλές μονάδες επιμονής μπορεί να οριστούν σε ένα αρχείο persistence.xml. Ένα persistence.xml δείγμα για την οντότητα μπορεί να οριστεί σαν αυτό: <?xml version="1.0" encoding="utf-8"?> <persistence version="2.1" xmlns=" xmlns:xsi=" xsi:schemalocation= " <persistence-unit name="mypu" transaction-type="jta"> <jta-data-source>jdbc/sample</jta-data-source> <exclude-unlisted-classes> false </exclude-unlisted-classes> <properties/> </persistence-unit> </persistence> Σε αυτόν τον κώδικα : Σελίδα 148 από 218

150 Το όνομα της persistence unit είναι MyPU. Η transaction-type τιμή της ιδιότητας του JTA σημαίνει ότι μια πηγή δεδομένων JTA είναι διαθέσιμη. Το στοιχείο JTA -data -source καθορίζει το συνολικό όνομα JNDI, της πηγής δεδομένων JTA που ορίζεται στο container. Σε ένα περιβάλλον Java EE, αυτό εξασφαλίζει ότι όλες οι πληροφορίες ρύθμισης παραμέτρων της βάσης δεδομένων, όπως host, το port, το όνομα χρήστη και ο κωδικός πρόσβασης, καθορίζονται στο container και μόνο το όνομα της προέλευσης δεδομένων JTA χρησιμοποιείται στην εφαρμογή. Μπορείτε να καθορίσετε μια σαφή λίστα των κλάσεων οντοτήτων που θα διαχειρίζεται με τη χρήση πολλαπλών class στοιχείων ή να περιλαμβάνει όλες τις οντότητες ( όπως παραπάνω ), καθορίζοντας το exclude-unlisted-classes στοιχείο. Το <properties> στοιχείο χρησιμοποιείται για να καθορίσει πρότυπες και συγκεκριμένων προμηθευτών ιδιότητες. Οι ακόλουθες πρότυπες ιδιότητες μπορεί να καθορίζονται: - javax.persistence.jdbc.driver - javax.persistence.jdbc.url - javax.persistence.jdbc.user - javax.persistence.jdbc.password Το JPA 2.1 εισάγει νέα javax.persistence.schema-generation. * ονόματα ιδιοτήτων που επιτρέπουν τη δημιουργία των αντικειμένων βάσης δεδομένων. Η Java EE 7 πλατφόρμα ορίζει μια νέα προεπιλεγμένη DataSource που πρέπει να παρέχεται από μια Java EE 7 runtime. Αυτή η προδιαμορφωμένη πηγή δεδομένων μπορεί να χρησιμοποιηθεί από την εφαρμογή για την πρόσβαση της σχετιζόμενης βάσης δεδομένων. Είναι προσβάσιμη στην εφαρμογή σύμφωνα με το όνομα JNDI: java:comp/defaultdatasource Το αρχείο persistence.xml μπορεί στη συνέχεια να προσδιοριστεί: <?xml version="1.0" encoding="utf-8"?> <persistence version="2.1" xmlns=" xmlns:xsi=" Σελίδα 149 από 218

151 xsi:schemalocation= " <persistence-unit name="mypu" transaction-type="jta"> <jta-data-source>java:comp/defaultdatasource</jta-data-source> </persistence-unit> </persistence> Η προδιαγραφή JPA2.1 λέει ότι αν το JTA-data-source ή το non-jtadata-source στοιχείο δεν έχει καθοριστεί, ο deployer πρέπει να καθορίσει μια πηγή δεδομένων JTA σε ανάπτυξη ή η JTA default πηγή δεδομένων πρέπει να παρέχεται από το container και ένα JTA EntityManagerFactory θα δημιουργηθεί για να αντιστοιχηθεί σε αυτό. Αυτό το αρχείο persistence.xml που ορίστηκε προηγουμένως είναι σημασιολογικά ισοδύναμο με: <?xml version="1.0" encoding="utf-8"?> <persistence version="2.1" xmlns=" xmlns:xsi=" xsi:schemalocation= " <persistence-unit name="mypu" transaction-type="jta"> </persistence-unit> </persistence> Και στις δύο περιπτώσεις, η προεπιλεγμένη πηγή δεδομένων θα πρέπει να τροφοδοτηθεί και να είναι διαθέσιμη στην εφαρμογή. Από προεπιλογή, το container-managed persistence context έχει ως πεδίο μια απλή συναλλαγή και οι οντότητες αποσπώνται στο τέλος της συναλλαγής. Για stateful session beans, το persistence context μπορεί να επισημαίνεται για να καλύπτει πολλαπλές συναλλαγές και ονομάζεται extended persistence context. Οι οντότητες παραμένουν διαχειρίσημες σε πολλαπλές συναλλαγές σε αυτήν την περίπτωση. Ένα extended persistence context μπορεί να EntityManager em; Σελίδα 150 από 218

152 Στο JPA 2, το persistence context είναι του τύπου SynchronizationType. SYNCHRONIZED. Ένα τέτοιο πλαίσιο συνδέεται αυτόματα με την τρέχουσα συναλλαγή JTA και οι ενημερώσεις που γίνονται στο persistence context πολλαπλασιάζονται με τον διαχειριστή πόρων (δηλ., αποθηκεύονται στη βάση δεδομένων). Το JPA 2.1 εισάγει SynchronizedType.UNSYNCHRONIZED. Ένα τέτοιο persistence context δεν είναι εισηγμένο σε οποιαδήποτε συναλλαγή JTA εκτός αν εντάχθηκε ρητά στην εν λόγω συναλλαγή από την EntityManager em; Ένας τέτοιος EntityManager μπορεί να κινητοποιηθεί σε μια συναλλαγή JTA και είναι καταχωρημένος για μεταγενέστερες γνωστοποιήσεις των συναλλαγών με την επίκληση της EntityManager.joinTransaction. Το persistence context παραμένει ενωμένο με τη συναλλαγή μέχρι η συναλλαγή να γίνει ή να οπισθοχωρήσει. Το persistence context παραμένει μη συγχρονισμένo μετά από αυτό και πρέπει ρητά να ενταχθεί σε μια συναλλαγή στο νέο πεδίο. Η εφαρμογή μπορεί να επικαλεστεί την persist, merge, remove και refresh οντότητα του κύκλου ζωής σε ένα συγχρονισμένο persistence context. Μετά την ένταξή της συναλλαγής, οποιεσδήποτε αλλαγές στο persistence context μπορούν να ξεπλυθούν στη βάση δεδομένων, είτε ρητώς από την εφαρμογή μέσω flush είτε από τον πάροχο. Αν δεν ξεπλυθεί ρητά, τότε ο πάροχος persistence μπορεί να αναβάλει την flush μέχρι να περάσει χρόνος, ανάλογα με τις εργασίες που επικαλούνται και η ρύθμιση flush μπαίνει σε ισχύ. 6.3 Schema Generation Το JPA 2.1 στην Java EE 7 πλατφόρμα εισάγει μια νέα σειρά από ιδιότητες που επιτρέπουν την παραγωγή των αντικειμένων βάσης δεδομένων, όπως πίνακες, ευρετήρια και περιορισμούς σε ένα σχήμα βάσης δεδομένων. Ενδέχεται να γίνει ή όχι η παραγωγή ενός κατάλληλου σχήματος βάσης δεδομένων ανάλογα με τις πιστοποιήσεις και την έγκριση του χρήστη.αυτό βοηθά στην προτυποποίηση της εφαρμογής σας όταν ικανοποιούνται τα απαιτούμενα αντικείμενα που δημιουργούνται πριν από την εγκατάσταση της εφαρμογής ή μέρος της δημιουργίας Σελίδα 151 από 218

153 EntityManagerFactory. Αυτό είναι επίσης χρήσιμο σε περιβάλλοντα που απαιτούν τροφοδότηση μιας βάσης δεδομένων για τη ζήτηση (π.χ. σε ένα cloud). Αυτό το χαρακτηριστικό θα επιτρέψει το JPA domain μοντέλο αντικειμένου σας να δημιουργείται άμεσα σε μια βάσης δεδομένων. Το παραγόμενο σχήμα μπορεί να χρειαστεί να συντονιστεί για το πραγματικό περιβάλλον παραγωγής. Αυτή η περίπτωση χρήσης υποστηρίζεται, επιτρέποντας την παραγωγή του σχήματος να συμβεί σε DDL scripts, τα οποία μπορούν στη συνέχεια να ρυθμιστούν περαιτέρω με ένα DBA. Μια εφαρμογή που απαιτεί πίνακες της βάσης δεδομένων να δημιουργηθούν μέσω των scripts ομαδοποιούνται στον κατάλογο META-INF της εφαρμογής και μπορούν να έχουν την ακόλουθη persistence.xml: <persistence version="2.1" xmlns=" xmlns:xsi=" xsi:schemalocation=" <persistence-unit name="mypu" transaction-type="jta"> <properties> <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> <property name="javax.persistence.schema-generation.create-source" value="script"/> <property name="javax.persistence.schema-generation.drop-source" value="script"/> <property name="javax.persistence.schema-generation.create-script-source" value="meta-inf/create.sql"/> <property name="javax.persistence.schema-generation.drop-script-source" value="meta-inf/drop.sql"/> <property name="javax.persistence.sql-load-script-source" value="meta-inf/load.sql"/> </properties> </persistence-unit> </persistence> Σελίδα 152 από 218

154 Οι συνήθεις σχολιασμοί, χρησιμοποιούνται για να καθορίσουν το παραγόμενο σχήμα. Διάφορα στρώματα μπορεί να συμμετέχουν. Για παράδειγμα, το όνομα του πίνακα είναι προεπιλεγμένο από το όνομα της οντότητας και το όνομα της οντότητας (η οποία μπορεί να καθορίζεται ρητώς) είναι προεπιλεγμένο από το όνομα της κλάσης. Ωστόσο, σχόλια μπορούν να χρησιμοποιηθούν για να παρακάμψετε ή να προσαρμόσετε τις public class Employee private int id; private String private Department dept; Η οντότητα αυτή δημιουργείται στη βάση δεδομένων με τα ακόλουθα χαρακτηριστικά: Χαρτογραφεί στον πίνακα EMPLOYEE στo προεπιλεγμένo σχήμα. Το πεδίο id χαρτογραφείται στη στήλη ID ως το πρωτεύον κλειδί. Το όνομα αντιστοιχίζεται στην στήλη NAME με ένα προεπιλεγμένο VARCHAR (255). Το μήκος του εν λόγω τομέα μπορεί εύκολα να ρυθμιστεί αντιστοιχίζεται στην στήλη εξωτερικού κλειδιού DEPT_ID και μπορεί να προσαρμοστεί μέσω JOIN_COLUMN. Εκτός από αυτές τις ιδιότητες, ένα ζευγάρι νέων σχολίων προστίθενται JPA Ένας δείκτης για το πρωτεύον κλειδί δημιουργείται από προεπιλογή σε μια βάση δεδομένων. Αυτός ο νέος σχολιασμός θα σας επιτρέψει να ορίσετε επιπλέον δείκτες, πάνω από μια ή πολλές στήλες, για καλύτερη απόδοση. Αυτό καθορίζεται ως και = { Σελίδα 153 από 218

155 DESC") public class Employee { //... Στην περίπτωση αυτή, ο πίνακας που παράγεται θα έχει ένα προεπιλεγμένο δείκτη για το πρωτεύον κλειδί. Επιπλέον, δύο νέοι δείκτες καθορίζονται στη στήλη NAME και το ξένο κλειδί χαρτογραφεί το τμήμα με φθίνουσα Αυτό χρησιμοποιείται για να καθορίσει έναν περιορισμό ξένου κλειδιού ή με άλλο τρόπο να παρακάμψει ή να απενεργοποιήσει το default ορισμό ξένου κλειδιού του παρόχου επιμονής. Μπορεί να καθορίζεται ως μέρος του JoinColumn (s), MapKeyJoinColumn (s), και PrimaryKeyJoinColumn public class Employee private int id; private foreignkeydefinition="foreign KEY (MANAGER_ID) REFERENCES MANAGER")) private Manager manager; //... Σε αυτή την οντότητα, o διαχειριστής του employee χαρτογραφείται από τη στήλη MANAGER_ID στον πίνακα MANAGER. Η τιμή της foreignkeydefinition θα είναι μια βάση δεδομένων συγκεκριμένου string. 6.4 Δημιουργία, ανάγνωση, ενημέρωση και διαγραφή οντοτήτων Μια οντότητα περνά μέσα από τις πράξεις δημιουργίας, ανάγνωσης, ενημέρωσης και διαγραφής (CRUD) κατά τη διάρκεια του κύκλου ζωής. Μια πράξη ανάγνωσης σημαίνει τη δημιουργία μιας νέας οντότητας και επιμονή της στη βάση δεδομένων.μια λειτουργία ανάγνωσης σημαίνει ερώτημα για μια οντότητα από τη βάση Σελίδα 154 από 218

156 δεδομένων με βάση τα επιλεγμένα κριτήρια. Μια λειτουργία ενημέρωσης σημαίνει επικαιροποίηση της κατάστασης της υφιστάμενης οντότητας στη βάση δεδομένων και μια λειτουργία διαγραφής σημαίνει εξάλειψη μιας οντότητας από τη βάση δεδομένων. Τυπικώς,μια οντότητα έχει δημιουργηθεί μία φορά, η ανάγνωση και η ενημέρωση μερικές φορές και η διαγραφή μία φορά. Η προδιαγραφή JPA περιγράφει τους ακόλουθους τρόπους για την εκτέλεση CRUD εργασιών: Java Persistence Query Language (JPQL): Η Java Persistence Query Language είναι μια γλώσσα επερωτήσεων που βασίζεται σε string και χρησιμοποιείται για να καθορίσει τα ερωτήματα επί οντοτήτων και την κατάσταση επιμονής τους. Η γλώσσα χρησιμοποιεί ένα ερώτημα SQL όπως η σύνταξη και χρησιμοποιεί το αφηρημένο σχήμα επιμονής των οντοτήτων, όπως τα στοιχεία του μοντέλου. Αυτή η σύνταξη της φορητής γλώσσας ερωτημάτων μεταφράζεται σε ερωτήματα SQL που εκτελούνται σ το σχήμα της βάσης δεδομένων, όπου οι οντότητες είναι χαρτογραφημένες. Οι EntityManager.createNamedXXX μέθοδοι χρησιμοποιούνται για να δημιουργήσουν τις δηλώσεις JPQL. Οι δηλώσεις του ερωτήματος μπορούν να χρησιμοποιηθούν για την επιλογή, την ενημέρωση ή τη διαγραφή γραμμών από τη βάση δεδομένων. Criteria API: Το Criteria API είναι ένα αντικείμενο object-based και type-safe API και λειτουργεί σε ένα μεταμοντέλο των οντοτήτων. Τα criteria ερωτήματα είναι πολύ χρήσιμα για την κατασκευή δυναμικών ερωτημάτων. Τυπικώς,οι static κλάσεις μεταμοντέλου παράγονται μέσω ενός επεξεργαστή σχολιασμών και μοντελοποιούν την επίμονη κατάσταση και τις σχέσεις των οντοτήτων. Τα javax.persistence.criteria και javax.persistence.metamodel APIs χρησιμοποιούνται για τη δημιουργία των strongly type ερωτημάτων. Native δήλωση SQL: Δημιουργεί ένα εγγενές ερώτημα SQL ειδικά σε μια βάση δεδομένων. χρησιμοποιείται για να διευκρινίζει τη χαρτογράφηση από το αποτέλεσμα ενός εγγενούς ερωτήματος SQL. Οι EntityManager.createNativeXXX μέθοδοι χρησιμοποιούνται για τη δημιουργία εγγενών ερωτημάτων. Σελίδα 155 από 218

157 Μια νέα οντότητα μπορεί να παραμείνει στη βάση δεδομένων με ένα διαχειριστή οντότητας: Student student = new Student(); student.setid(1234); //... em.persist(student); Σε αυτόν τον κώδικα, em είναι ένας διαχειριστής οντότητας που αποκτήθηκε όπως εξηγήθηκε προηγουμένως. Η οντότητα αυτή παραμένει στη βάση δεδομένων στην πράξη της συναλλαγής. Μια απλή δήλωση JPQL για την αναζήτηση όλων των οντοτήτων Student και την ανάκτηση των αποτελεσμάτων μοιάζει έτσι: em.createquery("select s FROM Student s").getresultlist(); χρησιμοποιούνται για να καθορίσουν μια αντιστοίχιση μεταξύ μιας στατικής JPQL δήλωσης ερωτήματος και ένα συμβολικό όνομα. Αυτό ακολουθεί το «Don t repeat Yourself" (DRY) πρότυπο σχεδιασμού και σας επιτρέπει να συγκεντρώσετε τις δηλώσεις name="findstudent" value="select s FROM Student s WHERE p.grade = :grade") //... Query query = em.createnamedquery("findstudent"); List<Student> list = List<Student>query.setParameter("grade", "4").getResultList(); Ο κώδικας αυτός θα ρωτήσει στη βάση δεδομένων για όλους τους σπουδαστές με βαθμό 4 και επιστρέφει το αποτέλεσμα ως List <Student>. Η συνήθης WHERE, GROUP BY, HAVING, και ORDER BY ρήτρες μπορούν να προσδιορίζονται στις JPQL δηλώσεις για να περιορίσουν τα αποτελέσματα που επιστρέφονται από το ερώτημα. Άλλες λέξεις-κλειδιά SQL, όπως JOIN και DISTINCT και λειτουργίες όπως το ABS, MIN, SIZE, SUM και TRIM επίσης επιτρέπονται. Οι χειριστές KEY, VALUE και ENTRY μπορεί να εφαρμοστούν όταν χαρτογραφημένες ενώσεις ή συλλογές επιστρέφονται. Σελίδα 156 από 218

158 Ο τύπος επιστροφής της λίστας των αποτελεσμάτων των ερώτηματων μπορεί να καθορίζεται: TypedQuery<Student> query = em.createnamedquery( "findstudent", Student.class); List<Student> list = query.setparameter("grade", "4").getResultList(); Τυπικά, ένας πάροχος επιμονής θα προμεταγλωττίσει τα static ερωτήματα. Μπορείτε να ορίσετε ένα δυναμικό ερώτημα JPQL απευθείας περνώντας το ερώτημα string στην αντίστοιχη μέθοδο createquery: TypedQuery<Student> query = em.createquery( "SELECT s FROM Student s", Student.class); Σε αυτή την περίπτωση το ερώτημα string είναι δυναμικά κατασκευασμένο. Δυναμικά ερωτήματα μπορούν επίσης να κατασκευαστούν μέσω του ασφαλή τύπου Criteria ΑΡΙ. Εδώ είναι ένας κώδικας δείγματος που εξηγεί πώς να χρησιμοποιήσετε το Criteria API για την αναζήτηση του καταλόγου των Students: CriteriaBuilder builder = em.getcriteriabuilder(); CriteriaQuery criteria = builder.createquery(student.class); Root<Student> root = criteria.from(student.class); criteria.select(root); TypedQuery<Student> query = em.createquery(criteria); List<Student> list = query.getresultlist(); Το Criteria API είναι πολύ χρήσιμο για τη δημιουργία δυναμικών ερωτημάτων κατά το χρόνο εκτέλεσης, για παράδειγμα,μια περίτεχνη σελίδα αναζήτησης σε μια εφαρμογή που ψάχνει για το περιεχόμενο βασίζεται σε πεδία εισαγωγής. Χρησιμοποιώντας το Critiera API, αντί JPQL, θα εξαλείψετε την ανάγκη για string αλληλουχίες για την κατασκευή του ερωτήματος. Η μπορεί να είναι πιο κατάλληλη για απλές περιπτώσεις χρήσης. Σε ένα συγκρότημα ερωτημάτων όπου SELECT, FROM, WHERE και Σελίδα 157 από 218

159 άλλες ρήτρες καθορίζονται κατά το χρόνο εκτέλεσης, η δυναμική JPQL μπορεί να είναι πιο επιρρεπής σε λάθη, συνήθως λόγω της string αλληλουχίας. Το type- Criteria API προσφέρει ένα πιο ισχυρό τρόπο για την αντιμετώπιση τέτοιου είδους ερωτήματος. Όλες οι ρήτρες μπορούν εύκολα να καθορίζονται σε ένα type-safe τρόπο, παρέχοντας τα πλεονεκτήματα της επικύρωσης σε χρόνο μεταγλώττισης των ερωτημάτων. Οι κλάσεις μεταμοντέλου JPA2 συλλαμβάνουν το μεταμοντέλο της επίμονης κατάστασης και τις σχέσεις των υπό διαχείριση κατηγοριών μιας μονάδας επιμονής. Αυτό το αφηρημένο σχήμα επιμονής στη συνέχεια χρησιμοποιείται για τη συγγραφή των ασφαλή τύπου ερωτημάτων μέσω του Criteria API. οι κανονικές κλάσεις μεταμοντέλου μπορούν να παραχθούν στατικά μέσω ενός επεξεργαστή σχολιασμού ακλουθώντας τους κανόνες που καθορίζονται από τις προδιαγραφές. Το καλό πράγμα είναι ότι δεν υπάρχει επιπλέον ρύθμιση που απαιτείται για την παραγωγή αυτών των κατηγοριών μεταμοντέλου. Για να ενημερώσετε μια υπάρχουσα οντότητα, θα πρέπει να τη βρείτε πρώτα, να αλλάξετε τα πεδία, και να καλέσετε την EntityManager.merge μέθοδο : Student student = em.find(student.class, 1234); //... student.setgrade("5"); em.merge(student); Μπορείτε να ενημερώσετε στη συνέχεια την οντότητα χρησιμοποιώντας JPQL: Query query = em.createquery("update Student s" + "SET s.grade = :grade WHERE s.id = :id"); query.setparameter("grade", "5"); query.setparameter("id", "1234"); query.executeupdate(); Με JPA 2.1, μπορείτε να ενημερώσετε την οντότητα που χρησιμοποιεί τη Criteria API: Σελίδα 158 από 218

160 CriteriaBuilder builder = em.getcriteriabuilder(); CriteriaUpdate updatecriteria = builder.createcriteriaupdate(student.class); Root<Student> updateroot = updatecriteria.from(student.class); updatecriteria.where(builder.equal(updateroot.get(student_.id), "1234")); updatecriteria.set(updateroot.get(student_.grade), "5"); Query q = em.createquery(updatecriteria); q.executeupdate(); Για να καταργήσετε μια υπάρχουσα οντότητα, θα πρέπει να τη βρείτε και στη συνέχεια να καλέσετε την μέθοδο EntityManager.remove: Student student = em.find(student.class, 1234); em.remove(student); Μπορείτε να διαγράψετε την οντότητα χρησιμοποιώντας JPQL: Query query = em.createquery("delete FROM Student s" + "WHERE s.id = :id"); query.setparameter("id", "1234"); query.executeupdate(); Η αφαίρεση μιας οντότητας αφαιρεί επίσης την αντίστοιχη εγγραφή από την υποκείμενη αποθήκευση δεδομένων.με το JPA 2.1, μπορείτε να διαγράψετε την οντότητα που χρησιμοποιεί τo Criteria API: CriteriaBuilder builder = em.getcriteriabuilder(); CriteriaDelete deletecriteria = builder.createcriteriadelete(student.class); Root<Student> updateroot = deletecriteria.from(student.class); deletecriteria.where(builder.equal(updateroot.get(student_.id), "1234")); Query q = em.createquery(deletecriteria); q.executeupdate(); 6.5 Entity Listeners Μια οντότητα περνά μέσα από πολλαπλά γεγονότα του κύκλου ζωής, όπως το load, persist, update και public class Student implements Serializable { Σελίδα 159 από 218

161 public void studentloaded() { public void newstudentalert() { public void studentupdatealert() { public void studentdeletealert() { //... Σε αυτόν τον κώδικα: Η μέθοδος studentloaded καλείται αφού η οντότητα έχει φορτωθεί στο τρέχον πλαίσιο επιμονής ή μετά τη λειτουργία ανανέωσης που έχει εφαρμοστεί σε αυτό. Η μέθοδος newstudentalert καλείται μετά από τηνεπιμονή της οντότητας στην αποθήκευση δεδομένων. Η μέθοδος studentupdatealert καλείται αφού η οντότητα έχει ενημερωθεί. Η μέθοδος studentdeletealert καλείται πριν η οντότητα διαγραφεί. Οι μέθοδοι επανάκλησης μπορεί να είναι public, private, protected ή package-level προσβάσιμες, αλλά δεν πρέπει να είναι static ή final. Το JPA 2.1 υποστηρίζει την dependency injection. Για ένα Java EE 7 αρχείο όπουτο CDI είναι ενεργοποιημένο από προεπιλογή, συμπληρωματικές μεθόδοι επανάκλησης του κύκλου ζωής που σχολιάζονται μπορούν να χρησιμοποιηθούν. Σελίδα 160 από 218

162 Οι μέθοδοι επανάκλησης μπορεί να ορίζονται σε ξεχωριστή κλάση και να συνδέονται με αυτήν την οντότητα Η υπογραφή μεθόδου σε αυτή την περίπτωση θα public class Student implements Serializable { //... public class public void studentloaded(student student) { public void newstudentalert(student student) { public void studentupdatealert(student student) { public void studentdeletealert(student student) { //... Το επιχείρημα είναι το στιγμιότυπο οντότητας για το οποίο γίνεται επίκληση της μεθόδου επανάκλησης. Πολλαπλοί ακροατές οντότητας μπορούν να οριστούν για μια κλάση οντότητας ή χαρτογραφημένη superclass. Κάθε ακροατής γίνεται επίκληση με την ίδια σειρά όπως καθορίζεται στους EntityListeners σχολιασμούς. Μπορείτε να ορίσετε τους listeners επανάκλησης με τις περιγραφές XML που ομαδοποιούνται σε META-INF/ orm.xml: <entity-mappings xmlns=" xsi:schemalocation=" Σελίδα 161 από 218

163 version="2.1"> <persistence-unit-metadata> <entity class="org.sample.student"> <entity-listeners> <entity-listener class="org.sample.studentlistener"> <post-load method-name="studentloaded"/> </entity-listener> </entity-listeners> </entity> </persistence-unit-metadata> </entity-mappings> Οι προεπιλεγμένοι listeners οντότητας μπορούν να προσδιοριστούν μέσω του περιγραφέα XML. Οι μέθοδοι επανάκλησης από μια τέτοια κλάση listener θα ε- φαρμόζονται σε όλες τις οντότητες στη μονάδα persistence: <entity-mappings xmlns=" xsi:schemalocation=" version="2.1"> <persistence-unit-metadata> <persistence-unit-defaults> <entity-listeners> <entity-listener class="mylistener"/> </entity-listeners> </persistence-unit-defaults> </persistence-unit-metadata> </entity-mappings> Σε αυτόν τον κώδικα, η MyListener ορίζεται ως ο προεπιλεγμένος listener οντότητας που θα εφαρμόζεται σε όλες τις οντότητες στη μονάδα persistence. Η σειρά που καθορίζεται στον περιγραφέα XML υπερισχύει της σειράς που καθορίζεται μέσω μεταδεδομένων σχολιασμών ή της κλάσης οντότητας ή Σελίδα 162 από 218

164 6.6 Αποθηκευμένες Διαδικασίες Το JPA 2.1 προσθέτει τη δυνατότητα να εκτελέσετε τα ερωτήματα που επικαλούνται αποθηκευμένες διαδικασίες που ορίζονται στη βάση δεδομένων. Μπορείτε να καθορίσετε τις αποθηκευμένες διαδικασίες είτε Query είτε δυναμικά. Παρόμοια με υπάρχει το οποίο καθορίζει και ονοματίζει μια αποθηκευμένη διαδικασία, τις παραμέτρους της, τους αντίστοιχους τρόπους παραμέτρων (IN, OUT, INOUT, REF_CURSOR) και το είδος του αποτέλεσματος, αν υπάρχει. Σε αντίθεση και ονοματίζουν μια αποθηκευμένη διαδικασία που υπάρχει στη βάση δεδομένων και όχι δεν παρέχουν έναν ορισμό μιας αποθηκευμένης διαδικασίας. Αυτό το σχόλιο μπορεί να καθοριστεί σε μια οντότητα ή procedurename="top10gifts") public class Product { //... Σε αυτόν τον κώδικα, το name καθορίζει μοναδικά αυτό το αποθηκευμένο στοιχείο της διαδικασίας των ερωτημάτων εντός της μονάδας persistence και το procedurename προσδιορίζει το όνομα της αποθηκευμένης διαδικασίας στη βάση δεδομένων.υπάρχουν διάφορες παραλλαγές της EntityManager.createXXXStoredProcedureQuery μεθόδου που επιστρέφουν StoredProcedureQuery για την εκτέλεση μιας αποθηκευμένης διαδικασίας. Το name που καθορίζεται στο σχολιασμό χρησιμοποιείται σε EntityManager. createnamedstoredprocedurequery. Μπορείτε να καθορίσετε διαφορετικές παραμέτρους της αποθηκευμένης διαδικασίας χρησιμοποιώντας τη setparameter μέθοδο. Οι παράμετροι πρέπει να καθορίζονται με τη σειρά με την οποία εμφανίζονται στη λίστα παραμέτρων της αποθηκευμένης διαδικασίας. Είτε το Σελίδα 163 από 218

165 όνομα είτε η θέση της παραμέτρου μπορεί να χρησιμοποιηθεί για να δεσμεύσει την παράμετρο με την τιμή ή να εξάγει την τιμή (αν η παράμετρος είναι OUT ή INOUT): StoredProcedureQuery query = EntityManager.createNamedStoredProcedureQuery ("topgiftsstoredprocedure"); query.setparameter(1, "top10"); query.setparameter(2, 100); query.execute(); String response = query.getoutputparametervalue(1); Σε αυτόν τον κώδικα: Το όνομα της αποθηκευμένης διαδικασίας από χρησιμοποιείται για τη δημιουργία Stored ProcedureQuery. Οι παράμετροι θέσης χρησιμοποιούνται για να δεσμεύσει την τιμή των δύο παραμέτρων. Υπάρχουν διαφορετικές μεθόδοι setparameter για τον καθορισμό του χρονικού είδους μιας παραμέτρου. Αφού εκτελεστεί το ερώτημα, τα αποτελέσματα εξάγονται μέσω getoutputparametervalue με παραμέτρους θέσης. Εάν η μέθοδος εκτέλεσης επιστρέφει true, τότε το πρώτο αποτέλεσμα είναι ένα σύνολο αποτελεσμάτων, επιστρέφει false αν είναι μια μέτρηση ενημέρωση ή δεν υπάρχουν άλλα αποτελέσματα, παρά μόνο μέσω των INOUT και OUT παραμέτρων, αν υπάρχουν. Αν ορίσετε ένα μόνο αποτέλεσμα συν οποιαδήποτε άλλα αποτελέσματα είναι να περάσουν πίσω από τις παραμέτρους του INOUT και OUT, τότε μπορείτε να αποκτήσετε τα αποτελέσματα χρησιμοποιώντας τις μεθόδους getresultlist και getsingleresult. Η μέθοδος getupdatecount μπορεί να κληθεί για να αποκτήσει τα αποτελέσματα αν είναι μια μέτρηση ενημέρωσης. Τα αποτελέσματα από getresultlist, getsingleresult και getupdatecount πρέπει να υποβάλλονται σε επεξεργασία πριν από τις INOUT ή OUT τιμές των παραμέτρων που εξάγονται. Εάν δεν καθορίσετε την αποθηκευμένη διαδικασία χρησιμοποιώντας παραμέτρους, resultclasses και την εκ νέου sultsetmappings ProcedureQuery, πρέπει να δώσετε την παράμετρο και να οδηγήσετε τις πληροφορίες δυναμικά: Σελίδα 164 από 218

166 StoredProcedureQuery query = EntityManager.createNamedStoredProcedureQuery("topGiftsStoredProcedure"); query.registerstoredprocedureparameter(1, String.class, ParameterMode.INOUT); query.setparameter(1, "top10"); query.registerstoredprocedureparameter(2, Integer.class, ParameterMode.IN); query.setparameter(2, 100); query.execute(); String response = query.getoutputparametervalue(1); Σε αυτόν τον κώδικα, οι δύο παράμετροι έχουν καταχωρηθεί μέσω της registerstoredprocedureparameter μεθόδου. Η λειτουργία της παραμέτρου καθορίζεται κατά τη διάρκεια της εγγραφής. Μπορείτε να παρέχετε πληροφορίες αποτέλεσματων χαρτογράφησης χρησιμοποιώντας την EntityManager.create StoredProcedureQuery μέθοδο. 6.7 Επικυρώνοντας τις οντότητες Η επικύρωση bean σας επιτρέπει να ορίσετε μεταδεδομένα εγκυρότητας για JavaBeans. Για το JPA, όλες οι διαχειριζόμενες κλάσεις (οντότητες, διαχειριζόμενες υπερκλάσεις και ενσωματωμένες κλάσεις) μπορούν να ρυθμιστούν για να συμπεριλάβουν Bean Validation περιορισμούς. Οι περιορισμοί αυτοί εφαρμόζονται στη συνέχεια όταν η οντότητα αυτή επιμένει, ενημερώνεται, ή να αφαιρείται από τη βάση δεδομένων. Η επικύρωση bean έχει κάποιους προκαθορισμένους @Pattern Μπορείτε εύκολα να δημιουργήσετε ένα συνηθισμένο περιορισμό με χρήση των μηχανισμών που ορίζονται στην προδιαγραφή επικύρωσης bean. Η οντότητα Student με περιορισμούς επικύρωσης μπορεί να οριστεί public class Student implements private int private String max=5) Σελίδα 165 από 218

167 private String grade; //... Αυτό εξασφαλίζει ότι το πεδίο id δεν είναι ποτέ μηδενικό, το μέγεθος του πεδίου ονόματος είναι το πολύ 30 χαρακτήρες με ένα προεπιλεγμένο ελάχιστο 0, και το μέγεθος του πεδίου βαθμού είναι τουλάχιστον 2 χαρακτήρες και το πολύ 5. Με αυτούς τους περιορισμούς, προσπαθώντας να προσθέσετε τον ακόλουθο Student στη βάση δεδομένων, θα ρίξετε ένα ConstraintViolationException, όπως το βαθμό πεδίου που πρέπει να είναι τουλάχιστον 2 χαρακτήρες: Student student = new Student(); student.setid(1234); student.setname("joe Smith"); student.setgrade("1"); em.persist(student); Τα embeddable χαρακτηριστικά επικυρώνονται μόνον εφόσον ο Valid σχολιασμός έχει οριστεί σε αυτά. Έτσι, η επικαιροποιημένη κλάση Address θα μοιάζει public class Address private String private String //... private String zip; Από προεπιλογή, η επικύρωση των bean οντοτήτων ενεργοποιείται αυτόματα. Μπορείτε να αλλάξετε τη προεπιλεγμένη συμπεριφορά επικύρωσης καθορίζοντας Σελίδα 166 από 218

168 το στοιχείο validation-mode στo persistence.xml. Οι τιμές του καθορίζονται στον πίνακα. Πίνακας 10: Το στοιχείο validation-mode στo persistence.xml Μπορείτε να καθορίσετε αυτό το χαρακτηριστικό στο persistence.xml: <persistence-unit name="mysamplepu" transaction-type="jta"> <validation-mode>callback</validation-mode> </persistence-unit> Μπορείτε επίσης να καθορίσετε τις τιμές αυτές με τη χρήση της javax.persistence.validation.mode ιδιότητας, αν δημιουργήσετε την οντότητα manager factory χρησιμοποιώντας Persistence.createEntityManagerFactory: Map props = new HashMap(); props.put("javax.persistence.validation.mode", "callback"); EntityManagerFactory emf = Persistence.createEntityManagerFactory("MySamplePU", props); Από προεπιλογή, όλες οι οντότητες σε μια διαδικτυακή εφαρμογή είναι στην ομάδα Default επικύρωσης. Η Default ομάδα στοχεύει στα pre-persist να και pre-update γεγονότα και καμία ομάδα δεν απευθύνεται σε pre-remove γεγονότα. Έτσι, οι περιορισμοί επικυρώνονται όταν η οντότητα αυτή επιμένει ή ενημερώνεται, αλλά όχι όταν διαγράφεται. Μπορείτε να παρακάμψετε αυτήν την προεπιλεγμένη συμπεριφορά καθορίζοντας τις ομάδες-στόχους χρησιμοποιώντας την ακόλουθη ιδιότητα επικύρωσης σε persistence.xml: javax.persistence.validation.group.pre-persist javax.persistence.validation.group.pre-update javax.persistence.validation.group.pre-remove Σελίδα 167 από 218

169 Μπορείτε να ορίσετε μια νέα ομάδα επικύρωσης δηλώνοντας ένα νέο interface: public interface MyGroup { Μπορείτε να στοχεύσετε σε ένα πεδίο της οντότητας Student σε αυτήν την ομάδα public class Student implements int private boolean canbedeleted; Και το persistence.xml πρέπει να έχει ορισμένη την ακόλουθη ιδιότητα: <property name="javax.persistence.validation.group.pre-remove" value="org.sample.mygroup"/> Αυτές οι ιδιότητες μπορούν επίσης να περάσουν στο Persistence.create EntityManagerFactory σε ένα Map. Μπορείτε επίσης να επιτύχετε την επικύρωση της αίτησης με την κλήση της Validator.validate μεθόδου μετά από ένα παράδειγμα μιας διαχειριζόμενης κλάσης. Το γεγονός επικύρωσης του κύκλου ζωής εμφανίζεται μόνο όταν υπάρχει ένας πάροχος bean επικύρωσης στο χρόνο εκτέλεσης. Εάν ένας περιορισμός παραβιάζεται, η παρούσα συναλλαγή σημειώνεται για επαναφορά. 6.8 Συναλλαγές και Κλείδωμα Οι EntityManager.persist.persist,.remove και.refresh μέθοδοι πρέπει να γίνουν επίκληση μέσα σε ένα πλαίσιο συναλλαγών, όταν χρησιμοποιείται ένας διαχειριστής οντότητας σε ένα πλαίσιο επιμονής της συναλλαγής. Οι συναλλαγές ελέγχονται είτε μέσω JTA είτε μέσω της χρήσης των πόρων των τοπικών EntityTransaction API. Ένας διαχειριστής οντότητας container-managed πρέπει να χρησιμοποιήσει JTA και είναι ο τυπικός τρόπος για να έχει συναλλακτική Σελίδα 168 από 218

170 συμπεριφορά, ένα container Java EE. Ένας τοπικού πόρου, διαχειριστής οντότητας χρησιμοποιείται συνήθως σε Java SE περιβάλλον. Μια συναλλαγή για έναν διαχειριστή οντότητας JTA έχει ξεκινήσει και γίνεται εξωτερικά του διαχειριστή της public class StudentSessionBean EntityManager em; public void addstudent(student student) { em.persist(student); Σε αυτό το Enterprise JavaBean, μια συναλλαγή JTA έχει αρχίσει πριν από την μέθοδο addstudent και διαπράττεται μετά την ολοκλήρωση της μεθόδου. Η συναλλαγή αυτόματα πάει πίσω αν μια εξαίρεση ρίχνεται στη μέθοδο. Ο τοπικός πόρος EntityTransaction API μπορεί να χρησιμοποιηθεί: EntityManagerFactory emf = Persistence.createEntityManagerFactory("student"); EntityManager em = emf.getentitymanager(); em.gettransaction().begin(); Student student = new Student(); //... em.persist(student); em.gettransaction().commit(); em.close(); emf.close(); Η συναλλαγή μπορεί να επανέλθει με τη μέθοδο EntityTransaction.rollback. Εκτός από τις συναλλαγές, μια οντότητα μπορεί να κλειδωθεί όταν η συναλλαγή είναι ενεργή. Από προεπιλογή, ο optimistic concurrency control είναι δεδομένος.το αισιόδοξο κλείδωμα επιτρέπει σε οποιονδήποτε να διαβάσει και να ενημερώσει μια οντότητα, Σελίδα 169 από 218

171 ωστόσο, ένας έλεγχος έκδοσης γίνεται κατά τη εκτέλεση και μια εξαίρεση ρίχνεται, αν η έκδοση ενημερώθηκε στη βάση δεδομένων όταν η οντότητα είχε διαβαστεί. Το μπορεί να καθοριστεί σχετικά με το πεδίο της οντότητας του τύπου int, Integer, Short, short, long, Long, ή java.sql.timestamp. Μια οντότητα ενεργοποιείται αυτόματα για τo αισιόδοξο κλείδωμα αν έχει μια ιδιότητα ή πεδίο αποτυπωμένο με μια Version χαρτογράφηση. Η εφαρμογή δεν πρέπει ποτέ να ενημερώσει αυτό το πεδίο. Μόνο ο πάροχος επιμονής επιτρέπεται για να ρυθμίσετε ή να ενημερώσετε την τιμή του χαρακτηριστικού έκδοσης. Αυτό το πεδίο χρησιμοποιείται από τον πάροχο επιμονής για να εκτελέσει αισιόδοξο public class Student implements private int private int version; //... Το χαρακτηριστικό έκδοσης αυξάνεται με την επιτυχημένη εκτέλεση. Αν κάποια άλλη ταυτόχρονη συναλλαγή προσπαθεί να ενημερώσει την οντότητα και το χαρακτηριστικό έκδοσης έχει ενημερωθεί όταν η οντότητα είχε διαβαστεί, τότε ρίχνεται javax.persistence.optimisticlockexception. Το απαισιόδοξο κλείδωμα δίνει ένα αποκλειστικό κλείδωμα στην οντότητα μέχρι η εφαρμογή να έχει τελειώσει την επεξεργασία του. Το απαισιόδοξο κλείδωμα εξασφαλίζει ότι οι πολλαπλές συναλλαγές δεν μπορεί να ενημερώσουν την ίδια οντότητα κατά την ίδια περίοδο, η οποία μπορεί να απλοποιήσει τον κώδικα εφαρμογής, αλλά περιορίζει την ταυτόχρονη πρόσβαση στα δεδομένα. Σελίδα 170 από 218

172 Μπορείτε να αποκτήσετε ένα απαισιόδοξο κλείδωμα σε μια οντότητα περνώντας μια τιμή LockModeType enum κατά τη μέθοδο find: Student student = em.find(student.class, 1234, LockModeType.PESSIMISTIC_WRITE); Εναλλακτικά, μπορείτε να αποκτήσετε ένα κλείδωμα σε μια οντότητα αργότερα: em.lock(student, LockModeType.PESSIMISTIC_WRITE); Αυτός ο κώδικας μπορεί να ρίξει OptimisticLockException κατά flush ή commit αν η οντότητα ενημερώθηκε μετά την ανάγνωση, αλλά πριν από το κλείδωμα. Όταν ένα στιγμιότυπο οντότητας είναι κλειδωμένο μέσω απαισιόδοξου κλειδώματος, ο πάροχος επιμονής πρέπει να κλειδώσει τη γραμμή (ες) της βάσης δεδομένων που αντιστοιχούν στη non-collection-valued επίμονη κατάσταση του εν λόγω στιγμιότυπου. Συλλογές στοιχείων και σχέσεις που ανήκουν στην οντότητα περιέχονται στους πίνακες θα κλειδωθούν αν η ιδιότητα javax.persistence. lock.scope προσδιορίζεται με τιμή PessimisticLockScope.EXTENDED. Αυτή η ιδιότητα μπορεί να name="findstudent" value="select s FROM Student s WHERE p.grade = :grade", lockmode = PessimisticLockScope.EXTENDED) 6.9 Caching Το JPA παρέχει δύο επίπεδα caching. Οι οντότητες αποθηκεύονται προσωρινά από τον διαχειριστή οντότητας κατά το πρώτο επίπεδο, στο πλαίσιο persistence. Ο διαχειριστής οντότητας εγγυάται ότι εντός ενός ενιαίου πλαισίου επιμονής, για οποιαδήποτε συγκεκριμένη σειρά δεδομένων, θα υπάρχει μόνο ένα στιγμιότυπο αντικείμενου. Ωστόσο, η ίδια οντότητα θα μπορούσε να διαχειρίζεται σε άλλη συναλλαγή, έτσι θα πρέπει να χρησιμοποιείται το κατάλληλο κλείδωμα. Το δεύτερο επίπεδο caching από τον πάροχο επιμονής μπορεί να ενεργοποιηθεί με την τιμή των στοιχείων shared-cache-mode στο persistence.xml. Αυτό το στοιχείο μπορεί να έχει τις τιμές που ορίζονται στον πίνακα. Σελίδα 171 από 218

173 Πίνακας 11: shared-cache-mode στο persistence.xml Η ακριβής τιμή μπορεί να καθοριστεί: <shared-cache-element>all</shared-cache-element> Αυτό επιτρέπει την κατάσταση της οντότητας να μοιραστεί σε πολλαπλά περιβάλλοντα επιμονής. Η διεπαφή Cache μπορεί να χρησιμοποιηθεί για τη διασύνδεση με την cache δευτέρου επιπέδου, επίσης. Αυτή η διεπαφή μπορεί να ληφθεί από το EntityManagerFactory και μπορεί να χρησιμοποιηθεί για να ελέγξει αν μια συγκεκριμένη οντότητα υπάρχει στη μνήμη cache ή να ακυρώσει μια συγκεκριμένη οντότητα, μια ολόκληρη κλάση ή ολόκληρη τη EntityMangagerFactory emf; public void mymethod() { //... Cache cache = emf.getcache(); boolean incache = cache.contains(student.class, 1234); //... Μια συγκεκριμένη οντότητα μπορεί να διαγραφεί: cache.evict(student.class, 1234); Όλες οι οντότητες μιας κλάσης μπορούν να ακυρωθούν: cache.evict(student.class); Σελίδα 172 από 218

Διαδικτυακές Εφαρμογές. Ενότητα 2: Enterprise Java Beans και Java Server Faces Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ

Διαδικτυακές Εφαρμογές. Ενότητα 2: Enterprise Java Beans και Java Server Faces Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ Διαδικτυακές Εφαρμογές Ενότητα 2: Enterprise Java Beans και Java Server Faces Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Εισαγωγή στη J2EE. Μέρος 2

Εισαγωγή στη J2EE. Μέρος 2 Εισαγωγή στη J2EE Μέρος 2 JNDI Java Naming and Directory Interface Χρησιμοποιείταιαπότιςεφαρμογέςπου βασίζονταισε J2EE γιατον μεταφερτό προσδιορισμό πόρωνκαιαντικειμένων Οιεφαρμογές χρησιμοποιούν συμβολικά

Διαβάστε περισσότερα

Πληροφορική στιςεπιχειρήσεις

Πληροφορική στιςεπιχειρήσεις Εισαγωγή στη J2EE Εκπαιδευτικοί Στόχοι Ναγνωρίσετετην αρχιτεκτονικήτης πλατφόρμας J2EE Κατανόησητης αξίαςτης J2EE Εποπτικήμελέτη των APIs και των τεχνολογιών πουαποτελούν τη J2EE Δεν είναι απαραίτητο νακαταλάβετε

Διαβάστε περισσότερα

Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες

Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες Εισαγωγή-Σκοπός. Τρόποι δημιουργίας δυναμικών ιστοσελίδων. Dynamic Web Pages. Dynamic Web Page Development Using Dreamweaver. Τρόποι δημιουργίας δυναμικών

Διαβάστε περισσότερα

Διαδικτυακές Εφαρμογές Ενότητα 1: JPA

Διαδικτυακές Εφαρμογές Ενότητα 1: JPA Διαδικτυακές Εφαρμογές Ενότητα 1: JPA Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

Βασικές Έννοιες Web Εφαρμογών

Βασικές Έννοιες Web Εφαρμογών ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΔΙΟΙΚΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ Τεχνολογίες και Εφαρμογές Διαδικτύου Βασικές Έννοιες Web Εφαρμογών Κατερίνα Πραματάρη Τεχνολογίες και Εφαρμογές Διαδικτύου Περιεχόμενα

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 17: Web Services Εισαγωγή

ΚΕΦΑΛΑΙΟ 17: Web Services Εισαγωγή ΚΕΦΑΛΑΙΟ 17: Web Services 17.1. Εισαγωγή Με τον όρο WebService αναφερόμαστε σε ένα σύστημα λογισμικού το οποίο σχεδιάστηκε με τρόπο τέτοιο ώστε να υποστηρίζει την ανεμπόδιστη συνεργασία δύο μηχανών μέσω

Διαβάστε περισσότερα

Υπηρεσίες Ιστού (Web Services) ΜΙΧΑΛΗΣ ΜΑΛΙΑΠΠΗΣ

Υπηρεσίες Ιστού (Web Services) ΜΙΧΑΛΗΣ ΜΑΛΙΑΠΠΗΣ Υπηρεσίες Ιστού (Web Services) ΜΙΧΑΛΗΣ ΜΑΛΙΑΠΠΗΣ Μάθημα Πρώτο Εισαγωγή στις Υπηρεσίες Ιστού (Web Services) Μοντέλα WS JSON Χρήση (consume) WS μέσω python Πρόσβαση σε WS και άντληση δεδομένων Παραδείγματα

Διαβάστε περισσότερα

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Οδηγός Εργαστηρίου:

Διαβάστε περισσότερα

Σύστημα Ηλεκτρονικού Πρωτοκόλλου. Σχεδιασμός Υποσυστημάτων

Σύστημα Ηλεκτρονικού Πρωτοκόλλου. Σχεδιασμός Υποσυστημάτων Unified IT services Αγ. Παρασκευής 67 15234 Χαλάνδρι http://www.uit.gr Σύστημα Ηλεκτρονικού Πρωτοκόλλου Σχεδιασμός Υποσυστημάτων ΕΛΛΑΚ Ημερομηνία: 10/1/2011 UIT Χαλάνδρι Αγ. Παρασκευής 67 15234 210 6835289

Διαβάστε περισσότερα

Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού

Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού Γενικά Η αρχιτεκτονική ανάπτυξης τους πληροφοριακού συστήµατος Γραµµατεία 2000 υποσύστηµα διαχείρισης προσωπικού

Διαβάστε περισσότερα

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ. J2EE Εφαρµογή Ηλεκτρονικής Απεικόνισης Λογαριασµών ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ. J2EE Εφαρµογή Ηλεκτρονικής Απεικόνισης Λογαριασµών ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΣΥΣΤΗΜΑΤΩΝ ΜΕΤΑ ΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΛΙΚΩΝ J2EE Εφαρµογή Ηλεκτρονικής Απεικόνισης Λογαριασµών ΙΠΛΩΜΑΤΙΚΗ

Διαβάστε περισσότερα

Σύστημα Αναθέσεων. Σχεδιασμός Υποσυστημάτων

Σύστημα Αναθέσεων. Σχεδιασμός Υποσυστημάτων Unified IT services Αγ. Παρασκευής 67 15234 Χαλάνδρι http://www.uit.gr Σύστημα Αναθέσεων Σχεδιασμός Υποσυστημάτων ΕΛΛΑΚ Ημερομηνία: 7/12/2010 UIT Χαλάνδρι Αγ. Παρασκευής 67 15234 210 6835289 Unified Information

Διαβάστε περισσότερα

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 10η Διάλεξη: Web Services

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 10η Διάλεξη: Web Services Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 10η Διάλεξη: Web Services Δρ. Απόστολος Γκάμας Λέκτορας (407/80) gkamas@uop.gr Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου Διαφάνεια 1 Ορισμός των Web Services

Διαβάστε περισσότερα

Ανάπτυξη εφαρμογής διαχείρισης μαθημάτων με χρήση τεχνολογιών Java 2 Enterprise Edition (J2EE)

Ανάπτυξη εφαρμογής διαχείρισης μαθημάτων με χρήση τεχνολογιών Java 2 Enterprise Edition (J2EE) ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝΜ Ν ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ Ανάπτυξη εφαρμογής διαχείρισης μαθημάτων με χρήση τεχνολογιών Java

Διαβάστε περισσότερα

Λιόλιου Γεωργία. ιατµηµατικό Πρόγραµµα Μεταπτυχιακών Σπουδών στα Πληροφοριακά Συστήµατα

Λιόλιου Γεωργία. ιατµηµατικό Πρόγραµµα Μεταπτυχιακών Σπουδών στα Πληροφοριακά Συστήµατα ιατµηµατικό Πρόγραµµα Μεταπτυχιακών Σπουδών στα Πληροφοριακά Συστήµατα Λιόλιου Γεωργία ΕπιβλέπουσαΚαθηγήτρια: ΣατρατζέµηΜάγια, καθηγήτρια, τµ. ΕφαρµοσµένηςΠληροφορικής, ΠΑΜΑΚ Εισαγωγή Γενικά στοιχεία εφαρµογή

Διαβάστε περισσότερα

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12 Αρχιτεκτονικές κατανεμημένων συστημάτων Στόχοι Εξήγηση των πλεονεκτημάτων και των μειονεκτημάτων των αρχιτεκτονικών κατανεμημένων συστημάτων Εξέταση των αρχιτεκτονικών συστημάτων πελάτηδιακομιστή και των

Διαβάστε περισσότερα

Αξιολόγηση Υπηρεσιών ιαδικτύου µέσω Περιπτώσεων Μελέτης

Αξιολόγηση Υπηρεσιών ιαδικτύου µέσω Περιπτώσεων Μελέτης Αξιολόγηση Υπηρεσιών ιαδικτύου µέσω Περιπτώσεων Μελέτης Κωστής Αϊβαλής Μηχανικός Πληροφορικής TU-Berlin 2/5/2008 ΕΑΠ-ΓΤΠ61-Κωστής Αϊβαλής 1 Εισαγωγή Η ταχύτητα επεξεργασίας των εφαρµογών διαδικτυακών υπηρεσιών

Διαβάστε περισσότερα

ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ. Επιβλέπων Καθηγητής: Αλέξανδρος Χατζηγεωργίου Εξεταστές: Χρήστος Γεωργιάδης. Τμήμα Εφαρμοσμένης Πληροφορικής

ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ. Επιβλέπων Καθηγητής: Αλέξανδρος Χατζηγεωργίου Εξεταστές: Χρήστος Γεωργιάδης. Τμήμα Εφαρμοσμένης Πληροφορικής ΑΝΑΠΤΥΞΗ JAVA EE ΕΦΑΡΜΟΓΩΝ ΜΕ ΧΡΗΣΗ ΛΟΓΙΣΜΙΚΟΥ ΑΝΟΙΚΤΟΥ ΚΩΔΙΚΑ ΚΑΙ ΑΞΙΟΠΟΙΗΣΗ ΠΡΟΤΥΠΩΝ ΣΧΕΔΙΑΣΗΣ ΜΑΡΙΑ ΜΟΥΡΑΤΙΔΟΥ ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Επιβλέπων Καθηγητής: Αλέξανδρος Χατζηγεωργίου Εξεταστές: Χρήστος Γεωργιάδης

Διαβάστε περισσότερα

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος... 13. Κεφάλαιο 1 ο Αρχές Διαχείρισης πληροφορίας στον Παγκόσμιο Ιστό... 15

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος... 13. Κεφάλαιο 1 ο Αρχές Διαχείρισης πληροφορίας στον Παγκόσμιο Ιστό... 15 ΠΕΡΙΕΧΟΜΕΝΑ Πρόλογος... 13 Κεφάλαιο 1 ο Αρχές Διαχείρισης πληροφορίας στον Παγκόσμιο Ιστό... 15 1.1 Εισαγωγή... 16 1.2 Διαδίκτυο και Παγκόσμιος Ιστός Ιστορική αναδρομή... 17 1.3 Αρχές πληροφοριακών συστημάτων

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 1: Εισαγωγή Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

ΣΥΓΚΡΙΤΙΚΗ ΜΕΛΕΤΗ ΤΕΧΝΟΛΟΓΙΩΝ ΔΙΑΔΙΚΤΥΑΚΩΝ ΥΠΗΡΕΣΙΩΝ ΚΑΙ ΑΞΙΟΛΟΓΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ REST ΠΛΑΣΤΑΡΑΣ ΕΥΡΙΠΙΔΗΣ

ΣΥΓΚΡΙΤΙΚΗ ΜΕΛΕΤΗ ΤΕΧΝΟΛΟΓΙΩΝ ΔΙΑΔΙΚΤΥΑΚΩΝ ΥΠΗΡΕΣΙΩΝ ΚΑΙ ΑΞΙΟΛΟΓΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ REST ΠΛΑΣΤΑΡΑΣ ΕΥΡΙΠΙΔΗΣ ΣΥΓΚΡΙΤΙΚΗ ΜΕΛΕΤΗ ΤΕΧΝΟΛΟΓΙΩΝ ΔΙΑΔΙΚΤΥΑΚΩΝ ΥΠΗΡΕΣΙΩΝ ΚΑΙ ΑΞΙΟΛΟΓΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ REST ΠΛΑΣΤΑΡΑΣ ΕΥΡΙΠΙΔΗΣ ΘΕΣΣΑΛΟΝΙΚΗ, 2016 ΕΙΣΑΓΩΓΗ Μια διαδικτυακή υπηρεσία μπορεί να περιγραφεί απλά σαν μια οποιαδήποτε

Διαβάστε περισσότερα

Πύλη Φαρμακευτικών Υπηρεσιών Υπουργείου Υγείας Κύπρου. System Architecture Overview

Πύλη Φαρμακευτικών Υπηρεσιών Υπουργείου Υγείας Κύπρου. System Architecture Overview Πύλη Φαρμακευτικών Υπηρεσιών Υπουργείου Υγείας Κύπρου System Architecture Overview CYPDIS Services Σύστημα Εγγραφής Φαρμάκων Drug Regulatory Authority Σύστημα Τιμολόγησης Price Control Σύστημα Φαρμακοεπαγρύπνησης

Διαβάστε περισσότερα

Company LOGO. Nazaret Kazarian. www.company.com 1

Company LOGO. Nazaret Kazarian. www.company.com 1 Nazaret Kazarian www.company.com 1 Agenda Επισκόπηση του Spring Web Flow Συμβολή στο framework Case study: Intracom IT Services Projects www.company.com 2 Background 2004-2005: Ervacon Web Flow Οκτ 2006:

Διαβάστε περισσότερα

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο Το περιβάλλον εργασίας Ανοίγοντας την Ελληνική Έκδοση του FrontPage, για πρώτη φορά, η εικόνα που θα συναντήσουμε είναι αυτή της Εικόνας 1 με τα Μενού Εντολών και τη Γραμμή Εργαλείων, στο πάνω μέρος της

Διαβάστε περισσότερα

Διαφορές single-processor αρχιτεκτονικών και SoCs

Διαφορές single-processor αρχιτεκτονικών και SoCs 13.1 Τα συστήματα και η επικοινωνία μεταξύ τους γίνονται όλο και περισσότερο πολύπλοκα. Δεν μπορούν να περιγραφούνε επαρκώς στο επίπεδο RTL καθώς αυτή η διαδικασία γίνεται πλέον αρκετά χρονοβόρα. Για αυτό

Διαβάστε περισσότερα

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12 Αρχιτεκτονικές κατανεμημένων συστημάτων Στόχοι Εξήγηση των πλεονεκτημάτων και των μειονεκτημάτων των αρχιτεκτονικών κατανεμημένων συστημάτων Εξέταση των αρχιτεκτονικών συστημάτων πελάτηδιακομιστή και των

Διαβάστε περισσότερα

Εργαλεία ανάπτυξης εφαρμογών internet Ι

Εργαλεία ανάπτυξης εφαρμογών internet Ι IEK ΟΑΕΔ ΚΑΛΑΜΑΤΑΣ ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΟΦΟΡΙΚΗΣ Εργαλεία ανάπτυξης εφαρμογών internet Ι Διδάσκουσα: Κανελλοπούλου Χριστίνα ΠΕ19 Πληροφορικής 4 φάσεις διαδικτυακών εφαρμογών 1.Εφαρμογές στατικής πληροφόρησης

Διαβάστε περισσότερα

Προγραμματισμός και Συστήματα στον Παγκόσμιο Ιστό Ενότητα 9: Web Services. Καθ. Ιωάννης Γαροφαλάκης Πολυτεχνική Σχολή Μηχανικών Η/Υ & Πληροφορικής

Προγραμματισμός και Συστήματα στον Παγκόσμιο Ιστό Ενότητα 9: Web Services. Καθ. Ιωάννης Γαροφαλάκης Πολυτεχνική Σχολή Μηχανικών Η/Υ & Πληροφορικής Προγραμματισμός και Συστήματα στον Παγκόσμιο Ιστό Ενότητα 9: Web Services Καθ. Ιωάννης Γαροφαλάκης Πολυτεχνική Σχολή Μηχανικών Η/Υ & Πληροφορικής Σκοποί ενότητας Σκοπός της παρούσας ενότητας είναι να εξοικειωθούν

Διαβάστε περισσότερα

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο FrontPage 2003 Πρακτικός Οδηγός Χρήσης Το FrontPage είναι ένα πρόγραμμα δημιουργίας ιστοσελίδων και δικτυακών τόπων που επιτρέπει το σχεδιασμό ιστοσελίδων μέσα από γραφικό περιβάλλον αλλά και την ταυτόχρονη

Διαβάστε περισσότερα

Αρχιτεκτονική Λογισμικού

Αρχιτεκτονική Λογισμικού Αρχιτεκτονική Λογισμικού περιεχόμενα παρουσίασης Τι είναι η αρχιτεκτονική λογισμικού Αρχιτεκτονική και απαιτήσεις Σενάρια ποιότητας Βήματα αρχιτεκτονικής σχεδίασης Αρχιτεκτονικά πρότυπα Διαστρωματωμένη

Διαβάστε περισσότερα

Ανάπτυξη πλήρους διαδικτυακής e-commerce εφαρμογής με χρήση του CMS WordPress

Ανάπτυξη πλήρους διαδικτυακής e-commerce εφαρμογής με χρήση του CMS WordPress ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Ανάπτυξη πλήρους διαδικτυακής e-commerce εφαρμογής με χρήση του CMS WordPress ΚΟΤΣΟΓΙΑΝΝΙΔΗΣ ΛΑΖΑΡΟΣ Επιβλέπων καθηγητής Σφέτσος Παναγιώτης ΗΛΕΚΤΡΟΝΙΚΟ ΕΜΠΟΡΙΟ Ως Ηλεκτρονικό Εμπόριο ή

Διαβάστε περισσότερα

ΜΑΘΗΜΑ: Διαδικτυακές Εφαρμογές

ΜΑΘΗΜΑ: Διαδικτυακές Εφαρμογές ΜΑΘΗΜΑ: Διαδικτυακές Εφαρμογές ΔΙΔΑΣΚΩΝ: Άγγελος Μιχάλας ΤΜΗΜΑ: Τμήμα Μηχανικών Πληροφορικής ΤΕ 1 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης CreativeCommons. Για εκπαιδευτικό

Διαβάστε περισσότερα

Ανάπτυξηλογισμικού υλοποίησης του ανοικτού πρότυπου EPCALEv1.1 για εφαρμογές RFID

Ανάπτυξηλογισμικού υλοποίησης του ανοικτού πρότυπου EPCALEv1.1 για εφαρμογές RFID ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ- ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ, Ανάπτυξηλογισμικού υλοποίησης του ανοικτού πρότυπου EPCALEv1.1 για εφαρμογές RFID ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ Marie-Aurélie

Διαβάστε περισσότερα

Τεχνικός Εφαρμογών Πληροφορικής

Τεχνικός Εφαρμογών Πληροφορικής Τεχνικός Εφαρμογών Πληροφορικής ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΕΙΣΑΓΩΓΗ Εξάμηνο: 2014Β Διδάσκουσα: Ηλεκτρονική Τάξη: Κανελλοπούλου Χριστίνα_ΠΕ19 Πληροφορικής Περιεχόμενα 1.Τι είναι η Php; 2.Πως γίνετε η γραφή

Διαβάστε περισσότερα

Λογισμικό Open Source στις Υπηρεσίες των Βιβλιοθηκών του Πανεπιστημίου Αθηνών

Λογισμικό Open Source στις Υπηρεσίες των Βιβλιοθηκών του Πανεπιστημίου Αθηνών Λογισμικό Open Source στις Υπηρεσίες των Βιβλιοθηκών του Πανεπιστημίου Αθηνών Υπολογιστικό Κέντρο Βιβλιοθηκών ΕΚΠΑ http://www.lib.uoa.gr Εισαγωγή Και στις ΒΥΠ του ΕΚΠΑ, οι ανάγκες για υλοποίηση υπηρεσιών

Διαβάστε περισσότερα

Εργαλεία ανάπτυξης εφαρμογών internet Ι

Εργαλεία ανάπτυξης εφαρμογών internet Ι IEK ΟΑΕΔ ΚΑΛΑΜΑΤΑΣ ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΟΦΟΡΙΚΗΣ Εργαλεία ανάπτυξης εφαρμογών internet Ι Διδάσκουσα: Κανελλοπούλου Χριστίνα ΠΕ19 Πληροφορικής Εργαλεία και τεχνικές από την πλευρά του πελάτη Java Applet

Διαβάστε περισσότερα

Υπηρεσιοστρεφής Αρχιτεκτονική SOA (Service Oriented Architecture)

Υπηρεσιοστρεφής Αρχιτεκτονική SOA (Service Oriented Architecture) Υπηρεσιοστρεφής Αρχιτεκτονική SOA (Service Oriented Architecture) Χρήστος Ηλιούδης Πλεονεκτήματα των Υπηρεσιών Ιστού Διαλειτουργικότητα: Η χαλαρή σύζευξή τους οδηγεί στην ανάπτυξη ευέλικτου λογισμικού

Διαβάστε περισσότερα

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java Δρ. Απόστολος Γκάμας Λέκτορας (407/80) gkamas@uop.gr Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου Διαφάνεια 1 Εισαγωγή

Διαβάστε περισσότερα

ΑΝΑΚΟΙΝΩΣΗ ΔΙΑΔΙΚΑΣΙΑΣ ΑΠΕΥΘΕΙΑΣ ΑΝΑΘΕΣΗΣ. Αριθμ. Πρωτ.: /2017 Ο ΕΙΔΙΚΟΣ ΛΟΓΑΡΙΑΣΜΟΣ ΚΟΝΔΥΛΙΩΝ ΕΡΕΥΝΑΣ

ΑΝΑΚΟΙΝΩΣΗ ΔΙΑΔΙΚΑΣΙΑΣ ΑΠΕΥΘΕΙΑΣ ΑΝΑΘΕΣΗΣ. Αριθμ. Πρωτ.: /2017 Ο ΕΙΔΙΚΟΣ ΛΟΓΑΡΙΑΣΜΟΣ ΚΟΝΔΥΛΙΩΝ ΕΡΕΥΝΑΣ ΑΝΑΚΟΙΝΩΣΗ ΔΙΑΔΙΚΑΣΙΑΣ ΑΠΕΥΘΕΙΑΣ ΑΝΑΘΕΣΗΣ Αριθμ. Πρωτ.: 129334/2017 Ο ΕΙΔΙΚΟΣ ΛΟΓΑΡΙΑΣΜΟΣ ΚΟΝΔΥΛΙΩΝ ΕΡΕΥΝΑΣ ΤΟΥ ΑΡΙΣΤΟΤΕΛΕΙΟΥ ΠΑΝΕΠΙΣΤΗΜΙΟΥ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΑΚΟΙΝΩΝΕΙ Τη διενέργεια διαδικασίας ΑΠΕΥΘΕΙΑΣ

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ Κεφάλαιο 2. Το περιβάλλον του παγκόσμιου Ιστού Επιμέλεια: Καραγιάννης Σπύρος Καθηγητής ΠΕ19 Πλεονεκτήματα παγκόσμιου Ιστού Εξυπηρετητής Ιστού & Ιστοσελίδες Κύριες

Διαβάστε περισσότερα

8ο Πανελλήνιο Συμποσιο Ωκεανογραφίας & Αλιείας 637

8ο Πανελλήνιο Συμποσιο Ωκεανογραφίας & Αλιείας 637 8ο Πανελλήνιο Συμποσιο Ωκεανογραφίας & Αλιείας 637 Υλοποιηση νεων τεχνολογιων (Web GIS, Application Servers) για τη δυναμικη προσβαση μεσω διαδικτυου στη βαση δεδομενων του Ελληνικου Εθνικου Κεντρου Ωκεανογραφικων

Διαβάστε περισσότερα

Επικοινωνία Client/Server

Επικοινωνία Client/Server Επικοινωνία Client/Server Χάρης Μανιφάβας Τμήμα Εφ. Πληροφορικής & Πολυμέσων ΤΕΙ Κρήτης Επικοινωνία - Client/Server 1 Μοντέλο Πελάτη-Εξυπηρετητή Βασική ιδέα: να δομηθεί το λειτουργικό σύστημα ως συνεργαζόμενες

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΜΕ ΘΕΜΑ: ΠΡΟΤΥΠΩΝ ΣΧΕΔΙΑΣΗΣ» της ΜΑΡΙΑΣ ΜΟΥΡΑΤΙΔΟΥ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΜΕ ΘΕΜΑ: ΠΡΟΤΥΠΩΝ ΣΧΕΔΙΑΣΗΣ» της ΜΑΡΙΑΣ ΜΟΥΡΑΤΙΔΟΥ ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΕΤΑΠΤΥΧΙΑΚΟ ΠΡΟΓΡΑΜΜΑ ΕΙΔΙΚΕΥΣΗΣ «ΣΥΣΤΗΜΑΤΑ ΥΠΟΛΟΓΙΣΤΩΝ» ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΜΕ ΘΕΜΑ: «ΑΝΑΠΤΥΞΗ JAVA EE ΕΦΑΡΜΟΓΩΝ ΜΕ ΧΡΗΣΗ ΛΟΓΙΣΜΙΚΟΥ ΑΝΟΙΚΤΟΥ ΚΩΔΙΚΑ

Διαβάστε περισσότερα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Ενότητα 1: Εισαγωγή στις Βάσεις Δεδομένων. Αθανάσιος Σπυριδάκος Διοίκηση Επιχειρήσεων

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Ενότητα 1: Εισαγωγή στις Βάσεις Δεδομένων. Αθανάσιος Σπυριδάκος Διοίκηση Επιχειρήσεων ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ενότητα 1: Εισαγωγή στις Βάσεις Δεδομένων Αθανάσιος Σπυριδάκος Διοίκηση Επιχειρήσεων Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Κεφάλαιο 6 ο. Διαχείριση στοιχείων λογισμικού

Κεφάλαιο 6 ο. Διαχείριση στοιχείων λογισμικού Κεφάλαιο 6 ο Διαχείριση στοιχείων λογισμικού Διδακτικοί στόχοι Να περιγραφούν οι κύριοι τύποι λογισμικού Να εξεταστεί το λογισμικό συστήματος και τα λειτουργικά συστήματα Να αναλυθούν οι πιο σημαντικές

Διαβάστε περισσότερα

Αβραμίδης Ελευθέριος Επιβλέπων καθηγητής Κωνσταντίνος Διαμαντάρας. ΤΕΙ Θεσσαλονίκης 17/2/2009

Αβραμίδης Ελευθέριος Επιβλέπων καθηγητής Κωνσταντίνος Διαμαντάρας. ΤΕΙ Θεσσαλονίκης 17/2/2009 Αβραμίδης Ελευθέριος Επιβλέπων καθηγητής Κωνσταντίνος Διαμαντάρας ΤΕΙ Θεσσαλονίκης 17/2/2009 Γ ΚΠΣ Γενική δομή έργων Γ ΚΠΣ Απαιτήσεις συστήματος Παρουσίαση συστήματος 2 2000-2006: Δίνονται πόροι από τα

Διαβάστε περισσότερα

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο 08 Η γλώσσα UML I Τεχνολογία Λογισμικού Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Χειμερινό εξάμηνο 2017 18 Δρ. Κώστας Σαΐδης saiko@di.uoa.gr Unified Modeling Language

Διαβάστε περισσότερα

Διαχείριση Ειδοποιήσεων με Κινητές Συσκευές

Διαχείριση Ειδοποιήσεων με Κινητές Συσκευές Διαχείριση Ειδοποιήσεων με Κινητές Συσκευές Λαμπαδαρίδης Αντώνιος el04148@mail.ntua.gr Διπλωματική εργασία στο Εργαστήριο Συστημάτων Βάσεων Γνώσεων και Δεδομένων Επιβλέπων: Καθηγητής Τ. Σελλής Περίληψη

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 3 ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ ΔΙΑΤΑΞΕΙΣ ΛΟΓΙΣΜΙΚΟΥ. Έννοιες-κλειδιά. Σύνοψη

ΚΕΦΑΛΑΙΟ 3 ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ ΔΙΑΤΑΞΕΙΣ ΛΟΓΙΣΜΙΚΟΥ. Έννοιες-κλειδιά. Σύνοψη ΚΕΦΑΛΑΙΟ 3 ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ ΔΙΑΤΑΞΕΙΣ ΛΟΓΙΣΜΙΚΟΥ Σκοπός του κεφαλαίου είναι η εισαγωγή της έννοιας της διάταξης λογισμικού, ως αρχιτεκτονικής δόμησης των υπολογιστικών πόρων και της ανάθεσης σε αυτούς συστατικών

Διαβάστε περισσότερα

Τεχνολογία Λογισμικού

Τεχνολογία Λογισμικού Τμήμα Πληροφορικής & Τηλεπικοινωνιών, ΕΚΠΑ Τεχνολογία Λογισμικού 8ο Εξάμηνο 2018 19 Unified Modeling Language II Δρ. Κώστας Σαΐδης saiko@di.uoa.gr Μοντελοποίηση δομής Διαγράμματα κλάσεων Class diagrams

Διαβάστε περισσότερα

Ενότητα 12 (κεφάλαιο 28) Αρχιτεκτονικές Εφαρμογών

Ενότητα 12 (κεφάλαιο 28) Αρχιτεκτονικές Εφαρμογών ΕΠΛ362: Τεχνολογία Λογισμικού ΙΙ (μετάφραση στα ελληνικά των διαφανειών του βιβλίου Software Engineering, 9/E, Ian Sommerville, 2011) Ενότητα 12 (κεφάλαιο 28) Αρχιτεκτονικές Εφαρμογών Οι διαφάνειες αυτές

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ - Π.Μ.Σ. ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ - Π.Μ.Σ. ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ > ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ - Π.Μ.Σ. ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΟΡΙΣΜΟΣ: Το Cloud Computing είναι η ονοµασία της τεχνολογίας η οποία επιτρέπει στους χρήστες να

Διαβάστε περισσότερα

* Enterprise Resource Planning ** Customer Relationship Management

* Enterprise Resource Planning ** Customer Relationship Management Υπηρεσιοστρεφείς Επιχειρησιακές ιαδικασίες ιαµοιρασµός και Επαναχρησιµοποίηση Αποτελούν βασικές απαιτήσειςκατά το σχεδιασµό και την ολοκλήρωση (integration) επιχειρησιακών διαδικασιών ιαµοιρασµός: πολλοί

Διαβάστε περισσότερα

Φορολογική Βιβλιοθήκη. Θανάσης Φώτης Προγραμματιστής Εφαρμογών

Φορολογική Βιβλιοθήκη. Θανάσης Φώτης Προγραμματιστής Εφαρμογών Φορολογική Βιβλιοθήκη Θανάσης Φώτης Προγραμματιστής Εφαρμογών Το έργο Η φορολογική βιβλιοθήκη πρόκειται για ένα έργο που φιλοδοξεί να αποτελέσει σημαντικό βοήθημα για τον επαγγελματία λογιστή και όχι μόνο.

Διαβάστε περισσότερα

Περιεχόμενα. Visio / White paper 1

Περιεχόμενα. Visio / White paper 1 Περιεχόμενα Τι είναι η πλατφόρμα Visio Αρχιτεκτονική Δουλεύοντας με το Περιεχόμενο Πηγές Περιεχόμενου Διαγραφή Περιεχομένου Βασικές Λειτουργίες Προφίλ Χρήστη Διαχείριση Χρηστών Σύστημα Διαφημίσεων Αποθήκευση

Διαβάστε περισσότερα

Περιεχόμενα ΜΕΡΟΣ ΠΡΩΤΟ. Πρόλογος... 13

Περιεχόμενα ΜΕΡΟΣ ΠΡΩΤΟ. Πρόλογος... 13 Περιεχόμενα Πρόλογος... 13 ΜΕΡΟΣ ΠΡΩΤΟ Κεφ. 1 Περί προγραμματισμού και γλωσσών προγραμματισμού Προγράμματα και Λειτουργικά Συστήματα... 17 Γλώσσες προγραμματισμού και εργαλεία ανάπτυξης προγραμμάτων...

Διαβάστε περισσότερα

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Εισαγωγή. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Εισαγωγή. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Εισαγωγή Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική Θεσσαλονίκη, Σεπτέμβριος 2013 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για

Διαβάστε περισσότερα

Java & Java EE 3o Μέρος: Διασφάλιση ασφάλειας σε εφαρμογές Java Enterprise Edition. Κακαρόντζας Γεώργιος

Java & Java EE 3o Μέρος: Διασφάλιση ασφάλειας σε εφαρμογές Java Enterprise Edition. Κακαρόντζας Γεώργιος Java & Java EE 3o Μέρος: Διασφάλιση ασφάλειας σε εφαρμογές Java Enterprise Edition Κακαρόντζας Γεώργιος Μεθοδολογία Θα υλοποιήσουμε την λεγόμενη πιστοποίηση μέσω φόρμας στοιχείων εισόδου (form-based authentication)

Διαβάστε περισσότερα

Πρωτόκολλα Επικοινωνίας και Τείχος Προστασίας

Πρωτόκολλα Επικοινωνίας και Τείχος Προστασίας Β5.1.2 Πρωτόκολλα Επικοινωνίας και Τείχος Προστασίας Τι θα μάθουμε σήμερα: Να ορίζουμε τι είναι πρωτόκολλο επικοινωνίας Να εξηγούμε τη χρησιμότητα των πρωτοκόλλων επικοινωνίας Να ονομάζουμε τα σημαντικότερα

Διαβάστε περισσότερα

Τι είναι ένα δίκτυο υπολογιστών; Αρχιτεκτονική επιπέδων πρωτοκόλλων. Δικτυακά πρωτόκολλα

Τι είναι ένα δίκτυο υπολογιστών; Αρχιτεκτονική επιπέδων πρωτοκόλλων. Δικτυακά πρωτόκολλα Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15 Δίκτυα υπολογιστών (και το Διαδίκτυο) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι ένα δίκτυο υπολογιστών;

Διαβάστε περισσότερα

Διαδικτυακές Εφαρμογές Ενότητα 3: Ανάπτυξη JavaEE 6 εφαρμογής με JSF2, EJB3 και JPA

Διαδικτυακές Εφαρμογές Ενότητα 3: Ανάπτυξη JavaEE 6 εφαρμογής με JSF2, EJB3 και JPA Διαδικτυακές Εφαρμογές Ενότητα 3: Ανάπτυξη JavaEE 6 εφαρμογής με JSF2, EJB3 και JPA Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης

Διαβάστε περισσότερα

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED σχεδιασμός ιστοσελίδας ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED σχεδιασμός ιστοσελίδας ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED σχεδιασμός ιστοσελίδας ΕΚΔΟΣΗ 1.0 ΤΙ ΕΙΝΑΙ ΤΟ ADVANCED Οι Advanced θεματικές ενότητες είναι είναι κατάλληλες για άτομα που επιθυμούν να συνεχίσουν σπουδές στο χώρο της

Διαβάστε περισσότερα

CORBA. Αρχιτεκτονική και 3-tier 3. εφαρµογές. Β. Φλώρος. Μαρτάκος. Τµήµα Πληροφορικής και Τηλεπικοινωνιών Εθνικό και Καποδιστιακό Πανεπιστήµιο Αθηνών

CORBA. Αρχιτεκτονική και 3-tier 3. εφαρµογές. Β. Φλώρος. Μαρτάκος. Τµήµα Πληροφορικής και Τηλεπικοινωνιών Εθνικό και Καποδιστιακό Πανεπιστήµιο Αθηνών CORBA Αρχιτεκτονική και 3-tier 3 εφαρµογές Β. Φλώρος. Μαρτάκος Συνεργάτης ερευνητής Επικ. Καθηγητής Τµήµα Πληροφορικής και Τηλεπικοινωνιών Εθνικό και Καποδιστιακό Πανεπιστήµιο Αθηνών Τι Είναι; CORBA =

Διαβάστε περισσότερα

Κεφάλαιο 1. Βασικά Στοιχεία της Java... 13

Κεφάλαιο 1. Βασικά Στοιχεία της Java... 13 Περιεχόμενα Πρόλογος... 5 Κεφάλαιο 1. Βασικά Στοιχεία της Java.... 13 Τύποι Δεδομένων, Μεταβλητές και Πίνακες... 13 Τελεστές και Δομές Επιλογής Επανάληψης... 16 Κλάσεις και Μέθοδοι... 21 Πακέτα και Διασυνδέσεις...

Διαβάστε περισσότερα

Η Βίβλος σχετικά με το JDBC. Περιέχει τρία βασικά tutorials στα οποία θα βασιστεί το μάθημα και περιγράφει όλες τις τάξεις και τις μεθόδους που

Η Βίβλος σχετικά με το JDBC. Περιέχει τρία βασικά tutorials στα οποία θα βασιστεί το μάθημα και περιγράφει όλες τις τάξεις και τις μεθόδους που 1 Η Βίβλος σχετικά με το JDBC. Περιέχει τρία βασικά tutorials στα οποία θα βασιστεί το μάθημα και περιγράφει όλες τις τάξεις και τις μεθόδους που μπορούμε να χρησιμοποιήσουμε σε μία JDBC εφαρμογή. Υπάρχει

Διαβάστε περισσότερα

Υπολογιστική Νέφους Cloud computing

Υπολογιστική Νέφους Cloud computing Υπολογιστική Νέφους Cloud computing Χρ. Ηλιούδης Clouds Cloud computing??? Διείσδυση του Cloud Ορισμός - χαρακτηριστικά Ο όρος cloud έχει τις ρίζες στου στην αρχή του internet όπου συνήθιζαν να το αναπαριστούν

Διαβάστε περισσότερα

ΟΙΚΟΝΟΜΙΚΗ ΠΡΟΣΦΟΡΑ ΣΧΕ ΙΑΣΗΣ ΚΑΙ ΚΑΤΑΣΚΕΥΗΣ web εφαρµογής - ηλεκτρονικού κατατήµατος για έξυπνα κινητά

ΟΙΚΟΝΟΜΙΚΗ ΠΡΟΣΦΟΡΑ ΣΧΕ ΙΑΣΗΣ ΚΑΙ ΚΑΤΑΣΚΕΥΗΣ web εφαρµογής - ηλεκτρονικού κατατήµατος για έξυπνα κινητά ΟΙΚΟΝΟΜΙΚΗ ΠΡΟΣΦΟΡΑ ΣΧΕ ΙΑΣΗΣ ΚΑΙ ΚΑΤΑΣΚΕΥΗΣ web εφαρµογής - ηλεκτρονικού κατατήµατος για έξυπνα κινητά Για την STUDIO KOSTA BODA ILLUM Χανίων Πέµπτη, 9 Φεβρουαρίου 2012 Για την εταιρεία ACTS : Παπαγεωργίου

Διαβάστε περισσότερα

Κατανεμημένα Συστήματα με Java. Ενότητα # 18: Υπηρεσίες Ιστού Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Κατανεμημένα Συστήματα με Java. Ενότητα # 18: Υπηρεσίες Ιστού Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Κατανεμημένα Συστήματα με Java Ενότητα # 18: Υπηρεσίες Ιστού Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου

Διαβάστε περισσότερα

Web and HTTP. Βασικά Συστατικά: Web Server Web Browser HTTP Protocol

Web and HTTP. Βασικά Συστατικά: Web Server Web Browser HTTP Protocol HTTP Protocol Web and HTTP Βασικά Συστατικά: Web Server Web Browser HTTP Protocol Web Servers (1/2) Ένα πρόγραμμα (λογισμικό) που έχει εγκατασταθεί σε ένα υπολογιστικό σύστημα (έναν ή περισσότερους υπολογιστές)

Διαβάστε περισσότερα

PROXY SERVER. Άριστη πύλη διαχωρισμού μεταξύ του εσωτερικού δικτύου και του Internet.

PROXY SERVER. Άριστη πύλη διαχωρισμού μεταξύ του εσωτερικού δικτύου και του Internet. PROXY SERVER Άριστη πύλη διαχωρισμού μεταξύ του εσωτερικού δικτύου και του Internet. Αποτελεσματικό εργαλείο για την απόκρυψη των εσωτερικών λεπτομερειών και διευθύνσεων IP του δικτύου. Αυξάνει τη συνολική

Διαβάστε περισσότερα

Σύστημα υποβολής αιτήσεων υποψήφιων συνεργατών ΕΚΤ

Σύστημα υποβολής αιτήσεων υποψήφιων συνεργατών ΕΚΤ Σύστημα υποβολής αιτήσεων υποψήφιων συνεργατών ΕΚΤ 1 Λειτουργικές απαιτήσεις Το σύστημα υποβολής αιτήσεων υποψήφιων συνεργατών στοχεύει στο να επιτρέπει την πλήρως ηλεκτρονική υποβολή αιτήσεων από υποψήφιους

Διαβάστε περισσότερα

Γκέγκα Ευρώπη Κωστοπούλου Ειρήνη

Γκέγκα Ευρώπη Κωστοπούλου Ειρήνη Γκέγκα Ευρώπη egkegka@it.teithe.gr Κωστοπούλου Ειρήνη eirkost@it.teithe.gr 2 ο σε επισκεψιμότητα των χρηστών στο web καθημερινά Κοινωνικό δίκτυο με τους περισσότερους χρήστες 1 ο σε προτίμηση των φοιτητών

Διαβάστε περισσότερα

Ανάπτυξη Υπηρεσίας Τηλεκπαίδευσης σε ΙP Δίκτυα. Υλοποίηση Σύγχρονης Τηλεκπαίδευσης

Ανάπτυξη Υπηρεσίας Τηλεκπαίδευσης σε ΙP Δίκτυα. Υλοποίηση Σύγχρονης Τηλεκπαίδευσης Ανάπτυξη Υπηρεσίας Τηλεκπαίδευσης σε ΙP Δίκτυα. Υλοποίηση Σύγχρονης Τηλεκπαίδευσης Σπουδαστές: Μιχαήλ Μιχάλης ΑΜ:5089 Αναγνωστόπουλος Σπύρος ΑΜ:3692 Υπεύθυνος καθηγητής: Αναλυτή Κατερίνα Άρτα 2006 E- learning

Διαβάστε περισσότερα

"Ανάπτυξη προηγμένης εφαρμογής απεικόνισης και ενσωμάτωσης Υπηρεσιών Καταλόγου (LDAP) με τη χρήση των τεχνολογιών Web 2.0"

Ανάπτυξη προηγμένης εφαρμογής απεικόνισης και ενσωμάτωσης Υπηρεσιών Καταλόγου (LDAP) με τη χρήση των τεχνολογιών Web 2.0 "Ανάπτυξη προηγμένης εφαρμογής απεικόνισης και ενσωμάτωσης Υπηρεσιών Καταλόγου (LDAP) με τη χρήση των τεχνολογιών Web 2.0" Βλαχάκης Εμμανουήλ Οικονομάκης Σπυρίδων Εισηγητής: Δ.Ν. Καλλέργης, MSc. Εργ. Συνεργάτης

Διαβάστε περισσότερα

ΟΙΚΟΝΟΜΙΚΗ ΠΡΟΣΦΟΡΑ ΣΧΕ ΙΑΣΗΣ ΚΑΙ ΚΑΤΑΣΚΕΥΗΣ ΙΑ ΙΚΤΥΑΚΟΥ ΠΛΗΡΟΦΟΡΙΑΚΟΎ ΣΥΣΤΗΜΑΤΟΣ. Τρίτη, 7 Φεβρουαρίου 2012

ΟΙΚΟΝΟΜΙΚΗ ΠΡΟΣΦΟΡΑ ΣΧΕ ΙΑΣΗΣ ΚΑΙ ΚΑΤΑΣΚΕΥΗΣ ΙΑ ΙΚΤΥΑΚΟΥ ΠΛΗΡΟΦΟΡΙΑΚΟΎ ΣΥΣΤΗΜΑΤΟΣ. Τρίτη, 7 Φεβρουαρίου 2012 ΟΙΚΟΝΟΜΙΚΗ ΠΡΟΣΦΟΡΑ ΣΧΕ ΙΑΣΗΣ ΚΑΙ ΚΑΤΑΣΚΕΥΗΣ ΙΑ ΙΚΤΥΑΚΟΥ ΠΛΗΡΟΦΟΡΙΑΚΟΎ ΣΥΣΤΗΜΑΤΟΣ Τρίτη, 7 Φεβρουαρίου 2012 Για την εταιρεία ACTS : Παπαγεωργίου Κων/νος Ποτιέ 21/ Χανιά, ΤΚ 73100 AΦΜ: 065439343 Τηλ./Fax:

Διαβάστε περισσότερα

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία Λειτουργικά Συστήματα Ι Καθηγήτρια Παπαδάκη Αναστασία 2013 1 Ηλεκτρονικός Υπολογιστής αποτελείται: 1. Από Υλικό Hardware (CPUs, RAM, Δίσκοι), & 2. Λογισμικό - Software Και μπορεί να εκτελέσει διάφορες

Διαβάστε περισσότερα

Information Technology for Business

Information Technology for Business Information Technology for Business Lecturer: N. Kyritsis, MBA, Ph.D. Candidate e-mail: kyritsis@ist.edu.gr Computer System Hardware Υποδομή του Information Technology Υλικό Υπολογιστών (Hardware) Λογισμικό

Διαβάστε περισσότερα

Όλες οι υπηρεσίες είναι διαθέσιμες μέσω διαδικτύου.

Όλες οι υπηρεσίες είναι διαθέσιμες μέσω διαδικτύου. ΚΕΦΑΛΑΙΟ 13 Όλες οι υπηρεσίες είναι διαθέσιμες μέσω διαδικτύου. Οι υπηρεσίες νέφους παρέχονται με τέτοιο τρόπο ώστε ο τελικός χρήστης δεν μπορεί να διακρίνει τεχνικές λεπτομέρειες. Η χρηστικότητα, η διαθεσιμότητα

Διαβάστε περισσότερα

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ Οδηγός Εργαστηρίου για το Μεταπτυχιακό Μάθημα Τεχνολογία Διοίκησης

Διαβάστε περισσότερα

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15. Δίκτυα υπολογιστών. (και το Διαδίκτυο)

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15. Δίκτυα υπολογιστών. (και το Διαδίκτυο) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15 Δίκτυα υπολογιστών (και το Διαδίκτυο) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι ένα δίκτυο υπολογιστών;

Διαβάστε περισσότερα

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΠΕΙΡΑΙΑ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΤΟΜΕΑΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ, ΠΛΗΡΟΦΟΡΙΚΗΣ & ΙΚΤΥΩΝ Εργ. Τεχνολογίας Λογισμικού & Υπηρεσιών S 2 E Lab Π Τ Υ Χ Ι

Διαβάστε περισσότερα

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Επιχειρηματική Μοντελοποίηση. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Επιχειρηματική Μοντελοποίηση. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Επιχειρηματική Μοντελοποίηση Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική Θεσσαλονίκη, Σεπτέμβριος 2013 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης

Διαβάστε περισσότερα

ΜΑΘΗΜΑ: Εργαλεία Ανάπτυξης εφαρμογών internet.

ΜΑΘΗΜΑ: Εργαλεία Ανάπτυξης εφαρμογών internet. ΜΑΘΗΜΑ: Εργαλεία Ανάπτυξης εφαρμογών internet. ΩΡΕΣ ΔΙΔΑΣΚΑΛΙΑΣ: ΕΙΔΟΣ ΜΑΘΗΜΑΤΟΣ: Μικτό Γενικός σκοπός είναι να αποκτήσει ο καταρτιζόμενος τις αναγκαίες γνώσεις σχετικά με εργαλεία και τις τεχνικές για

Διαβάστε περισσότερα

Ταχύτητα, Απλότητα & Αξιοπιστία

Ταχύτητα, Απλότητα & Αξιοπιστία Ταχύτητα, Απλότητα & Αξιοπιστία Αρχιτεκτονική Μηχανισμοί Αυτοελέγχου Συνδεσιμότητα Περιβάλλον Εργασίας Πληροφορίες Σχήματος Report Builder Import Manager Αρχιτεκτονική Real Time Multithreading Σταθερότητα

Διαβάστε περισσότερα

Σχεδιασµός βασισµένος σε συνιστώσες

Σχεδιασµός βασισµένος σε συνιστώσες Σχεδιασµός βασισµένος σε συνιστώσες 1 Ενδεικτικά περιεχόµενα του κεφαλαίου Ποια είναι τα "άτοµα", από τα οποία κατασκευάζονται οι υπηρεσίες; Πώς οργανώνουµε τις συνιστώσες σε ένα αρµονικό σύνολο; Τι είναι

Διαβάστε περισσότερα

BO.M.I.S BOLLARD MANAGEMENT INFORMATION SYSTEM ΛΟΓΙΣΜΙΚΟ ΔΙΑΧΕΙΡΗΣΗΣ ΑΝΑΔΥΟΜΕΝΩΝ ΠΑΣΑΛΩΝ ΔΙΑΧΕΙΡΗΣΗΣ ΚΥΚΛΟΦΟΡΙΑΣ BOMIS-V1-2012

BO.M.I.S BOLLARD MANAGEMENT INFORMATION SYSTEM ΛΟΓΙΣΜΙΚΟ ΔΙΑΧΕΙΡΗΣΗΣ ΑΝΑΔΥΟΜΕΝΩΝ ΠΑΣΑΛΩΝ ΔΙΑΧΕΙΡΗΣΗΣ ΚΥΚΛΟΦΟΡΙΑΣ BOMIS-V1-2012 BO.M.I.S BOLLARD MANAGEMENT INFORMATION SYSTEM ΛΟΓΙΣΜΙΚΟ ΔΙΑΧΕΙΡΗΣΗΣ ΑΝΑΔΥΟΜΕΝΩΝ ΠΑΣΑΛΩΝ ΔΙΑΧΕΙΡΗΣΗΣ ΚΥΚΛΟΦΟΡΙΑΣ 1 - ΛΟΓΙΣΜΙΚΟ ΔΙΑΧΕΙΡΗΣΗΣ ΑΝΑΔΥΟΜΕΝΩΝ ΠΑΣΑΛΩΝ ΔΙΑΧΕΙΡΗΣΗΣ ΚΥΚΛΟΦΟΡΙΑΣ Το σύστημα διαχείρισης

Διαβάστε περισσότερα

ΠΥΡΗΝΑΣ ΕΦΑΡΜΟΓΗΣ Γενικά Συμμόρφωση με πρότυπα (PACS Core)

ΠΥΡΗΝΑΣ ΕΦΑΡΜΟΓΗΣ Γενικά Συμμόρφωση με πρότυπα (PACS Core) Επιτροπή τεχνικών προδιαγραφών Αίγιο 07/12/2015 Για την Προμήθεια ΑΠΕΙΚΟΝΙΣΤΙΚΟΥ ΣΥΣΤΗΜΑΤΟΣ ΑΡΧΕΙΟΘΕΤΗΣΗΣ ΕΙΚΟΝΩΝ (PACS) Οργανικής Μονάδας Αιγίου Προς: Γραφείο Προμηθειών Τεχνικές Προδιαγραφές Α/Α ΠΕΡΙΓΡΑΦΗ

Διαβάστε περισσότερα

Η συμβολή στην επιτυχία ενός οργανισμού, παρουσιάζοντας σχετικά δεδομένα με τη χρήση τεχνικών 2Δ ή 3Δ τεχνολογίας. Αρμοδιότητα

Η συμβολή στην επιτυχία ενός οργανισμού, παρουσιάζοντας σχετικά δεδομένα με τη χρήση τεχνικών 2Δ ή 3Δ τεχνολογίας. Αρμοδιότητα Σχεδιαστής Ψηφιακών Κινούμενων Σχεδίων ή Digital Animator 1. Περιγραφή Ρόλου Τίτλος Προφίλ Σχε Σχεδιαστής Ψηφιακών Κινούμενων Σχεδίων ή Digital Animator Γνωστό και ως Ειδικός Σχεδιασμού 2Δ- 3Δ γραφικών,

Διαβάστε περισσότερα

Ανάπτυξη Plugins για το AgentSheets

Ανάπτυξη Plugins για το AgentSheets Ανάπτυξη Plugins για το AgentSheets Thought Amplifier AgentSheets Ανάπτυξη Plugins AgentSheets 2.5 Συγγραφείς Τεκµηρίωσης: Alexander Repenning και Ronald Sudomo Εξελληνισµός Τεκµηρίωσης: Λίνος Βίγκλας,

Διαβάστε περισσότερα

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΠΕΙΡΑΙΑ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΤΟΜΕΑΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ, ΠΛΗΡΟΦΟΡΙΚΗΣ & ΙΚΤΥΩΝ Εργ. Τεχνολογίας Λογισμικού & Υπηρεσιών S 2 ELab Π Τ Υ Χ Ι Α

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική»

Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική» Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική» Μεταπτυχιακή Διατριβή Τίτλος Διατριβής Ανάπτυξη Πλατφόρμας Διαδικτυακής Δημοσίευσης Χαρτογραφικών Δεδομένων Developing

Διαβάστε περισσότερα

Διαχείριση Πολιτισμικών Δεδομένων

Διαχείριση Πολιτισμικών Δεδομένων Διαχείριση Πολιτισμικών Δεδομένων Μάθημα 1 Εισαγωγή στις Βάσεις Δεδομένων Τζανέτος Πομόνης ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Συντήρησης Πολιτισμικής Κληρονομιάς Τι είναι οι Βάσεις

Διαβάστε περισσότερα

Επιχειρησιακά Πληροφοριακά Συστήματα. Site: www.aggelopoulos.tk e-mail: ioannis.aggelopoulos@gmail.com. Στόχος Σκοπός μαθήματος

Επιχειρησιακά Πληροφοριακά Συστήματα. Site: www.aggelopoulos.tk e-mail: ioannis.aggelopoulos@gmail.com. Στόχος Σκοπός μαθήματος Επιχειρησιακά Πληροφοριακά Συστήματα Διδάσκων: Αγγελόπουλος Γιάννης Δευτέρα 3-5 Τρίτη 4-6 Εργαστήριο Α Site: www.aggelopoulos.tk e-mail: ioannis.aggelopoulos@gmail.com 1 Στόχος Σκοπός μαθήματος Σκοπός:

Διαβάστε περισσότερα

Σχεδιαστικά Προγράμματα Επίπλου

Σχεδιαστικά Προγράμματα Επίπλου Σχεδιαστικά Προγράμματα Επίπλου Καθηγήτρια ΦΕΡΦΥΡΗ ΣΩΤΗΡΙΑ Τμήμα ΣΧΕΔΙΑΣΜΟΥ & ΤΕΧΝΟΛΟΓΙΑΣ ΞΥΛΟΥ - ΕΠΙΠΛΟΥ Σχεδιαστικά Προγράμματα Επίπλου Η σχεδίαση με τον παραδοσιακό τρόπο απαιτεί αυξημένο χρόνο, ενώ

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 8: Λειτουργικά Συστήματα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

Διαβάστε περισσότερα

Ανάλυση Πληροφοριακών Συστημάτων. Εαρινό Εξάμηνο Lec06 (Εργαστήριο) 26/03/2019 Διδάσκων: Γεώργιος Χρ. Μακρής

Ανάλυση Πληροφοριακών Συστημάτων. Εαρινό Εξάμηνο Lec06 (Εργαστήριο) 26/03/2019 Διδάσκων: Γεώργιος Χρ. Μακρής Ανάλυση Πληροφοριακών Συστημάτων Εαρινό Εξάμηνο 2018-2019 Lec06 (Εργαστήριο) 26/03/2019 Διδάσκων: Γεώργιος Χρ. Μακρής Διαλέξεις παρουσιάσεις Το υλικό του μαθήματος στηρίζεται στο υλικό που χρησιμοποίησε

Διαβάστε περισσότερα

Κατανεμημένα Συστήματα. Ενότητα # 11: Μηνυματοστρεφές ενδιάμεσο λογισμικό Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Κατανεμημένα Συστήματα. Ενότητα # 11: Μηνυματοστρεφές ενδιάμεσο λογισμικό Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Κατανεμημένα Συστήματα Ενότητα # 11: Μηνυματοστρεφές ενδιάμεσο λογισμικό Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού

Διαβάστε περισσότερα

Προγραμματισμός διαδικτυακών εφαρμογών με PHP

Προγραμματισμός διαδικτυακών εφαρμογών με PHP ΕΣΔ516: Τεχνολογίες Διαδικτύου Προγραμματισμός διαδικτυακών εφαρμογών με PHP Ερωτήματα μέσω Περιεχόμενα Περιεχόμενα Λογισμικό για εφαρμογές Web Η τριεπίπεδη αρχιτεκτονική (3-tier architecture) Εισαγωγή

Διαβάστε περισσότερα

Μια καλή επιλογή θα ήταν www.epipla-onomasas.gr (χωρίζοντας τις λέξεις με παύλα -) ή

Μια καλή επιλογή θα ήταν www.epipla-onomasas.gr (χωρίζοντας τις λέξεις με παύλα -) ή Τι είναι ένα CMS CMS ή Σύστημα Διαχείρισης Περιεχομένου (Content Management System) ονομάζουμε ένα λογισμικό που μας βοηθά να ελέγχουμε και να διαχειριζόμαστε έναν ιστότοπο δημόσιας ή περιορισμένης πρόσβασης.

Διαβάστε περισσότερα