Jak rozpocząć korzystanie z języka Java po stronie serwera

Java po stronie serwera (SSJ), czasami nazywana serwletami lub apletami po stronie serwera, jest potężną hybrydą interfejsu Common Gateway Interface (CGI) i programowania API serwera niższego poziomu - takiego jak NSAPI firmy Netscape i ISAPI firmy Microsoft.

Ten artykuł zawiera wprowadzenie i instrukcje krok po kroku dotyczące implementacji języka Java po stronie serwera w Netscape, którą Netscape wywołuje aplety po stronie serwera (SSA).

SSA mogą działać jak skrypt CGI. Odbiera geti postżądania i zwraca stronę internetową (zazwyczaj w postaci HTML), ale SSJ jest ładowany dynamicznie na serwerze jak NSAPI / ISAPI. Eliminuje to opóźnienia w uruchomieniu, których oczekujemy od CGI. Pozwala również SSJ zachować część stanu między wykonaniami, na przykład utrzymywanie otwartego połączenia z bazą danych.

SSA działają we własnej piaskownicy, co zapewnia bezpieczeństwo , jakiego oczekuje się od języka Java. Na przykład awaria apletu nie spowoduje awarii całego serwera, jak może się to zdarzyć w przypadku programowania NSAPI / ISAPI. To dodatkowe zabezpieczenie umożliwia również wysyłanie apletów do wykonania na serwerze - podobnie jak aplety Java po stronie klienta są pobierane do wykonania na kliencie.

Być może najważniejszym aspektem SSA jest to, że napisane w Javie są one z natury niezależne od platformy i zorientowane obiektowo.

Historia

Rosnąca liczba serwerów obsługuje język Java po stronie serwera, w tym serwery Netscape FastTrack 2.0 i Enterprise 2.0, JavaSoft's Java Web Server (dawniej Jeeves), Jigsaw World Wide Web Consortium, WebLogic's T3Server, Oracle's Webserver i Peak Technologies 'ExpressO. Każdy z tych serwerów używa innego interfejsu API języka Java po stronie serwera, co wymaga od programistów pisania różnych programów dla każdego serwera, którego będą używać.

Szczegóły dotyczące Netscape: Przygotuj serwer

Przed utworzeniem pierwszego apletu po stronie serwera dla serwerów Netscape należy przygotować serwer. Serwery Enterprise i FastTrack są identyczne pod względem obsługi SSA.

Zacznij od włączenia interpretera języka Java na serwerze. Można to zrobić w Menedżerze serwera w „Programy -> Java”. Kliknij przycisk Tak, aby włączyć interpreter języka Java. Menedżer serwera zapyta o „katalog apletów Java”, czyli miejsce, w którym można umieścić pliki obsługi SSA, a także lokalizację wszystkich plików klas SSA. Zapewnia domyślną lokalizację. Na komputerach z systemem Unix jest to / usr / ns-home / plugins / java / applets . Na komputerach z systemem Windows jest to C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets(Uwaga: w tym polu wejściowym Netscape ma tendencję do mieszania i dopasowywania ukośników w tył i w przód. Nie martw się, Netscape traktuje oba typy ukośników w ten sam sposób.) Jeśli to możliwe, weź domyślny katalog apletów. Jeśli zdecydujesz się dostosować zamiast używać domyślnego, upewnij się, że wybierasz katalog gdzieś w katalogu głównym serwera i kopiujesz wszystkie pliki z domyślnej lokalizacji do niestandardowej lokalizacji. Zapisz i zastosuj zmiany, zatrzymując serwer i uruchamiając go ponownie, aby zmiany odniosły skutek.

Czas na eksperyment!

W tym momencie powinieneś być w stanie poeksperymentować z apletami dostarczonymi przez Netscape. Skieruj swoją przeglądarkę na // nazwa_serwera / server-java / FormApplet? Abc = xyz & 123 = 789. Powinieneś zobaczyć dane „pobierz” obsługiwane i zwracane w HTML przez aplet Form.

Jeśli pojawi się błąd serwera, sprawdź dziennik błędów serwera ( / usr / ns-home / httpd-hostname / logs / errors lub C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ errors ). Jeśli mówi, że nie może uruchomić interpretera Javy, prawdopodobną przyczyną jest to, że CLASSPATH wprowadza w błąd przeglądarkę Netscape. Spróbuj uruchomić serwer w środowisku bez CLASSPATH.

Inny aplet do wypróbowania znajduje się pod adresem // nazwa_serwera / server-java / Connect; powinien załadować się i wyświetlić //www.meer.net/barn/index.html. Aplet Connect nawiązuje połączenie przez gniazdo w celu pobrania strony, co może wygenerować błąd serwera, jeśli serwer znajduje się za zaporą ogniową. W następnym kroku załóżmy, że zapora blokuje gniazdo. Zmodyfikujemy kod apletu Connect, aby uzyskać dostęp do innej strony na innym serwerze sieci Web.

Plik Connect.java jest dostępny w „Katalogu apletów Java”. (Znajduje się również poniżej). Najpierw importuje plik netscape.server.applet. *.

import netscape.server.applet. *; 

Ten pakiet zawiera podstawowe klasy do tworzenia apletów po stronie serwera. Najważniejszą klasą tego pakietu jest HttpAppletnadklasa dla wszystkich apletów po stronie serwera. Jak widać w Connect (poniżej), jedyną metodą, którą aplet po stronie serwera musi zaimplementować, jest runmetoda. Ta metoda jest wywoływana za każdym razem, gdy aplet otrzyma „trafienie”. runMetoda Połącz otwiera gniazdo do „host” i pobiera „żądanie” przed przekierowaniem wyjścia do klienta. Chcemy zmienić zmienną „host”, aby odwoływała się do maszyny widocznej z naszego serwera WWW. Chcemy również zmienić zmienną „request”, tak aby odwoływała się do strony na nowym „hoście”.

import 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 extends HttpApplet {public void run () rzuca wyjątek {String host = "www.meer.net"; // zmień ten port int = 80; Żądanie ciągu = "GET /barn/index.html HTTP / 1.0 \ n"; // to też Socket s = new Socket (host, port); OutputStream os = s.getOutputStream (); PrintStream op = new PrintStream (os); op.println (żądanie); InputStream to = sam (); DataInputStream di = new DataInputStream (jest); Linia ciągów; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData on" + host + "port" + port + ""); out.println ("request:" + request + "
   
"); while ((line = di.readLine ())! = null) out.println (line);}}}

Po wprowadzeniu zmian „hosta” i „żądania” następnym krokiem jest ponowna kompilacja Connect.

W systemie Windows użyj standardowego kompilatora javac ze ścieżką klasy ustawioną na serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

W systemie Unix Netscape udostępnia kompilator Java (javac) w katalogu powyżej katalogu apletów Java. Ten javac jest w rzeczywistości skryptem, który wywołuje java sun.tools.javac.Mainkompilację. W niektórych systemach sun.tools.javac.Mainkompilator wykorzystuje nowe metody 1.1 JDK, takie jak java.lang.Character.isJavaLetterOrDigit(), co może sprawiać spory problem programistom bez 1.1 JDK. Idealnie w porządku Alternatywą jest użycie standardowego kompilatora javac ty zawsze używany, javac -classpath ../classes/serv2_0.zip Connect.java. Jeśli chcesz użyć dostarczonego skryptu javac, po prostu zamień „ javac” na „” ../javac.

Podczas tej kompilacji możesz zobaczyć błąd, który mówi:

Connect.java:1: Pakiet netscape.server.applet nie został znaleziony podczas importu. import netscape.server.applet. *; ^ 1 błąd

Nie ma się czym martwić o ten błąd. Plik klasy jest tworzony normalnie i będzie działał poprawnie. Możesz uniknąć tego błędu, eliminując symbole wieloznaczne w instrukcjach importu.

W systemie Unix Netscape udostępnia plik makefile w katalogu apletów Java do obsługi kompilacji apletów. Niestety, plik makefile używa symbolu wieloznacznego „%”, który jest rozszerzeniem mk / nmake i nie zawsze jest dostępny. Kod problemu przedstawiono poniżej.

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

Alternatywą jest użycie reguły .suffixes. Edytuj pierwszą linię pliku makefile tak, aby była:

.SUFFIXES: .java .class i zamień wiersze docelowe% .class na .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Możesz zauważyć, że usunąłem ../plik makefile, aby wywołać standardowy kompilator javac. Aby przetestować ten nowy plik makefile, zapisz ponownie plik Connect.java i wypróbuj polecenie „make”.

Gdybyś teraz ponownie załadował stronę // nazwa_serwera / server-java / Connect, nadal byłaby widoczna strona „Stodoła”. Dzieje się tak, ponieważ klasy Java są ładowane na serwer w czasie uruchamiania za pośrednictwem funkcji init w pliku obj.conf. Aby załadować nowe zmiany, musisz zatrzymać serwer, a następnie uruchomić go ponownie. W niektórych systemach do zatrzymania i uruchomienia należy użyć Menedżera serwera. Ponowne uruchomienie wiersza polecenia czasami powoduje „Błąd serwera” dla kolejnych żądań apletów. Po zatrzymaniu i uruchomieniu serwera spróbuj ponownie uruchomić aplet Połącz. Netscape powinien był załadować nowy kod Connect, aby wyświetlić wybraną stronę.

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("
"); powrót; } }

Ten aplet po stronie serwera jest podklasą z netscape.server.applet.HttpApplet i przesłania run()metodę, tak jak wszystkie aplety po stronie serwera w Netscape. Szybko pobiera strumień wyjściowy za pomocą wywołania getOutputStream, którego użyje do wydrukowania „Hello” (lub użyje do wydrukowania przyczyny niepowodzenia). Wywołuje, getFormFieldaby sprawdzić, czy istnieje alternatywny cel do użycia, a następnie zwraca normalną odpowiedź „tekst / html” i na koniec wykonuje faktyczną pracę polegającą na wypisywaniu „Hello”. Zwróć uwagę, że sprawdza wartość zwracaną przez returnNormalResponse()wywołanie i nie robi nic, jeśli zwraca fałsz. Jeśli tego nie zrobisz, zwrócisz dane nawet na headprośby.