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

Πώς να ξεκινήσετε με Java από διακομιστή

Το Java από πλευράς διακομιστή (SSJ), που μερικές φορές ονομάζεται servlets ή applet από τον διακομιστή, είναι ένα ισχυρό υβρίδιο του Common Gateway Interface (CGI) και του προγραμματισμού API διακομιστή χαμηλότερου επιπέδου - όπως NSAPI από το Netscape και ISAPI από τη Microsoft.

Αυτό το άρθρο παρέχει μια εισαγωγή και αναλυτικές οδηγίες για την εφαρμογή Netscape της Java από διακομιστή, την οποία η Netscape καλεί μικροεφαρμογές από διακομιστή (SSA).

Τα SSA μπορούν να λειτουργήσουν σαν σενάριο CGI. Λαμβάνει παίρνω και Θέση ζητά και επιστρέφει μια ιστοσελίδα (συνήθως με τη μορφή HTML), αλλά το SSJ φορτώνεται δυναμικά στον διακομιστή όπως το NSAPI / ISAPI. Αυτό εξαλείφει τις καθυστερήσεις εκκίνησης που αναμένουμε από το CGI. Επιτρέπει επίσης στο SSJ να διατηρεί μέρος της κατάστασής του μεταξύ των εκτελέσεων, όπως η διατήρηση μιας ανοικτής σύνδεσης σε μια βάση δεδομένων.

Τα SSA εκτελούνται από μόνα τους κουτί άμμου, που παρέχει την ασφάλεια που αναμένει κανείς από την Java. Για παράδειγμα, μια εφαρμογή που καταρρέει δεν θα καταστρέψει ολόκληρο τον διακομιστή, όπως μπορεί να συμβεί με τον προγραμματισμό NSAPI / ISAPI. Αυτή η πρόσθετη ασφάλεια επιτρέπει επίσης τη μεταφόρτωση μικροεφαρμογών για εκτέλεση στον διακομιστή - όπως ακριβώς οι εφαρμογές Java από την πλευρά του πελάτη λαμβάνονται για εκτέλεση στον πελάτη

Ίσως η πιο σημαντική πτυχή των SSA είναι ότι, γραμμένα σε Java, είναι εγγενώς ανεξάρτητα από πλατφόρμα και αντικειμενοστραφή.

Ιστορία

Ένας αυξανόμενος αριθμός διακομιστών υποστηρίζει Java από διακομιστή, συμπεριλαμβανομένων των διακομιστών Netscape FastTrack 2.0 και Enterprise 2.0, Java Web Server JavaSoft (παλαιότερα ονομαζόταν Jeeves), Jigsaw του World Wide Web Consortium, T3Server του WebLogic, Oracle's Webserver και ExpressO Peak Technologies. Κάθε ένας από αυτούς τους διακομιστές χρησιμοποιεί ένα διαφορετικό API Java από διακομιστή, που απαιτεί από τους προγραμματιστές να γράφουν διαφορετικά προγράμματα για κάθε διακομιστή που θα χρησιμοποιούν.

Λεπτομέρειες Netscape: Προετοιμάστε τον διακομιστή σας

Προτού συντάξετε την πρώτη σας μικροεφαρμογή για διακομιστές του Netscape, πρέπει να προετοιμάσετε τον διακομιστή. Οι διακομιστές Enterprise και FastTrack είναι πανομοιότυποι στην υποστήριξη SSA τους.

Ξεκινήστε ενεργοποιώντας τον διερμηνέα Java του διακομιστή. Αυτό μπορεί να γίνει από το Διαχειριστή διακομιστή στην ενότητα "Προγράμματα -> Java." Κάντε κλικ στο κουμπί Ναι για να ενεργοποιήσετε τον διερμηνέα Java. Ο Διαχειριστής διακομιστή θα σας ζητήσει έναν "κατάλογο μικροεφαρμογών Java", που είναι το μέρος για να βάλετε τα αρχεία υποστήριξης SSA καθώς και τη θέση για όλα τα αρχεία κλάσης SSA. Παρέχει μια προεπιλεγμένη τοποθεσία. Στις μηχανές Unix, αυτό είναι / usr / ns-home / plugins / java / applets. Σε υπολογιστές με Windows, είναι C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets (Σημείωση: Σε αυτό το πεδίο εισαγωγής, το Netscape τείνει να αναμιγνύει και να ταιριάζει με τις οπίσθιες και κάθετες. Μην ανησυχείτε, το Netscape αντιμετωπίζει τους δύο τύπους κάθετων με τον ίδιο τρόπο.) Λάβετε τον προεπιλεγμένο κατάλογο μικροεφαρμογών εάν είναι δυνατόν. Εάν αποφασίσετε να προσαρμόσετε αντί να χρησιμοποιήσετε την προεπιλογή, βεβαιωθείτε ότι έχετε επιλέξει έναν κατάλογο κάπου κάτω από τη ρίζα του διακομιστή σας και ότι αντιγράφετε όλα τα αρχεία από την προεπιλεγμένη θέση στην προσαρμοσμένη τοποθεσία σας. Αποθηκεύστε και εφαρμόστε τις αλλαγές σας, φροντίζοντας να σταματήσετε τον διακομιστή και να τον ξεκινήσετε ξανά, έτσι ώστε οι αλλαγές να τεθούν σε ισχύ.

Ώρα να πειραματιστείτε!

Σε αυτό το σημείο θα πρέπει να μπορείτε να πειραματιστείτε με τις μικροεφαρμογές που παρέχονται από το Netscape. Στρέψτε το πρόγραμμα περιήγησής σας στο // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Θα πρέπει να δείτε τα δεδομένα "λήψης" να χειρίζονται και να επιστρέφονται σε HTML από τη μικροεφαρμογή φόρμας.

Εάν εμφανιστεί σφάλμα διακομιστή, ελέγξτε το αρχείο καταγραφής σφαλμάτων του διακομιστή σας (/ usr / ns-home / httpd-hostname / logs / σφάλματα ή C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ error). Εάν λέει ότι δεν μπορεί να ξεκινήσει τον διερμηνέα Java, μια πιθανή αιτία είναι ότι το CLASSPATH σας προκαλεί σύγχυση στο Netscape. Δοκιμάστε να ξεκινήσετε το διακομιστή σε περιβάλλον χωρίς CLASSPATH.

Μια άλλη μικροεφαρμογή που πρέπει να δοκιμάσετε είναι στο // servername / server-java / Connect; θα πρέπει να φορτώσει και να εμφανίσει //www.meer.net/barn/index.html. Η μικροεφαρμογή Connect δημιουργεί σύνδεση υποδοχής για τη λήψη της σελίδας, η οποία ενδέχεται να δημιουργήσει σφάλμα διακομιστή εάν ο διακομιστής σας βρίσκεται πίσω από τείχος προστασίας. Για το επόμενο βήμα, ας υποθέσουμε ότι ένα τείχος προστασίας μπλόκαρε την υποδοχή. Θα επεξεργαστούμε τον κωδικό Connect applet για πρόσβαση σε διαφορετική σελίδα σε διαφορετικό διακομιστή Web.

Το αρχείο Connect.java είναι διαθέσιμο στον "κατάλογο μικροεφαρμογών Java." (Βρίσκεται επίσης παρακάτω.) Εισάγει πρώτα το netscape.server.applet. *.

εισαγωγή netscape.server.applet. *; 

Αυτό το πακέτο περιέχει τις βασικές τάξεις για την ανάπτυξη μικροεφαρμογών από διακομιστή. Η πιο σημαντική κατηγορία σε αυτό το πακέτο είναι HttpApplet, το superclass για όλες τις μικροεφαρμογές διακομιστή. Όπως μπορείτε να δείτε στο Connect (παρακάτω), η μόνη μέθοδος που πρέπει να εφαρμόσει μια μικροεφαρμογή διακομιστή είναι η τρέξιμο μέθοδος. Αυτή η μέθοδος καλείται κάθε φορά που η μικροεφαρμογή λαμβάνει ένα "χτύπημα". ο τρέξιμο Η μέθοδος Connect ανοίγει μια υποδοχή στον "κεντρικό υπολογιστή" και παίρνει το "αίτημα" πριν ανακατευθύνει την έξοδο στον πελάτη. Θέλουμε να αλλάξουμε τη μεταβλητή "κεντρικός υπολογιστής", ώστε να αναφέρεται σε έναν υπολογιστή ορατό από τον διακομιστή μας στο Web. Θα θέλαμε επίσης να αλλάξουμε τη μεταβλητή "request", ώστε να αναφέρεται σε μια σελίδα στο νέο "host".

εισαγωγή netscape.server.applet. *; εισαγωγή java.io.PrintStream; εισαγωγή java.io.InputStream; εισαγωγή java.io.OutputStream; εισαγωγή java.io.DataInputStream; εισαγωγή java.net.Socket; Η κλάση Connect επεκτείνει το HttpApplet {public void run () ρίχνει την Εξαίρεση {String host = "www.meer.net"; // αλλάξτε αυτό το int port = 80; Αίτημα συμβολοσειράς = "GET /barn/index.html HTTP / 1.0 \ n"; // αυτό επίσης Socket s = νέο Socket (host, port); OutputStream os = s.getOutputStream (); PrintStream op = νέο PrintStream (os); op.println (αίτημα); Το InputStream είναι = sam (); DataInputStream di = νέο DataInputStream (είναι); Γραμμή συμβολοσειράς; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData στο" + host + "port" + port + ""); out.println (" request: "+ request +"
"); while ((line = di.readLine ())! = null) out.println (γραμμή);}}}

Αφού πραγματοποιήσετε τις αλλαγές "κεντρικός υπολογιστής" και "αίτημα", το επόμενο βήμα είναι να μεταγλωττίσετε ξανά το Connect.

Στα Windows, χρησιμοποιήστε τον τυπικό μεταγλωττιστή javac με το σετ classpath για να συμπεριλάβετε το serv2_0.zip. javac -classpath .. \ class \ serv2_0.zip Connect.java.

Στην ενότητα Unix, το Netscape παρέχει έναν μεταγλωττιστή Java (javac) στον κατάλογο πάνω από τον κατάλογο applet Java. Αυτό το javac είναι στην πραγματικότητα ένα σενάριο που καλεί java sun.tools.javac. Κύρια για να κάνετε την κατάρτιση. Σε ορισμένα συστήματα το sun.tools.javac. Κύρια Ο μεταγλωττιστής χρησιμοποιεί νέες μεθόδους 1.1 JDK όπως java.lang.Character.isJavaLetterOrDigit (), το οποίο μπορεί να προκαλέσει αρκετά πρόβλημα για προγραμματιστές χωρίς το 1.1 JDK. Μια τέλεια εναλλακτική λύση είναι να χρησιμοποιήσετε τον τυπικό μεταγλωττιστή javac που χρησιμοποιούσατε πάντα, javac -classpath ../classes/serv2_0.zip Connect.java. Αν θέλετε να χρησιμοποιήσετε το παρεχόμενο σενάριο javac, απλώς αντικαταστήστε το "javac" με "../javac."

Ενδέχεται να δείτε ένα σφάλμα κατά τη διάρκεια αυτής της συλλογής που λέει:

Connect.java :: Το πακέτο netscape.server.applet δεν βρέθηκε στην εισαγωγή. εισαγωγή netscape.server.applet. *; ^ 1 σφάλμα 

Αυτό το σφάλμα δεν χρειάζεται να ανησυχείτε. Το αρχείο τάξης δημιουργείται κανονικά και θα λειτουργεί καλά. Μπορείτε να αποφύγετε αυτό το σφάλμα εάν καταργήσετε χαρακτήρες μπαλαντέρ στις δηλώσεις εισαγωγής.

Στην ενότητα Unix, το Netscape παρέχει ένα makefile στον κατάλογο applet Java για τον χειρισμό της συλλογής μικροεφαρμογών. Δυστυχώς, το makefile χρησιμοποιεί το wildcard '%', το οποίο είναι μια επέκταση mk / nmake και δεν είναι πάντα διαθέσιμο. Ο κωδικός προβλήματος φαίνεται παρακάτω.

% .class:% .java ../javac -classpath ../classes/serv2_0.zip $ *. java 

Μια εναλλακτική λύση είναι να χρησιμοποιήσετε έναν κανόνα .suffixes. Επεξεργαστείτε την πρώτη γραμμή του makefile να είναι:

.SUFFIXES: .java .class και αντικαταστήστε τις γραμμές στόχου% .class με .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Μπορεί να παρατηρήσετε ότι αφαίρεσα το ../ έτσι ώστε το makefile να επικαλεστεί τον τυπικό μεταγλωττιστή javac. Για να δοκιμάσετε αυτό το νέο makefile, αποθηκεύστε ξανά το αρχείο Connect.java και δοκιμάστε ένα "make".

Εάν επρόκειτο να φορτώσετε ξανά τη σελίδα // servername / server-java / Connect τώρα, θα εξακολουθούσατε να βλέπετε τη σελίδα "Barn". Αυτό συμβαίνει επειδή οι κλάσεις Java φορτώνονται στο διακομιστή κατά την ώρα έναρξης μέσω μιας συνάρτησης init στο αρχείο obj.conf. Για να φορτώσετε τις νέες αλλαγές, πρέπει να διακόψετε τον διακομιστή και μετά να τον ξεκινήσετε ξανά. Σε ορισμένα συστήματα πρέπει να χρησιμοποιήσετε τη Διαχείριση διακομιστή για να κάνετε τη διακοπή και την εκκίνηση. Η επανεκκίνηση της γραμμής εντολών οδηγεί μερικές φορές σε "Σφάλμα διακομιστή" για επακόλουθα αιτήματα μικροεφαρμογών. Μόλις σταματήσετε και ξεκινήσετε τον διακομιστή, δοκιμάστε ξανά το Connect applet. Το Netscape θα έπρεπε να έχει φορτώσει τον νέο κωδικό Connect για να εμφανίσει τη σελίδα που επιλέξατε.

Ας πάρουμε σοβαρά το API

Συγχαρητήρια! Μόλις συντάξατε και δοκιμάσατε τον πρώτο σας κώδικα Java από την πλευρά του διακομιστή. Τώρα για να δώσετε μερικές από τις διαθέσιμες μεθόδους.

Με τις ακόλουθες μεθόδους μπορείτε να κάνετε το μεγαλύτερο μέρος της εργασίας σας:

PrintStream getOutputStream () ρίχνει το IOException. 

επιστρέφει a PrintStream, την οποία μπορείτε να χρησιμοποιήσετε για να εκτυπώσετε την απάντησή σας στον πελάτη. Αντικαθιστά System.out.

Το Hashtable getFormData () ρίχνει το IOException. 

επιστρέφει ένα Hashtable που αποθηκεύει τα ζεύγη τιμών-τιμών του αιτήματος HTTP. Οι συμβολοσειρές τιμών αποκωδικοποιούνται από τη μορφή κωδικοποίησης URI. Ρίχνει ένα IOException εάν δεν υπάρχουν δεδομένα φόρμας.

Το String getFormField (String fieldName) ρίχνει το IOException; 

Μπορείς να χρησιμοποιήσεις getFormField για ανάκτηση μόνο ενός πεδίου. Επίσης ρίχνει ένα IOException εάν δεν υπάρχουν δεδομένα φόρμας.

boolean returnNormalResponse (String contentType) ρίχνει το IOException; 

ξεκινά μια απόκριση HTTP με τον τύπο περιεχομένου που ορίζετε με την παράμετρο. Επιστρέφει αληθές εάν αυτό ήταν ένα αίτημα "λήψης" ή "ανάρτησης" και ψευδές εάν ήταν αίτημα "επικεφαλής".

public boolean returnErrorResponse (String contentType, int status, String reason) ρίχνει το IOException δημόσιο boolean returnErrorResponse (String contentType, int status) ρίχνει το IOException 

ξεκινά μια απόκριση HTTP για να αναφέρει ένα σφάλμα. Παίρνει έναν τύπο περιεχομένου, μια κατάσταση (όπως HttpApplet.BAD_REQUEST, που αντιπροσωπεύει τον τυπικό κωδικό σφάλματος 400), και μια προαιρετική συμβολοσειρά που δίνει τον λόγο του σφάλματος.

Υπάρχουν δεκάδες άλλες μέθοδοι που μπορείτε να χρησιμοποιήσετε για την ανάπτυξη των μικροεφαρμογών από τον διακομιστή σας. Το Netscape εγκαθιστά έναν οδηγό API με τους διακομιστές του. Μπορείτε να βρείτε τον οδηγό στη διεύθυνση /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm στο Unix ή στο C: \ Program Files \ Netscape \ Server \ bin \ httpd \ admin \ html \ manual \ pg \ javapi.htm στα Windows.

Γειά σου Κόσμε!

Τώρα ας χρησιμοποιήσουμε ό, τι μάθαμε για να γράψουμε το (το μαντέψατε!) Γεια σου World διακομιστή applet. Η ακόλουθη μικροεφαρμογή λέει γεια Κόσμος εκτός αν στόχος δίνεται πεδίο - σε αυτήν την περίπτωση, αντίθετα, λέει γεια στον στόχο.

εισαγωγή netscape.server.applet.HttpApplet; εισαγωγή java.io.IOException; εισαγωγή java.io.PrintStream; Η τάξη Hello επεκτείνει το HttpApplet {/ * Από προεπιλογή, χαιρετίζουμε το "World" * / String helloTarget = "World"; / * run () καλείται για να χειριστεί το αίτημα * / public void run () throws Exception {/ * getOutputStream () μας επιτρέπει να μιλήσουμε με τον πελάτη * / PrintStream out = getOutputStream (); / * Χρησιμοποιήστε το getFormField () για να μάθετε αν θέλουμε να σας καλωσορίσουμε * σε κάποιον άλλο από το "World". * / String formTarget = null; δοκιμάστε το {formTarget = getFormField ("target"); αν (formTarget! = null) {helloTarget = formTarget; }} catch (IOException e) {/ * Θα αγνοήσουμε τις εξαιρέσεις που προκαλούνται από μια "ελλειπτική συμβολοσειρά ερωτήματος" * / if (! e.getMessage (). beginWith ("λείπει το string ερωτήματος")) {handleException (e, out) ; }} / * Πείτε το γεια σας * / if (returnNormalResponse ("text / html")) {δοκιμάστε {out.println ("Γεια," + helloTarget + "!"); } catch (Εξαίρεση e) {handleException (e, out); }}} private void handleException (Εξαίρεση e, PrintStream out) {δοκιμάστε {returnErrorResponse ("text / html", SERVER_ERROR, "Exception throw"); } catch (IOException πρόσβαση) {} // προσπαθήστε να εκτυπώσετε την αρχική εξαίρεση out.print ("& lth1>"); out.print (ε) · out.print ("\ n "); out.print (" & ltpre> "); e.printStackTrace (out); // εναλλακτική PrintStream πρέπει να καθοριστεί out.print ("
"); ΕΠΙΣΤΡΟΦΗ; } }

Αυτή η βοηθητική εφαρμογή δευτερεύουσας κλάσης από το netscape.server.applet.HttpApplet και παρακάμπτει το τρέξιμο() μέθοδος όπως όλες οι μικροεφαρμογές διακομιστή στο Netscape. Παίρνει γρήγορα τη ροή εξόδου του με μια κλήση προς getOutputStream, το οποίο θα χρησιμοποιήσει για να εκτυπώσει το "Γεια" (ή για να εκτυπώσει τον λόγο αποτυχίας). Καλεί getFormField για να ελέγξετε εάν υπάρχει εναλλακτικός στόχος για χρήση και, στη συνέχεια, επιστρέφει μια κανονική απόκριση "text / html" και, τέλος, κάνει το πραγματικό έργο της εκτύπωσης "Γεια σας". Παρατηρήστε ότι ελέγχει την τιμή επιστροφής από το returnNormalResponse () κλήση και δεν κάνει τίποτα αν επιστρέψει ψευδές Εάν δεν το κάνετε αυτό, θα επιστρέψετε δεδομένα ακόμη και για κεφάλι αιτήσεων.

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