Kako započeti s Javom na poslužitelju

Java na strani poslužitelja (SSJ), koja se ponekad naziva i servletima ili apletima na strani poslužitelja, moćan je hibrid Zajedničkog prolaznog sučelja (CGI) i API-ja za poslužitelje API-ja niže razine - poput NSAPI iz Netscapea i ISAPI iz Microsofta.

Ovaj članak nudi uvod i detaljne upute za implementaciju Netscapea na poslužiteljskoj Javi, koju Netscape naziva apletima na poslužitelju (SSA).

SSA mogu djelovati poput CGI skripte. Prima geti posttraži i vraća web stranicu (obično u obliku HTML-a), ali SSJ se dinamički učitava na poslužitelj poput NSAPI / ISAPI. Ovo eliminira kašnjenja pri pokretanju koja smo očekivali od CGI-a. Također omogućuje SSJ-u da održi neko svoje stanje između izvršenja, poput održavanja otvorene veze s bazom podataka.

SSA se izvršavaju u vlastitom pješčaniku, što pruža sigurnost koju se očekuje od Jave. Na primjer, padajući aplet neće srušiti cijeli poslužitelj kao što se može dogoditi kod programiranja NSAPI / ISAPI. Ova dodatna sigurnost također omogućuje prijenos apleta za izvršavanje na poslužitelju - baš kao što se Java apleti na strani klijenta preuzimaju za izvršavanje na klijentu.

Možda je najvažniji aspekt SSA-a taj što su, napisani na Javi, u osnovi neovisni o platformi i objektno orijentirani.

Povijest

Sve veći broj poslužitelja podržava Java na poslužitelju, uključujući poslužitelje Netscape FastTrack 2.0 i Enterprise 2.0, Java Web Server Server JavaSoft (prije se zvao Jeeves), Jigsaw World Wide Web Consortium, WebLogic T3Server, Oracle Webserver i ExpressO Peak Technologies. Svaki od ovih poslužitelja koristi drugačiji Java API na strani poslužitelja, zahtijevajući od programera da napišu različite programe za svaki poslužitelj koji će koristiti.

Pojedinosti Netscapea: pripremite svoj poslužitelj

Prije izrade vašeg prvog apleta na strani poslužitelja za Netscapeove poslužitelje, morate pripremiti poslužitelj. Poslužitelji Enterprise i FastTrack identični su u svojoj SSA podršci.

Započnite s uključivanjem Java interpretera poslužitelja. To se može učiniti iz Upravitelja poslužitelja u odjeljku "Programi -> Java". Pritisnite gumb Da da biste omogućili Java interpreter. Upravitelj poslužitelja zatražit će od vas "direktorij Java apleta", na kojemu će se smjestiti datoteke podrške za SSA, kao i mjesto za sve datoteke klase SSA. Pruža zadano mjesto. Na Unix računalima ovo je / usr / ns-home / plugins / java / appleti . Na Windows računalima to je C: \ Program Files \ Netscape \ Server \ plugins \ Java \ appleti(Napomena: U ovom polju za unos Netscape nastoji miješati i podudarati svoje stražnje kose crte i nagnute crte. Ne brinite, Netscape tretira dvije vrste kose crte na isti način.) Ako je moguće, uzmite zadani direktorij apleta. Ako se odlučite prilagoditi, a ne koristiti zadani, obavezno odaberite direktorij negdje ispod korijena poslužitelja i da li kopirate sve datoteke sa zadanog mjesta na svoje prilagođeno mjesto. Spremite i primijenite svoje promjene, pazeći da zaustavite poslužitelj i ponovo ga pokrenete kako bi promjene stupile na snagu.

Vrijeme je za eksperimentiranje!

U ovom trenutku trebali biste moći eksperimentirati s apletima koje nudi Netscape. Usmjerite preglednik na // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Aplet Obrazac trebao bi vidjeti podatke "get" kako ih obrađuje i vraća u HTML-u.

Ako dobijete pogrešku poslužitelja, provjerite zapisnik pogrešaka poslužitelja ( / usr / ns-home / httpd-hostname / logs / errors ili C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ pogreške ). Ako kaže da ne može pokrenuti Java interpreter, vjerojatni je uzrok taj što vaš CLASSPATH zbunjuje Netscape. Pokušajte pokrenuti poslužitelj u okruženju bez CLASSPATH-a.

Još jedan aplet koji treba isprobati je na // servername / server-java / Connect; trebao bi se učitati i prikazati //www.meer.net/barn/index.html. Aplet Connect uspostavlja vezu soketa kako bi dohvatio stranicu, što može generirati pogrešku poslužitelja ako je vaš poslužitelj iza vatrozida. Za sljedeći korak, pretpostavimo da je vatrozid blokirao utičnicu. Uređivat ćemo kod alata Connect kako bismo pristupili drugoj stranici na drugom web poslužitelju.

Datoteka Connect.java dostupna je u "direktoriju Java apleta." (Također se nalazi u nastavku.) Prvo uvozi netscape.server.applet. *.

uvoz netscape.server.applet. *; 

Ovaj paket sadrži osnovne klase za razvoj apleta na strani poslužitelja. Najvažnija klasa u ovom paketu je HttpAppletsuperrazred za sve aplete na poslužitelju. Kao što možete vidjeti u Connectu (dolje), jedina metoda koju aplet na strani poslužitelja treba implementirati je runmetoda. Ova se metoda poziva svaki put kada aplet primi "pogodak". runMetoda Connect otvara utičnicu na „domaćina” i dohvaća „zahtjev” prije nego preusmjeravanje izlaza za klijenta. Želimo promijeniti varijablu "host" tako da se odnosi na stroj vidljiv s našeg web poslužitelja. Također ćemo htjeti promijeniti varijablu "zahtjev" tako da upućuje na stranicu na novom "hostu".

uvoz netscape.server.applet. *; import java.io.PrintStream; import java.io.InputStream; import java.io.OutputStream; import java.io.DataInputStream; import java.net.Socket; class Connect produžuje HttpApplet {public void run () baca iznimku {String host = "www.meer.net"; // promijenimo ovaj int port = 80; Niz zahtjeva = "GET /barn/index.html HTTP / 1.0 \ n"; // i ovo Socket s = nova Socket (host, port); OutputStream os = s.getOutputStream (); PrintStream op = novi PrintStream (os); op.println (zahtjev); InputStream je = sam (); DataInputStream di = novi DataInputStream (je); Linija niza; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData na" + host + "port" + port + ""); out.println ("zahtjev:" + zahtjev + "
   
"); while ((line = di.readLine ())! = null) out.println (line);}}}

Nakon što napravite promjene "host" i "request", sljedeći je korak ponovno sastaviti Connect.

U sustavu Windows upotrijebite svoj standardni javac kompajler s postavljenim putovima razreda da biste uključili serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

Pod Unixom, Netscape nudi Java kompajler (javac) u direktoriju iznad direktorija Java apleta. Ovaj je javac zapravo skripta koja poziva java sun.tools.javac.Mainna sastavljanje. Na nekim sustavima sun.tools.javac.Mainkompajler koristi nove 1.1 JDK metode poput java.lang.Character.isJavaLetterOrDigit(), koje mogu stvoriti popriličan problem programerima bez 1.1 JDK. Savršeno redu alternativa je korištenje standardnog javac prevodilac ste oduvijek koristi, javac -classpath ../classes/serv2_0.zip Connect.java. Ako želite koristiti priloženi javac skript, samo zamijenite " javac" s " ../javac."

Tijekom ove kompilacije možete vidjeti pogrešku koja kaže:

Connect.java:1: Paket netscape.server.applet nije pronađen u uvozu. uvoz netscape.server.applet. *; ^ 1 pogreška

Ova pogreška ne treba brinuti. Datoteka klase kreira se normalno i izvrsno će se izvoditi. Ovu pogrešku možete izbjeći ako uklonite zamjenske znakove u svojim izjavama o uvozu.

Pod Unixom, Netscape pruža makefile u direktoriju Java apleta za upravljanje kompilacijom apleta. Nažalost, makefile koristi zamjenski znak '%', koji je proširenje mk / nmake i nije uvijek dostupan. Šifra problema prikazana je u nastavku.

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

Alternativa je upotreba pravila .sufiksa. Uredite prvi redak make datoteke kako bi bio:

.SUFFIXES: .java .class i zamijenite% .class ciljne linije sa .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Možda ćete primijetiti da sam uklonio ../tako da će makefile pozivati ​​standardni javac prevodilac. Da biste testirali ovu novu datoteku izrade, ponovno spremite datoteku Connect.java i isprobajte "make".

Ako biste odmah ponovo učitali // servername / server-java / Connect stranicu, i dalje biste vidjeli stranicu "Staja". To je zato što se Java klase učitavaju na poslužitelj u vrijeme pokretanja putem funkcije init u datoteci obj.conf. Da biste učitali nove promjene, morate zaustaviti poslužitelj i ponovo ga pokrenuti. Na nekim sustavima morate koristiti upravitelj poslužitelja za zaustavljanje i pokretanje. Ponovno pokretanje naredbenog retka ponekad rezultira "Greškom poslužitelja" za sljedeće zahtjeve apleta. Nakon što zaustavite i pokrenete poslužitelj, pokušajte ponovno povezati programčić. Netscape je trebao učitati novi Connect kod za prikaz stranice koju ste odabrali.

Let's get serious about API

Congratulations! You`ve just compiled and tested your first server-side Java code. Now to give a few of the methods available to you.

With the following methods you can do the majority of your work:

PrintStream getOutputStream() throws IOException; 

returns a PrintStream, which you can use to print your response to the client. It replaces System.out.

Hashtable getFormData() throws IOException; 

returns a Hashtable storing the name-value pairs of the HTTP request. The value strings are decoded from their URI-encoded form. It throws an IOException if there is no form data.

String getFormField(String fieldName) throws IOException; 

You can use getFormField for retrieving just one field. It too throws an IOException if there is no form data.

boolean returnNormalResponse(String contentType) throws IOException; 

starts an HTTP response with the content type set as you specify with its parameter. It returns true if this was a "get" or "post" request and false if it was a "head" request.

public boolean returnErrorResponse(String contentType, int status, String reason) throws IOException public boolean returnErrorResponse(String contentType, int status) throws IOException 

starts an HTTP response to report an error. It takes a content type, a status (such as HttpApplet.BAD_REQUEST, which represents the standard error code 400), and an optional string giving the reason for the error.

There are dozens of other methods you can use in the development of your server-side applets. Netscape installs an API guide with its servers. You can find the guide at /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm under Unix or at C:\Program Files\Netscape\Server\bin\httpd\admin\html\manual\pg\javapi.htm under Windows.

Hello World!

Now let's use everything we've learned to write the (you guessed it!) Hello World server-side applet. The following applet says hello to World unless a target field is given -- in which case it says hello to the target instead.

import netscape.server.applet.HttpApplet; import java.io.IOException; import java.io.PrintStream; class Hello extends HttpApplet { /* By default, we say hello to "World" */ String helloTarget = "World"; /* run() is invoked to handle the request */ public void run() throws Exception { /* getOutputStream() allows us to talk to the client */ PrintStream out = getOutputStream(); /* Use getFormField() to find out if we are to say hello to * someone other than "World". */ String formTarget = null; try { formTarget = getFormField("target"); if (formTarget != null) { helloTarget = formTarget; } } catch (IOException e) { /* We'll ignore exceptions caused by a "missing query string" */ if (! e.getMessage().startsWith("missing query string")) { handleException(e, out); } } /* Say the hello */ if (returnNormalResponse("text/html")) { try { out.println("Hello, " + helloTarget + "!"); } catch (Exception e) { handleException(e, out); } } } private void handleException(Exception e, PrintStream out) { try { returnErrorResponse("text/html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // try to print original exception out.print("&lth1>"); out.print(e); out.print("\n"); out.print("&ltpre>"); e.printStackTrace(out); // alternative PrintStream must be specified out.print("
"); povratak;}}

Ova potklasa apleta na strani poslužitelja iz netscape.server.applet.HttpApplet i poništava run()metodu baš kao i svi apleti na strani poslužitelja pod Netscapeom. Brzo dobiva svoj izlazni tok pozivom getOutputStream, koji će upotrijebiti za ispis "Zdravo" (ili za ispis razloga neuspjeha). Poziva getFormFieldda provjeri postoji li alternativni cilj koji se koristi, a zatim vraća normalan odgovor "text / html" i na kraju izvršava stvarni posao ispisa "Hello". Primijetite da provjerava povratnu vrijednost returnNormalResponse()poziva i ne čini ništa ako vrati false. Ako to ne učinite, vratit ćete podatke čak i za headzahtjeve.