Προγραμματισμός

JAX-RS με Τζέρσεϋ: Μια εισαγωγή

Η προδιαγραφή JAX-RS (JSR 311: The Java API for RESTful Web Services) παρέχει μια τυποποιημένη προσέγγιση που βασίζεται σε Java για την εφαρμογή υπηρεσιών διαδικτύου τύπου REST. Το Jersey είναι η εφαρμογή αναφοράς του JAX-RS και παρέχω μια σύντομη εισαγωγή στο JAX-RS μέσω του Jersey σε αυτήν την ανάρτηση ιστολογίου.

Αν και το Jersey δεν απαιτεί τη χρήση του GlassFish, χρησιμοποιώ το Jersey σε συνδυασμό με το GlassFish v3 σε αυτήν την ανάρτηση. Το GlassFish v3 παρέχει την εφαρμογή αναφοράς για το Java EE 6. Πραγματοποιώ λήψη του προγράμματος εγκατάστασης Windows GlassFish v3 και το έτρεξα για εγκατάσταση. Μετά την εγκατάστασή του, έχω ορίσει τη μεταβλητή περιβάλλοντος GLASSFISH_HOME για να δείξετε τον ριζικό κατάλογο της εγκατάστασης και να προστεθεί % GLASSFISH_HOME% στο δικό μου ΜΟΝΟΠΑΤΙ. Το GlassFish μπορεί στη συνέχεια να εκτελεστεί με την εντολή αρχικός τομέας asadmin (ξεκινά τον προεπιλεγμένο τομέα) όπως φαίνεται στο επόμενο στιγμιότυπο οθόνης.

Επειδή χρησιμοποίησα τις προεπιλεγμένες ρυθμίσεις κατά την εγκατάσταση του GlassFish, η διαδικτυακή κονσόλα διαχείρισης είναι διαθέσιμη στο μηχάνημά μου στο URI // localhost: 4848 / (η προεπιλεγμένη θύρα είναι 4848). Με το GlassFish σε λειτουργία, αυτό το URI οδηγεί στη σελίδα σύνδεσης για την Κονσόλα διαχείρισης. Το όνομα χρήστη και ο κωδικός πρόσβασης διαχείρισης καθορίστηκαν στην εγκατάσταση. Αυτή η οθόνη εμφανίζεται στο επόμενο στιγμιότυπο οθόνης.

Με την εγκατάσταση του GlassFish, τώρα προχωράω στην ανάπτυξη μιας πολύ απλής εφαρμογής REST χρησιμοποιώντας το Jersey. Ξεκινώ με μια σωστά σχολιασμένη κλάση JAX-RS που ονομάζεται MovieOfTheDay:

MovieOfTheDay.java

πακέτο rmoug.td2010.rest; εισαγωγή java.util.Calendar; εισαγωγή java.util.HashMap; εισαγωγή java.util.Map; εισαγωγή java.util.logging.Logger; εισαγωγή javax.ws.rs.GET; εισαγωγή javax.ws.rs.Path; εισαγωγή javax.ws.rs.PathParam; εισαγωγή javax.ws.rs.Consumes; εισαγωγή javax.ws.rs.Produces; / ** * Απλή τάξη που παρέχει μια ταινία για τον παρεχόμενο μήνα και την ημέρα αυτού του * μήνα. * / @Path ("/ movies") δημόσια τάξη MovieOfTheDay {private static final Logger LOGGER = Logger.getLogger ("rmoug.td2010.rest.MovieOfTheDay"); ιδιωτικός τελικός χάρτης MOVIE_OF_THE_DAY; στατικό {MOVIE_OF_THE_DAY = νέο HashMap(); τελικός Χάρτης janMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JANUARY), janMovies); τελικός Χάρτης febMovies = νέο HashMap (); febMovies.put (2, "Groundhog Day"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.FEBRUARY), febMovies); τελικός Χάρτης marMovies = νέο HashMap (); marMovies.put (16, "Ο φυγάς"); marMovies.put (17, "Darby O'Gill and the Little People"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MARCH), marMovies); τελικός Χάρτης aprMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.APRIL), aprMovies); τελικός Χάρτης mayMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.MAY), mayMovies); τελικός Χάρτης junMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JUNE), junMovies); τελικός Χάρτης julMovies = νέο HashMap (); julMovies.put (4, "Ημέρα Ανεξαρτησίας"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.JULY), julMovies); τελικός Χάρτης augMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.AUGUST), augMovies); τελικός Χάρτης sepMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Ημερολόγιο.SEPTEMBER), sepMovies); τελικός Χάρτης octMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.OCTOBER), octMovies); τελικός Χάρτης novMovies = νέο HashMap (); MOVIE_OF_THE_DAY.put (Integer.valueOf (Calendar.NOVEMBER), novMovies); final Map decMovies = νέο HashMap (); decMovies.put (24, "Είναι μια υπέροχη ζωή"); decMovies.put (25, "A Christmas Carol"); decMovies.put (26, "Μια Χριστουγεννιάτικη ιστορία"); MOVIE_OF_THE_DAY.put (Integer.valueOf (Ημερολόγιο.DECEMBER), decMovies); } @GET @Path ("/") @Produces ("text / plain") δημόσια συμβολοσειρά getMovie () {return "Για να δείτε την ταινία της ημέρας, δώστε στη διεύθυνση URL μήνα και ημέρα:" + "\ t // localhost : 8080 / υπόλοιπο / πόροι / ταινίες / <> / <> "; } / ** * Αποκτήστε την ταινία της ημέρας όπως υποδεικνύεται από τον παρεχόμενο μήνα και την ημερομηνία. * * @param μήνας Μήνας για τον οποίο επιθυμείτε ταινία της ημέρας. * @param date Ημερομηνία για την οποία επιθυμείτε ταινία της ημέρας. * @return Τίτλος της ταινίας της ημέρας για τον παρεχόμενο μήνα και ημερομηνία. * / @GET @Path ("/ {month} / {date}") @Consumes ("text / plain") @Produces ("text / html") δημόσια συμβολοσειρά getMovieOfTheDay (@PathParam ("μήνας") τελικός μήνας Integer , @PathParam ("date") final Integer date) {final Map moviesOfTheMonth = MOVIE_OF_THE_DAY.get (μήνας-1); final String movieOfTheDay = ταινίεςOfTheMonth! = null; moviesOfTheMonth.get (ημερομηνία): "Fletch"; επιστροφή ταινίαςOfTheDay! = null; createHtml (movieOfTheDay, μήνας, ημερομηνία): createHtml ("Fletch Lives!", μήνας, ημερομηνία); } private String createHtml (final String movieTitle, final int movieMonth, final int movieDay) {final StringBuilder builder = νέο StringBuilder (); builder.append ("") .append ("Movie of the Day"). append ("Ταινία της ημέρας"). append ("

Η ταινία της ημέρας για ") .append (movieMonth) .append (" / ") .append (movieDay) .append (" is '") .append (movieTitle) .append ("'.

"); return builder.toString ();}}

Το μπλοκ στατικής αρχικοποίησης δεν είναι συγκεκριμένο για το JAX-RS, αλλά χρησιμοποιείται για την προσομοίωση μιας βάσης δεδομένων. Σε μια πραγματική εφαρμογή REST, θα είχα σχεδόν σίγουρα μια βάση δεδομένων στο πίσω μέρος, αλλά ο στατικός χάρτης στη μνήμη το προσομοιώνει εδώ.

Αν και απλή, η παραπάνω κατηγορία παρουσιάζει βασικά χαρακτηριστικά JAX-RS. Τα πιο ενδιαφέροντα κομμάτια JAX-RS της κατηγορίας είναι οι σχολιασμοί JAX-RS όπως @Path, @GET, @Consumes, @Produces και @PathParam. Δεν θα ερευνήσω τι κάνουν αυτοί οι σχολιασμοί JAX-RS σε αυτήν την ανάρτηση, επειδή η έμφαση μου είναι στη χρήση του Jersey. Για περισσότερες πληροφορίες σχετικά με αυτούς τους σχολιασμούς, ανατρέξτε στο κεφάλαιο Java EE 6 Tutorial on REST with Jersey.

Θα αναπτύξω την σχολιασμένη κλάση JAX-RS στο GlassFish σε ένα αρχείο WAR με το κατάλληλο web.xml αρχείο όπως φαίνεται στη συνέχεια:

web.xml

  ServletAdaptor com.sun.jersey.spi.container.servlet.ServletContainer 1 ServletAdaptor / πόροι / * 30 

Στην περίπτωσή μου, το NetBeans 6.8 το δημιούργησε web.xml αρχείο για μένα αυτόματα όταν πρόσθεσα τα κατάλληλα αρχεία JAX-RS και Jersey JAR στις βιβλιοθήκες του έργου μου. Αυτό είναι σχετικά απλό web.xml αρχείο λόγω της συνειδητοποίησης του GlassFish για το JAX-RS. (Ένα εντυπωσιακά παρόμοιο web.xml λειτουργεί για την ανάπτυξη εφαρμογών REST με βάση το Τζέρσεϋ στο Tomcat, όπως αποδεικνύεται στην ανάρτηση ιστολογίου του Jason Drake.

Για παράδειγμα, ονομάστηκε ένα αρχείο WAR Υπόλοιπο1.war δημιουργείται. Τα περιεχόμενά του εμφανίζονται στο επόμενο στιγμιότυπο οθόνης.

Όπως δείχνει το στιγμιότυπο οθόνης, υπάρχουν αρχεία JAX-RS και Jersey JAR που περιλαμβάνονται στο δημιουργημένο αρχείο WAR. Η τάξη Εφαρμογή MovieRest μπορεί να αγνοηθεί επειδή δεν χρησιμοποιείται με το Jersey στο GlassFish. Αυτό σημαίνει ότι τα μόνα προσαρμοσμένα αρχεία στο WAR είναι η σχολιασμένη κλάση JAX-RS MovieOfTheDay, ο web.xml αρχείο και τη σελίδα ευρετηρίου (index.jsp). Το περιεχόμενο του index.jsp Η σελίδα εμφανίζεται στη συνέχεια.

index.jsp

    REST με Παράδειγμα JAX-RS 

Το επόμενο στιγμιότυπο οθόνης δείχνει την ανάπτυξη του παραγόμενου αρχείου WAR μέσω της διαδικτυακής γυάλινης κονσόλας διαχείρισης:

Η πιο σημαντική λεπτομέρεια που πρέπει να σημειωθεί από την εικόνα της ανάπτυξης του αρχείου WAR είναι ότι έχω ονομάσει τη ρίζα περιβάλλοντος "υπόλοιπο". Αυτό θα είναι μέρος των URI μέσω των οποίων έχουν πρόσβαση οι αναπτυσσόμενες υπηρεσίες REST μου. Το νωρίτερο web.xml το αρχείο έδειξε επίσης ότι πόροι/ θα είναι επίσης μέρος αυτού του URI πρόσβασης υπηρεσίας REST. Το υπόλοιπο του κατάλληλου URI βασίζεται στα κομμάτια του URI που παρέχονται στους σχολιασμούς JAX-RS στην κλάση Java (/κινηματογράφος, /, και / {μήνα} / {ημερομηνία}). Τα τμήματα του URI που υποδηλώνονται με σγουρά τιράντες υποδεικνύουν ότι τα σύμβολα κράτησης θέσης θα εγχυθούν με τιμές από την εφαρμογή JAX-RS που βρίσκονται στο URI κλήσης. Για παράδειγμα, εάν το σχετικό κομμάτι του URI ήταν /7/4, αυτό θα έδειχνε, σε αυτήν την περίπτωση, ένα μήνα 7 (Ιούλιος επειδή δεν χρησιμοποιούσε το δείκτη μηδενικού μήκους Java στο URI) και μια ημέρα 4

Όταν η ανάπτυξη είναι επιτυχής, η κονσόλα διαχείρισης εμφανίζεται όπως φαίνεται στο επόμενο στιγμιότυπο οθόνης.

Με την εφαρμογή JAX-RS που έχει αναπτυχθεί, μπορώ τώρα να έχω πρόσβαση σε αυτήν από χιλιάδες διαφορετικούς πελάτες. Το JAX-RS δεν περιγράφει μια τυποποιημένη προσέγγιση για τους πελάτες, αλλά το Jersey και οι περισσότερες δημοφιλείς εφαρμογές JAX-RS παρέχουν τη δική τους προσέγγιση για την κατασκευή πελατών. Άλλοι πελάτες HTTP / REST είναι επίσης διαθέσιμοι όπως το RESTClient. Προς το παρόν, θα χρησιμοποιήσω απλώς ένα πρόγραμμα περιήγησης ιστού.

Τοποθέτηση του URI // localhost: 8080 / στο πρόγραμμα περιήγησής μου εμφανίζεται η κύρια σελίδα που δείχνει ότι το GlassFish εκτελείται:

Αν προσθέσω το περιβάλλον ιστού (υπόλοιπο) στο URI, βλέπω το δικό μου index.jsp σελίδα:

Για να αποκτήσω πρόσβαση στις εφαρμογές REST που λειτουργούν με JAX-RS, πρέπει να προσθέσω το πόροι τμήμα του URI όπως καθορίζεται στο web.xml αρχείο. Όταν το προσθέσω αυτό το συν /κινηματογράφος τμήμα (όπως ορίζεται στο @Μονοπάτι σχολιασμός), βλέπω την ακόλουθη σελίδα.

Το παραπάνω στιγμιότυπο οθόνης δείχνει ότι η πρόσβαση GET κλήθηκε με τη διαδρομή "/" και το getMovie κλήθηκε η μέθοδος. Σε αυτό το σημείο, μπορώ να προσθέσω ένα μήνα και ημερομηνία στο URI για να λάβω μια ταινία για τη συγκεκριμένη ημέρα. Τα επόμενα δύο στιγμιότυπα οθόνης το αποδεικνύουν αυτό για το Groundhog Day και για την ημέρα των Χριστουγέννων.

Όπως δείχνουν τα παραπάνω στιγμιότυπα οθόνης, οι μήνες και οι ημέρες που παρέχονται στα URI εγχέονται αυτόματα από τον πάροχο JAX-RS στις παραμέτρους της κατάλληλης μεθόδου. Τώρα είναι εύκολο!

συμπέρασμα

Η διαδικασία ανάπτυξης μιας διαδικτυακής υπηρεσίας JAX-RS χρησιμοποιώντας το Jersey και το GlassFish είναι σχετικά απλή. Το μόνο που χρειαζόμουν ήταν η πρόσβαση στα JAX-RS και Jersey JARs, η σωστή σχολιασμένη τάξη Java και η σύντομη web.xml αρχείο που επέτρεψε στο Jersey να χρησιμοποιηθεί ως servlet. Αυτή η ανάρτηση ιστολογίου προσπάθησε να δείξει τα βασικά βήματα που σχετίζονται με τη σύνταξη μιας απλής σχολιασμένης κατηγορίας JAX-RS, την ανάπτυξη της στο GlassFish και την αξιοποίηση της εφαρμογής του JAX-RS από τον Jersey.

Άλλοι πόροι

⇒ Οδηγός προγραμματιστή RESTful Web Services

⇒ RESTful Java, ορισμένοι σύνδεσμοι

⇒ JSR 311: Ένα API Java για RESTful Web Services;

⇒ Ανάπτυξη και δοκιμή μιας εφαρμογής του Τζέρσεϋ χωρίς NetBeans

⇒ Jersey 1.0: Ξεκινώντας

API JSR-311 API που βασίζεται σε Javadoc

Αυτή η ιστορία, "JAX-RS with Jersey: An Introduction" δημοσιεύθηκε αρχικά από την JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found