Ελληνικό Java CGI HOWTO <author>David H. Silber <tt><htmlurl url="mailto:javacgi-document@orbits.com" name="javacgi-document@orbits.com"></tt> <date>v0.5, 1 Δεκεμβρίου 1998 <abstract> Αυτό το έγγραφο HOWTO εξηγεί πώς να ρυθμίσετε το διακομιστή σας ώστε να επιτρέπει προγράμματα CGI γραμμένα σε Java και πώς να χρησιμοποιήσετε τη Java στο να γράφετε προγράμματα CGI. Αν και αυτά τα HOWTO έγγραφα στοχεύουν σε χρήση με το λειτουργικό σύστημα Linux, αυτό το συγκεκριμένο δεν είναι εξαρτώμενο από τη συγκεκριμένη έκδοση του Unix που χρησιμοποιείτε. </abstract> <toc> <sect>Εισαγωγή <p> Εξαιτίας του τρόπου που η Java είναι σχεδιασμένη, ο προγραμματιστής δεν έχει εύκολη πρόσβαση στις μεταβλητές περιβάλλοντος του συστήματος. Εξαιτίας του τρόπου που είναι ρυθμισμένο το Java Development Kit (JDK), είναι αναγκαίο να χρησιμοποιείτε πολλαπλά σύμβολα για να καλείτε ένα πρόγραμμα, το οποίο δεν κολλάει και πολύ καλά με τον τυπικό τρόπο λειτουργιών με φόρμες/CGI της HTML. Υπάρχουν τρόποι αντιμετώπισης αυτών των περιορισμών, και έχω εφαρμόσει έναν από αυτούς. Διαβάστε περαιτέρω για λεπτομέρειες. Από τότε που έγραψα την προηγούμενη παράγραφο το 1996, έχουν γίνει πολλές αλλαγές στην τεχνολογία Java. Είναι πιθανόν πως μια καλύτερη λύση για να τρέχετε Java προγράμματα στην πλευρά-του-διακομιστή, είναι τώρα διαθέσιμη -- ίσως να πρέπει να ρίξετε μια ματιά στα servlets. <sect1>Προγενέστερη Γνώση <p> Υποθέτω ότι έχετε μία γενική γνώση της HTML και των εννοιών CGI και τουλάχιστον μια ελάχιστη γνώση του διακομιστή HTTP σας. Θα πρέπει επίσης να γνωρίζετε πώς να προγραμματίσετε σε Java, αλλιώς πολλά από αυτά δε θα βγάζουν νόημα. <sect1>Αυτό το Έγγραφο <p> Η τελευταία έκδοση αυτού του εγγράφου μπορεί να διαβαστεί στην <htmlurl url="http://www.orbits.com/software/Java_CGI.html" name="http://www.orbits.com/software/Java_CGI.html">. <sect1>Το πακέτο <p> Η τελευταία έκδοση του πακέτου που περιγράφεται εδώ μπορεί να προσπελαστεί μέσω ανώνυμο FTP στο <htmlurl url="ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz" name="ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz">. Η διανομή του πακέτου περιέχει πηγαίο κώδικα SGML για αυτό το έγγραφο. Το πακέτο διανέμεται κάτω από τους όρους της GNU Βιβλιοθήκης Γενικής Άδειας του Κοινού (Library General Public License). Αυτό το έγγραφο μπορεί να διανεμηθεί κάτω από τους όρους της σημείωσης πνευματικών δικαιωμάτων των Linux HOWTOs. Αν χρησιμοποιείτε αυτό το λογισμικό, παρακαλώ κάντε κάποια αναφορά στην <htmlurl url="http://www.orbits.com/software/Java_CGI.html" name="http://www.orbits.com/software/Java_CGI.html">, έτσι ώστε και άλλοι να μπορούν να βρίσκουν τις κλάσεις Java CGI. Δεν έχω άλλο χρόνο για να συντηρώ και να υποστηρίζω αυτό το πακέτο, οπότε αυτή πιθανόν να είναι η τελευταία του κυκλοφορία. Αν κανείς εκεί έξω είναι αρκετά ερωτευμένος με αυτό το λογισμικό ώστε να εύχεται να αναλάβει τη συντήρησή του, παρακαλώ επικοινωνήστε μαζί μου στην <tt><htmlurl url="mailto:javacgi-document@orbits.com" name="javacgi-document@orbits.com"></tt>. <sect1>Η Λίστα Ταχυδρομείου <label id="mailing-list"> <p> Έχω δημιουργήσει μία λίστα majordomo ώστε να επιτρέπω ανθρώπους να βοηθούν ο ένας τον άλλον, να λύνουν αμοιβαία τα προβλήματά τους εγκαθιστώντας και χρησιμοποιώντας αυτό το λογισμικό. Στείλτε ένα μήνυμα στην <tt><htmlurl url="mailto:javacgi-request@orbits.com" name="javacgi-request@orbits.com"></tt>, περιλαμβάνοντας τη λέξη <em>subscribe</em>. <sect>Ρυθμίζοντας το Διακομιστή σας να τρέχει προγράμματα Java CGI (με επεξηγήσεις) <label id="install-long"> <p> Αυτό το τμήμα θα σας καθοδηγήσει κατά την εγκατάσταση του πακέτου μου <em>Java CGI</em> με άφθονες επεξηγήσεις έτσι ώστε να γνωρίζετε ποια θα είναι τα αποτελέσματα των ενεργειών σας. Αν απλώς θέλετε να εγκαταστήσετε τα προγράμματα και δεν ενδιαφέρεστε καθόλου για τα γιατί και για ποιους λόγους, πηγαίνετε στην <ref id="install-short" name="Ρυθμίζοντας τον Διακομιστή σας να τρέχει προγράμματα Java CGI (ο σύντομος τρόπος)">. <sect1>Απαιτήσεις Συστήματος <p> Αυτό το λογισμικό θα πρέπει να δουλεύει σε κάθε unix-like διακομιστή ιστού που έχει εγκατεστημένο το Java Development Kit. Εγώ το χρησιμοποιώ σε ένα σύστημα <em>Debian Linux</em> που τρέχει τον <em>apache</em> σαν δαίμονα HTTP. Αν διαπιστώσετε ότι δεν τρέχει στον δικό σας διακομιστή, παρακαλώ επικοινωνήστε με τη λίστα ταχυδρομείου. Δείτε τη <ref id="mailing-list" name="The Mailing List"> για λεπτομέρειες. Δυστυχώς, ο Java run-time διερμηνευτής φαίνεται να είναι κάτι σαν φαταούλας μνήμης -- ίσως να θέλετε να ρίξετε λίγα περισσότερα megabytes από RAM στον εξυπηρετητή σας αν θα χρησιμοποιείτε πολύ προγράμματα Java CGI. <sect1>Επιπρόσθετο Λογισμικό Java CGI <p> Το λογισμικό που έγραψα για να βοηθήσει σε αυτό λέγεται <em>Java CGI</em>. Μπορείτε να το πάρετε από το <htmlurl url="ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz" name="ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz">. (Ο αριθμός έκδοσης μπορεί να έχει αλλάξει). <sect1>Ξεπακετάροντας τον πηγαίο κώδικα <p> Βρείτε έναν κατάλογο που σας βολεύει στον οποίο θα ξεπακετάρετε αυτό το πακέτο. (Αν δεν έχετε ακόμη ένα σταθερό τόπο να τοποθετείτε πακέτα, προτείνω να χρησιμοποιήσετε τον <tt>/usr/local/src</tt>.) Ξεπακετάρετε τη διανομή με αυτή την εντολή: <verb> gzip -dc java_cgi-0.5.tgz | tar -xvf - </verb> Αυτή θα δημιουργήσει έναν κατάλογο με όνομα <tt>java_cgi-0.5</tt>. Εκεί μέσα θα βρείτε τα αρχεία που αναφέρονται στο υπόλοιπο αυτού του εγγράφου. (Αν ο αριθμός έκδοσης έχει αλλάξει, χρησιμοποιήστε τις οδηγίες που βρίσκονται στη διανομή που κατεβάσατε). <sect1>Αποφασίστε για τις πολιτικές τοπικών διαδρομών σας <label id="make-programs"> <p> Πρέπει να αποφασίσετε πού θέλετε να ζουν τα Java CGI προγράμματά σας. Γενικά, θα θέλετε να τα τοποθετήσετε σε έναν κατάλογο παράλληλα με τον <tt>cgi-bin</tt> κατάλογό σας. Ο δικός μου διακομιστής <em>apache</em> ήταν ρυθμισμένος να χρησιμοποιήσει τον <tt>/var/www/cgi-bin</tt> σαν τον <tt>cgi-bin</tt> κατάλογο, οπότε χρησιμοποιώ τον <tt>/var/www/javacgi</tt> σαν τον κατάλογο που τοποθετώ μέσα τα Java CGI προγράμματα. Πιθανώς να μη θέλετε να τοποθετήσετε τα Java CGI προγράμματά σας μέσα σε έναν από τους υπάρχοντες καταλόγους <tt>CLASSPATH</tt>. Επεξεργαστείτε το Makefile ώστε να αντικατοπτρίζεται η ρύθμιση του συστήματός σας. Επιβεβαιώστε ότι έχετε πρόσβαση ως χρήστης root και τρέξτε την εντολή <tt>make install</tt>. Αυτή θα μεταγλωττίσει τα Java προγράμματα, θα τροποποιήσει το <tt>java.cgi</tt> σενάριο για να ταιριάζει με το σύστημά σας και θα εγκαταστήσει τα προγράμματα στα απαραίτητα μέρη. Αν θέλετε την HTML έκδοση αυτής της τεκμηρίωσης και ένα HTML test έγγραφο επιπλέον, τρέξτε την εντολή <tt>make all</tt> αντί αυτής. <sect1>Ελέγχοντας την εγκατάστασή σας <label id="install-test"> <p> Εγκατεστημένα από τη διανομή είναι HTML έγγραφα που ονομάζονται <tt>javacgitest.html</tt>, <tt>javaemailtest.html</tt> και <tt>javahtmltest.html</tt>. Εάν τα εγκαταστήσατε όλα - <tt>all</tt> στο προηγούμενο μέρος, θα είναι στον κατάλογο που καθορίσατε για WEBDIR στο <tt>Makefile</tt>. Αν δεν το κάνατε, μπορείτε να τρέξετε την εντολή <tt>make test</tt> για να τα χτίσετε από τα <tt>javacgitest.html-dist</tt>, <tt>javaemailtest.html-dist</tt> και <tt>javahtmltest.html-dist</tt>. Όταν είστε σίγουροι πως η εγκατάστασή σας δουλεύει σωστά, ίσως να επιθυμείτε να διαγράψετε τα <tt>CGI_Test.class</tt>, <tt>Email_Test.class</tt> και <tt>HTML_Test.class</tt> από τον JAVACGI κατάλογό σας και τα <tt>javacgitest.html</tt>, <tt>javaemailtest.html</tt> και <tt>javahtmltest.html</tt> από τον WEBDIR κατάλογό σας αφού δείχνουν στο χρήστη πληροφορίες που είναι κανονικά μόνο διαθέσιμες στον διακομιστή. <sect>Ρυθμίζοντας τον Διακομιστή σας να τρέχει προγράμματα Java CGI (ο σύντομος τρόπος) <label id="install-short"> <p> <itemize> <item> Πάρτε το πακέτο <em>Java CGI</em> από το <htmlurl url="ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz" name="ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz">. (Ο αριθμός έκδοσης μπορεί να έχει αλλάξει). </item> <item> Ξεπακετάρετε τη διανομή με αυτή την εντολή: <verb> gzip -dc java_cgi-0.5.tgz | tar -xvf - </verb> (Αν ο αριθμός έκδοσης έχει αλλάξει, χρησιμοποιήστε τις οδηγίες μέσα από εκείνη τη διανομή από αυτό το σημείο και ύστερα). </item> <item> Επεξεργαστείτε το <tt>Makefile</tt> που θα βρείτε στο μόλις δημιουργημένο κατάλογο <tt>java_cgi-0.5</tt> ώστε να είναι κατάλληλο για το σύστημά σας. </item> <item> Σαν root, τρέξτε την εντολή <tt>make install</tt>. Αυτή θα μεταγλωττίσει τα Java προγράμματα, θα εφαρμόσει τις συγκεκριμένες πληροφορίες στο σύστημά σας και θα εγκαταστήσει τα διάφορα αρχεία. Αν θέλετε την HTML έκδοση αυτής της τεκμηρίωσης και ένα HTML test έγγραφο, τρέξτε την εντολή <tt>make all</tt> αντί αυτής. </item> <item> Θα πρέπει να είστε έτοιμοι να ξεκινήσετε. </item> </itemize> <sect>Εκτελώντας ένα πρόγραμμα Java CGI <p> <sect1>Εμπόδια στο τρέξιμο προγραμμάτων Java κάτω από το μοντέλο CGI <p> Υπάρχουν δύο κύρια προβλήματα στο τρέξιμο ενός προγράμματος Java από έναν διακομιστή ιστού: <sect2>Δεν μπορείτε να τρέξετε προγράμματα Java όπως τα κανονικά εκτελέσιμα. <p> Χρειάζεται να τρέξετε τον διερμηνέα Java run-time και να παρέχετε την αρχική κλάση (πρόγραμμα για να τρέξετε) στη γραμμή εντολών. Με μία φόρμα HTML, δεν υπάρχει καμία φροντίδα για να στέλνετε μία γραμμή εντολών στον διακομιστή ιστού. <sect2>Η Java δεν έχει γενική πρόσβαση στο περιβάλλον. <p> Κάθε μεταβλητή περιβάλλοντος που θα χρειαστεί από το πρόγραμμα Java πρέπει να περαστεί με σαφήνεια. Δεν υπάρχει καμία μέθοδος παρόμοια με τη λειτουργία της <bf>C</bf>, <tt>getenv()</tt> . <sect1>Ξεπερνώντας προβλήματα στο τρέξιμο προγραμμάτων Java CGI <p> Για να αντιμετωπίσετε αυτά τα εμπόδια, έγραψα ένα CGI πρόγραμμα κελύφους που παρέχει τις πληροφορίες που χρειάζονται από τον Java διερμηνέα. <sect2>Το java.cgi script <p> Αυτό το σενάριο κελύφους διαχειρίζεται την αλληλεπίδραση μεταξύ του HTTP δαίμονα και του προγράμματος Java CGI που επιθυμείτε να χρησιμοποιήσετε. Εξάγει το όνομα του προγράμματος που θέλετε να τρέξετε από τα δεδομένα που παρέχονται από το διακομιστή. Συλλέγει όλα τα δεδομένα περιβάλλοντος σε ένα προσωρινό αρχείο. Ύστερα, τρέχει τον Java run-time διερμηνέα με το όνομα του αρχείου από τις πληροφορίες περιβάλλοντος και το όνομα του προγράμματος που προστέθηκε στη γραμμή-εντολών. Το <tt>java.cgi</tt> script διαμορφώθηκε και εγκαταστάθηκε στο <ref id="make-programs" name="Αποφασίστε για τις πολιτικές τοπικών διαδρομών σας">. <sect2>Καλώντας το java.cgi από μία φόρμα HTML <p> Οι φόρμες μου που χρησιμοποιούν προγράμματα Java CGI καθορίζουν μία ενέργεια φόρμας όπως ακολούθως: <verb> <form action="/cgi-bin/java.cgi/CGI_Test" method="POST"> </verb> Όπου <tt>/cgi-bin/</tt> είναι ο τοπικός σας CGI binary κατάλογος, <tt>java.cgi</tt> είναι το Java front-end που μας επιτρέπει να τρέχουμε προγράμματα Java στον ιστό και το <tt>CGI_Test</tt> είναι ένα παράδειγμα ονόματος προγράμματος Java για να τρέξετε. <sect>Χρησιμοποιώντας τις Java CGI Κλάσεις <p> Υπάρχουν προς το παρόν τρεις κύριες κλάσεις που υποστηρίζονται -- <ref id="cgi-class" name=CGI>, <ref id="email-class" name=Email> και <ref id="html-class" name=HTML>. Σκέφτομαι να προσθέσω κλάσεις για να αντιμετωπίσω τα MIME-διαμορφωμένα εισαγόμενα (input) και εξαγόμενα (output) -- MIMEin & MIMEout, αντίστοιχα. <p> Υπάρχουν επίσης μερικές support και test κλάσεις. <ref id="cgi-test-class" name="CGI_Test">, <ref id="email-test-class" name="Email_Test"> και <ref id="email-test-class" name="HTML_Test"> σκοπεύουν να χρησιμοποιηθούν για να ελέγξουν την εγκατάστασή σας. Μπορούν επίσης να χρησιμοποιηθούν σαν ένα σημείο-εκκίνησης για τα δικά σας προγράμματα Java που χρησιμοποιούν αυτή τη βιβλιοθήκη κλάσεων. Η <ref id="text-class" name=Text> κλάση είναι η υπερκλάση και για τις δύο κλάσεις, την <tt>Email</tt> και την <tt>HTML</tt>. <sect1>CGI<label id="cgi-class"> <p> <sect2>Σύνταξη κλάσης <p> <tt>public class CGI</tt> <sect2>Περιγραφή κλάσης <p> Η CGI κλάση κρατάει τις ``CGI Πληροφορίες'' -- Μεταβλητές περιβάλλοντος από τον διακομιστή ιστού και το όνομα/τιμή που στέλνονται από μία φόρμα όταν η <bf>submit</bf> ενέργεια είναι επιλεγμένη. Όλες οι πληροφορίες αποθηκεύονται σε ένα <tt>Properties</tt> αντικείμενο κλάσης. Αυτή η κλάση είναι στο πακέτο ``Orbits.net''. <sect2>Περίληψη μελών <p> CGI() // Κατασκευαστής. <p> getNames() // Παίρνει τη λίστα ονομάτων. <p> getValue() // Παίρνει την τιμή φόρμας κατά προσδιορισμένο όνομα. <sect2>Δείτε επίσης <p> <tt>CGI_Test</tt>. <sect2>CGI() <p> <descrip> <tag/Purpose/ Κατασκευάζει ένα αντικείμενο που περιέχει τα διαθέσιμα CGI δεδομένα. <tag/Syntax/ <tt>public CGI()</tt> <tag/Description/ Όταν κατασκευάζεται ένα αντικείμενο CGI, όλες οι διαθέσιμες CGI πληροφορίες αναρροφούνται σε αποθήκη τοπικά στο νέο αντικείμενο. </descrip> <sect2>getNames() <p> <descrip> <tag/Purpose/ Κάνει λίστα των ονομάτων που είναι ορισμένες για να έχουν αντίστοιχες τιμές. <tag/Syntax/ <tt>public Enumeration getKeys ()</tt> <tag/Description/ Παρέχει την πλήρη λίστα των ονομάτων για τα οποία αντίστοιχες τιμές είναι ορισμένες. <tag/Returns/ Μία <tt>Enumeration</tt> όλων των ορισμένων ονομάτων. </descrip> <sect2>getValue() <p> <descrip> <tag/Purpose/ Επανακτά την <bf>value</bf> συσχετισμένη με το <bf>name</bf> που έχει οριστεί. <tag/Syntax/ <tt>public String getValue ( String name )</tt> <tag/Description/ Αυτή η μέθοδος παρέχει τη αντιστοιχία μεταξύ των <tt>names</tt> και <tt>values</tt> που στέλνονται από μία HTML φόρμα. <tag>Παράμετρος <descrip> <tag/name/ Το κλειδί κατά το οποίο οι τιμές επιλέγονται. </descrip> <tag/Returns/ Ένα <tt>String</tt> που περιλαμβάνει την τιμή. </descrip> <sect1>CGI_Test<label id="cgi-test-class"> <p> Αυτή η κλάση παρέχει ένα παράδειγμα του πώς να χρησιμοποιείτε την κλάση <tt>CGI</tt> και ένα πρόγραμμα ελέγχου που μπορεί να χρησιμοποιηθεί για να επιβεβαιώσει ότι το πακέτο <em>Java CGI</em> λειτουργεί σωστά. <sect2>Περίληψη μελών <p> main() // Πρόγραμμα main(). <sect2>Δείτε επίσης <p> <tt>CGI</tt>. <sect2>main() <p> <descrip> <tag/Purpose/ Παρέχει μία <tt>main()</tt> μέθοδο. <tag/Syntax/ <tt>public static void main( String argv[] )</tt> <tag/Description/ Αυτό είναι το σημείο καταχώρησης για ένα πρόγραμμα CGI που δεν κάνει τίποτα άλλο από το να αναφέρει μία λίστα με όλα τα διαθέσιμα όνομα/τιμή ζευγάρια και τις τρέχουσες τιμές τους. <tag>Παράμετρος <descrip> <tag/argv[]/ Επιχειρήματα περασμένα στο πρόγραμμα από το <tt>java.cgi</tt> script. Προς το παρόν αχρησιμοποίητη. </descrip> </descrip> <sect1>Email<label id="email-class"> <p> <sect2>Σύνταξη Κλάσης <p> <tt>public class Email extends Text</tt> <sect2>Περιγραφή κλάσης <p> Μηνύματα σχηματίζονται με την <tt>Text</tt> κλάση <tt>add*()</tt> μεθόδους και τις e-mail-συγκεκριμένες μεθόδους που προστίθενται από αυτήν την κλάση. Όταν ολοκληρωθεί, το μήνυμα στέλνεται στον προορισμό του. Αυτή η κλάση είναι στο πακέτο ``Orbits.net''. <sect2>Περίληψη μελών <p> <p> Email() // Κατασκευαστής. <p> send() // Στέλνει το e-mail μήνυμα. <p> sendTo() // Προσθέτει έναν προορισμό για το μήνυμα. <p> subject() // Ρυθμίζει το Θέμα: για το μήνυμα. <sect2>Δείτε επίσης <p> <tt>Email_Test, Text</tt>. <sect2>Email() <p> <descrip> <tag/Purpose/ Κατασκευάζει ένα αντικείμενο το οποίο θα περιέχει ένα email μήνυμα. <tag/Syntax/ <tt>public Email()</tt> <tag/Description/ Ρυθμίζει ένα κενό μήνυμα για να ολοκληρωθεί από τις Email μεθόδους. <tag/See Also/ <tt>Text</tt>. </descrip> <sect2>send() <p> <descrip> <tag/Purpose/ Στέλνει το e-mail μήνυμα. <tag/Syntax/ <tt>public void send ()</tt> <tag/Description/ Αυτή διαμορφώνει και στέλνει το μήνυμα. Αν καμία διεύθυνση προορισμού δεν έχει ρυθμιστεί, δε λαμβάνεται καμία ενέργεια. </descrip> <sect2>sendTo() <p> <descrip> <tag/Purpose/ Προσθέτει έναν προορισμό για αυτό το μήνυμα. <tag/Syntax/ <tt>public String sendTo ( String address )</tt> <tag/Description/ Προσθέτει την <tt>address</tt> στη λίστα προορισμών για αυτήν την μέθοδο. Δεν υπάρχει κανένα όριο ρύθμισης στον αριθμό προορισμών που ένα e-mail μήνυμα μπορεί να έχει. Είμαι σίγουρος πως αν σχηματίσετε τη λίστα αρκετά μεγάλη, μπορείτε να υπερβεί τε το μέγεθος της λίστας παραμέτρων που ο <em>Mail Transport Agent</em> μπορεί να αποδεχθεί ή να καταναλώσετε τη μνήμη σας. <tag>Parameter/ <descrip> <tag/address/ Ένας προορισμός για να στείλετε αυτό το μήνυμα. </descrip> </descrip> <sect2>subject() <p> <descrip> <tag/Purpose/ Στέλνει το θέμα για αυτό το μήνυμα. <tag/Syntax/ <tt>public void subject ( String subject )</tt> <tag/Description/ Αυτή η μέθοδος ρυθμίζει το κείμενο για την γραμμή <tt>Subject:</tt> του e-mail. Αν κληθεί περισσότερες από μία φορές, το τελευταίο ρυθμισμένο θέμα είναι αυτό που χρησιμοποιείται. <tag/Parameter/ <descrip> <tag/subject/ Το κείμενο της <tt>Subject:</tt> γραμμής αυτού του μηνύματος. </descrip> </descrip> <sect1>Email_Test<label id="email-test-class"> <p> Αυτή η κλάση παρέχει ένα παράδειγμα του πώς να χρησιμοποιείτε την <tt>Email</tt> κλάση και ένα test πρόγραμμα που μπορεί να χρησιμοποιηθεί για να επιβεβαιώσει ότι το <em>Java CGI</em> πακέτο λειτουργεί σωστά. <sect2>Περίληψη μελών <p> main() // Πρόγραμμα main(). <sect2>Δείτε επίσης <p> <tt>Email</tt>. <sect2>main() <p> <descrip> <tag/Purpose/ Παρέχει μία <tt>main()</tt> μέθοδο. <tag/Syntax/ <tt>public static void main( String argv[] )</tt> <tag/Description/ Αυτό είναι το σημείο καταχώρησης για ένα πρόγραμμα CGI που αναφέρει μία λίστα με όλα τα διαθέσιμα όνομα/τιμή ζευγάρια και τις τρέχουσες τιμές τους. Επίσης, θα στείλει αυτή τη λίστα στην καθορισμένη διεύθυνση στην <tt>Email</tt> μεταβλητή. <tag>Παράμετρος <descrip> <tag/argv[]/ Επιχειρήματα περνιούνται στο πρόγραμμα από το <tt>java.cgi</tt> σενάριο. Προς το παρόν αχρησιμοποίητα. </descrip> </descrip> <sect1>HTML<label id="html-class"> <p> <sect2>Σύνταξη κλάσης <p> <tt>public class HTML extends Text</tt> <sect2>Περιγραφή κλάσης <p> Μηνύματα σχηματίζονται με την <tt>Text</tt> κλάση <tt>add*()</tt> μεθόδους και τις HTML-συγκεκριμένες μεθόδους που προστίθενται από αυτήν την κλάση. Όταν ολοκληρωθεί, το μήνυμα στέλνεται στον προορισμό του. Προς το παρόν, δεν υπάρχει έλεγχος σφαλμάτων για να επιβεβαιώσει ότι οι μέθοδοι δημιουργίας-λίστας χρησιμοποιούνται σε μία σωστή σειρά, οπότε ο προγραμματιστής πρέπει να παίρνει μέτρα για να μην παραβιάσει την HTML σύνταξη. Αυτή η κλάση είναι στο πακέτο ``Orbits.net''. <sect2>Περίληψη μελών <p> <p> HTML() // Κατασκευαστής. <p> author() // Ρυθμίζει το όνομα του συγγραφέα του εγγράφου. <p> definitionList() // Ξεκινά μία λίστα ορισμών. <p> definitionListTerm() // Προσθέτει έναν όρο στη λίστα ορισμών. <p> endList() // Τελειώνει μία λίστα. <p> listItem() // Προσθέτει μία καταχώριση σε μία λίστα. <p> send() // Στέλνει το HTML μήνυμα. <p> title() // Ρυθμίζει το κείμενο για τον τίτλο του εγγράφου. <sect2>Δείτε επίσης <p> <tt>HTML_Test, Text</tt>. <sect2>HTML() <p> <descrip> <tag/Purpose/ Δημιουργεί ένα αντικείμενο που θα περιέχει ένα HTML μήνυμα. <tag/Syntax/ <tt>public HTML()</tt> <tag/Description/ Ρυθμίζει ένα κενό μήνυμα να συμπληρωθεί από τις HTML μεθόδους. <tag/See Also/ <tt>Text</tt>. </descrip> <sect2>author() <p> <descrip> <tag/Purpose/ Ρυθμίζει το όνομα του συγγραφέα του εγγράφου. <tag/Syntax/ <tt>public void author ( String author )</tt> <tag/Description/ Ρυθμίζει το όνομα του συγγραφέα του εγγράφου σε <tt>author</tt>. <tag>Parameter/ <descrip> <tag/author/ Το κείμενο που πρέπει να χρησιμοποιηθεί σαν ο συγγραφέας αυτού του μηνύματος. </descrip> <tag/See Also/ <tt>title()</tt>. </descrip> <sect2>definitionList() <p> <descrip> <tag/Purpose/ Αρχίζει μια λίστα ορισμών. <tag/Syntax/ <tt>public void definitionList ()</tt> <tag/Description/ Αρχίζει μια λίστα ορισμών. Η <em>definition list</em> είναι μία λίστα ειδικευμένη έτσι ώστε κάθε καταχώριση στη λίστα είναι ένας <em>term</em> ακολουθούμενος από το <em>text</em> ορισμών για αυτόν τον όρο. Η αρχή μιας λίστας ορισμών θα πρέπει να ακολουθείται από τουλάχιστον) ένα όρος/κείμενο ζευγάρι και μία κλήση στην <tt>endList()</tt> μέθοδο. <em>Σημειώστε πως, προς το παρόν, οι λίστες δεν μπορούν να είναι φωλιασμένες (nested) η μία μέσα στην άλλη.</em> <tag/See Also/ <tt>definitionListTerm()</tt>, <tt>endList()</tt>, <tt>listItem()</tt>. </descrip> <sect2>definitionListTerm() <p> <descrip> <tag/Purpose/ Προσθέτει έναν όρο στη λίστα ορισμών. <tag/Syntax/ <tt>public void definitionListTerm ()</tt> <tag/Description/ Προσθέτει έναν όρο στη λίστα ορισμών. Το κείμενο για το κομμάτι του όρου της τρέχουσας καταχώρησης λίστας θα πρέπει να επισυνάπτεται στο μήνυμα αφού η μέθοδος αυτού καλείται και πριν μια αντίστοιχη <tt>listItem</tt> μέθοδος καλείται. <tag/See Also/ <tt>definitionList()</tt>, <tt>listItem()</tt>. </descrip> <sect2>endList() <p> <descrip> <tag/Purpose/ Τελειώνει μια λίστα. <tag/Syntax/ <tt>public void endList ()</tt> <tag/Description/ Τελειώνει μια λίστα. Αυτή η μέθοδος κλείνει μία λίστα. <em>Σημειώστε ότι, προς το παρόν, οι λίστες δεν μπορούν να είναι φωλιασμένες (nested), η μία μέσα στην άλλη.</em> <tag/See Also/ <tt>definitionList()</tt>. </descrip> <sect2>listItem() <p> <descrip> <tag/Purpose/ Προσθέτει μία καταχώρηση σε μία λίστα. <tag/Syntax/ <tt>public void listItem ()</tt> <tag// <tt>public void listItem ( String item )</tt> <tag// <tt>public boolean listItem ( String term, String item )</tt> <tag/Description/ Προσθέτει μία καταχώρηση σε μία λίστα. Αν η πρώτη φόρμα χρησιμοποιείται, το κείμενο για την τρέχων αντικείμενο λίστας θα πρέπει να επισυνάπτεται στο μήνυμα αφού η μέθοδος αυτή καλείται και πριν άλλες μέθοδοι λίστας καλούνται. Στην δεύτερη και τρίτη φόρμα, το <tt>item</tt> κείμενο προσδιορίζεται σαν μία παράμετρος στη μέθοδο αντί να (ή επιπροσθέτως στο να) επισυνάπτεται στο μήνυμα. Η τρίτη φόρμα είναι ειδική στις λίστες ορισμών και παρέχει και τον όρο και του ορισμό της καταχώρησης λίστας. <tag/Parameters/ <descrip> <tag/item/ Το κείμενο αυτής της καταχώρησης λίστας. <tag/term/ Το κείμενο αυτής της λίστας ορισμών του κομματιού του όρου καταχώρησης. </descrip> <tag/See Also/ <tt>definitionList()</tt>, <tt>definitionListTerm()</tt>, <tt>endList()</tt>. </descrip> <sect2>send() <p> <descrip> <tag/Purpose/ Στέλνει το HTML μήνυμα. <tag/Syntax/ <tt>public void send ()</tt> <tag/Description/ Στέλνει το HTML μήνυμα. </descrip> <sect2>title() <p> <descrip> <tag/Purpose/ Ρυθμίζει το κείμενο για τον τίτλο εγγράφου. <tag/Syntax/ <tt>public void title ( String title )</tt> <tag/Description/ Ρυθμίζει το κείμενο για τον τίτλο εγγράφου. <tag/Parameter/ <descrip> <tag/title/ Το κείμενο αυτού του τίτλου του μηνύματος. </descrip> <tag/See Also/ <tt>author()</tt>. </descrip> <sect1>HTML_Test<label id="html-test-class"> <p> Αυτή η κλάση παρέχει ένα παράδειγμα του πώς να χρησιμοποιείτε την <tt>HTML</tt> κλάση και ένα test πρόγραμμα που μπορεί να χρησιμοποιηθεί για να επιβεβαιώσει ότι το πακέτο <em>Java CGI</em> λειτουργεί σωστά. <sect2>Περίληψη μελών <p> main() // Πρόγραμμα main(). <sect2>Δείτε επίσης <p> <tt>HTML</tt>. <sect2>main() <p> <descrip> <tag/Purpose/ Παρέχει μία <tt>main()</tt> μέθοδο. <tag/Syntax/ <tt>public static void main( String argv[] )</tt> <tag/Description/ Αυτό είναι το σημείο καταχώρησης για ένα πρόγραμμα CGI που επιστρέφει μία λίστα των διαθέσιμων όνομα/τιμή ζευγαριών σε ένα HTML έγγραφο, με το κάθε όνομα/τιμή ζευγάρι να απεικονίζεται σε ένα στοιχείο λίστας ορισμών. <tag>Παράμετρος <descrip> <tag/argv[]/ Επιχειρήματα περασμένα στο πρόγραμμα από το <tt>java.cgi</tt> σενάριο. Προς το παρόν δε χρησιμοποιούνται. </descrip> </descrip> <sect1>Text<label id="text-class"> <p> <sect2>Σύνταξη κλάσης <p> <tt>public abstract class Text</tt> <sect2>Περιγραφή κλάσης <p> Η κλάση είναι η υπερκλάση των <tt>Email</tt> και <tt>HTML</tt> κλάσεων. Μηνύματα χτίζονται με τις μεθόδους σε αυτήν την κλάση και συμπληρώνεται και διαμορφώνεται με τις μεθόδους σε υποκλάσεις. Αυτή η κλάση είναι στο πακέτο ``Orbits.text''. <sect2>Περίληψη μελών <p> <p> Text() // Κατασκευαστής. <p> add() // Προσθέτει κείμενο σε αυτό το αντικείμενο. <p> addLineBreak() // Προσθέτει μια διακοπή γραμμής. <p> addParagraph() // Προσθέτει μία διακοπή παραγράφου. <sect2>Δείτε επίσης <p> <tt>Email</tt>, <tt>HTML</tt>. <sect2>add() <p> <descrip> <tag/Purpose/ Προσθέτει κείμενο σε αυτό το αντικείμενο. <tag/Syntax/ <tt>public void add ( char addition )</tt> <tag// <tt>public void add ( String addition )</tt> <tag// <tt>public void add ( StringBuffer addition )</tt> <tag/Description/ Προσθέτει <tt>addition</tt> στα περιεχόμενα αυτού του αντικειμένου κειμένου. <tag/Parameter/ <descrip> <tag/addition/ Κείμενο που πρέπει να προστεθεί στο αντικείμενο κειμένου </descrip> <tag/See Also/ <tt>addLineBreak()</tt>, <tt>addParagraph()</tt>. </descrip> <sect2>addLineBreak() <p> <descrip> <tag/Purpose/ Αναγκάζει μία διακοπή γραμμής σε αυτό το σημείο στο κείμενο. <tag/Syntax/ <tt>public void addLineBreak ()</tt> <tag/Description/ Προσθέτει μία διακοπή γραμμής στο κείμενο στο τρέχον σημείο. <tag/See Also/ <tt>add()</tt>, <tt>addParagraph()</tt>. </descrip> <sect2>addParagraph() <p> <descrip> <tag/Purpose/ Αρχίζει μία νέα παράγραφο. <tag/Syntax/ <tt>public void add ()</tt> <tag/Description/ Αρχίζει μία νέα παράγραφο σε αυτό το σημείο στη ροή κειμένου. <tag/See Also/ <tt>add()</tt>, <tt>addLineBreak()</tt>. </descrip> <sect>Μελλοντικά Σχέδια <p> <itemize> <item> Προσθήκη στην Email κλάση: <descrip> <tag/Email( int capacity )/ Χρησιμοποιείται όταν γνωρίζουμε πόσο χώρο το μήνυμα θα χρειαστεί να έχει παραχωρημένο. <tag/sendTo( String [] address )/ Προσθέτει μία λίστα πρωταρχικών προορισμών στο e-mail μήνυμα. <tag/sendCc( String address )/ Προσθέτει ένα Carbon-Copy προορισμό στο e-mail μήνυμα. <tag/sendCc( String [] address )/ Προσθέτει μία λίστα από Carbon-Copy προορισμούς στο e-mail μήνυμα. <tag/sendBcc( String address )/ Προσθέτει ένα Blind Carbon-Copy προορισμό στο e-mail μήνυμα. <tag/sendBcc( String [] address )/ Προσθέτει μία λίστα από Blind Carbon-Copy προορισμούς στο e-mail μήνυμα. </descrip> </item> <item> Προσθήκη στην HTML κλάση: <descrip> <tag/HTML( int capacity )/ Χρησιμοποιείται όταν γνωρίζουμε πόσο χώρο το μήνυμα θα χρειαστεί να έχει παραχωρημένο. <tag/public void unorderedList()/ Αρχίζει μία μη ταξινομημένη λίστα. <tag/public void orderedList()/ Αρχίζει μία ταξινομημένη λίστα. <tag/public void directoryList()/ Αρχίζει μία λίστα καταλόγων. <tag/public void menuList()/ Αρχίζει μία λίστα μενού. <tag/void anchor( String anchorName )/ Προσδιορίζει ένα anchor. <tag/void link( String url, String text )/ Προσδιορίζει έναν δεσμό. <tag/void applet( String url, String altText )/ Προσδιορίζει έναν δεσμό applet. </descrip> </item> <item> Επιτρέπει φωλιασμένες (nested) HTML λίστες. </item> <item> Προσθήκη κώδικα ελέγχου σφαλμάτων για να επιβάλλει σωστή ταξινόμηση της HTML λίστας κωδικών διαμόρφωσης. </item> <item> Η τοποθεσία του αρχείου των δεδομένων περιβάλλοντος θα πρέπει να είναι διαμορφώσιμο από το <tt>Makefile</tt>. </item> <item> Απαλλαγή από το ψεύτικα άδειο όνομα/τιμή ζευγάρι που εμφανίζεται μέσα στη λίστα όταν αντιμετωπίζουμε την GET μέθοδο της μεταφοράς δεδομένων. </item> <item> Σκέψη για να έχουμε το CGI να εκτελεί την java.util.Enumeration επιφάνεια για να παρέχει επιτυχώς ονόματα μεταβλητών. </item> <item> Προσθήκη μιας <tt>Test</tt> κλάσης, που θα χρησιμοποιούσε κάθε μέθοδο σε αυτό το πακέτο. </item> <item> Τεκμηρίωση πώς οι <tt>CGI_Test</tt>, <tt>Email_Test</tt> και <tt>HTML_Test</tt> χτίστηκαν η μία πάνω στην άλλη για να παρέχουν αυξανόμενους ελέγχους για σκοπούς εκσφαλμάτωσης. </item> <item> Τεκμηρίωση πώς η Test χρησιμοποιεί κάθε χαρακτηριστικό διαθέσιμο σε αυτό το πακέτο. </item> </itemize> <sect>Αλλαγές <p> <sect1>Αλλαγές από την 0.4 στην 0.5 <p> <itemize> <item> Αλλάχτηκε η τεκμηρίωση και τα σχόλια για να αντικατοπτρίζεται η τελική φύση αυτής της κυκλοφορίας. </item> </itemize> <sect1>Αλλαγές από την 0.3 στην 0.4 <p> <itemize> <item> Ενσαρκώθηκε η HTML κλάση για να παρέχει ελάχιστη λειτουργικότητα. </item> <item> Γράφτηκε η HTML_Test κλάση και το javahtmltest.html-dist. </item> <item> Προστέθηκαν οι HTML μέθοδοι για να αντιμετωπιστεί μια λίστα ορισμών. </item> </itemize> <sect1>Αλλαγές από την 0.2 στην 0.3 <p> <itemize> <item> Προστέθηκαν οι Text και Email κλάσεις. Η HTML επίσης προστέθηκε, αλλά ήταν μόνο ένα απόκομμα σε αυτό το σημείο. </item> <item> Τοποθετήθηκαν οι διάφορες κλάσεις σε πακέτα. Οι κύριες κλάσεις είναι στο <tt>Orbits.net.*</tt>, η κλάση υποστήριξης <tt>Text</tt> είναι στο <tt>Orbits.text.Text</tt>. </item> <item> Αλλάχτηκε το <tt>CGItest</tt> σε <tt>CGI_Test</tt>. </item> <item> Προστέθηκε η <tt>Email_Test</tt> κλάση. </item> </itemize> <sect1>Αλλαγές από την 0.1 στην 0.2 <p> <itemize> <item> Οι μεταβλητές περιβάλλοντος τοποθετούνται σε ένα προσωρινό αρχείο αντί να είναι στοιβαγμένες στη γραμμή-εντολών του Java διερμηνέα . Η <tt>CGI</tt> κλάση και το <tt>java.cgi</tt> έπρεπε να τροποποιηθούν. </item> <item> Το <tt>javacgitest.html</tt> έγγραφο γίνεται μέρος της διανομής. </item> <item> Τα αρχεία κειμένου που τροποποιούνται από την <tt>make</tt> κατά την εγκατάσταση παρέχονται με ονόματα που τελειώνουν σε <em>-dist</em>. </item> </itemize> </article>