Pisz programy CGI w Javie

Common Gateway Interface (CGI) to standard pisania programów, które mogą wchodzić w interakcje przez serwer sieci Web z klientem z przeglądarką internetową. Programy te pozwalają twórcom stron internetowych na dostarczanie dynamicznych informacji (zwykle w postaci HTML) za pośrednictwem przeglądarki. Program CGI można napisać w dowolnym języku, w tym w języku Java, który może być wykonywany przez serwer WWW. Programy CGI są powszechnie używane do dodawania wyszukiwarek, aplikacji księgi gości, silników zapytań baz danych, forów użytkowników interaktywnych i innych aplikacji interaktywnych do witryn sieci Web.

Mówiąc najprościej, program CGI musi zinterpretować przesłane do niego informacje, przetworzyć je w jakiś sposób i wygenerować odpowiedź, która zostanie odesłana do klienta.

Większość danych wejściowych do programu CGI jest przekazywana do niego za pośrednictwem zmiennych środowiskowych. W tym artykule pokazano, jak wysłać te zmienne środowiskowe do programu Java CGI. Reszta danych wejściowych (jeśli istnieje) jest przekazywana do programu CGI jako standardowe wejście, które może być czytane bezpośrednio przez program.

Przetwarzanie może być tak proste, jak dołączenie informacji do pliku lub złożone, jak żądanie danych z bazy danych.

Ponieważ program CGI może zwracać niezliczone typy dokumentów, program CGI musi umieścić na wyjściu krótki nagłówek (tekst ASCII), aby klient wiedział, jak interpretować generowane przez siebie informacje. Najczęściej programy CGI generują HTML. Poniżej znajdziesz bibliotekę funkcji, w tym jedną, która generuje odpowiedni nagłówek dla HTML. Po nagłówku program CGI po prostu generuje treść wyniku w jego natywnej formie.

Przekazanie środowiska CGI do programu Java

Pisanie programu CGI w Javie jest dość łatwe, gdy zrozumiesz problemy. Przede wszystkim musisz umieścić wykonanie programu Java w innym skrypcie. Tak więc rzeczywisty skrypt wywoływany na serwerze WWW będzie skryptem powłoki systemu Unix lub plikiem wsadowym systemu Windows (lub odpowiednikiem), który po prostu przekazuje zmienne środowiskowe CGI do programu Java.

Ponieważ Java nie zapewnia już metody bezpośredniego dostępu do zmiennych środowiskowych ( System.getenv()metoda została wyłączona w najnowszej wersji JDK), proponuję przekazanie każdej zmiennej środowiskowej CGI do programu Java za pomocą parametru -D wiersza polecenia w interpreterze Java . Poniżej pokażę, jak używać parametru -D.

Biblioteka funkcji, które przedstawiam poniżej, zakłada, że ​​zastosowałeś podejście opisane powyżej; używa System.getProperty()metody dostępu do tych parametrów wiersza poleceń. Jeśli Twój program wymaga użycia którejkolwiek ze zmiennych środowiskowych CGI, możesz uzyskać do nich dostęp w ten sam sposób. Na przykład, jeśli chcesz uzyskać dostęp do zmiennej środowiskowej SERVER_NAME, możesz to zrobić w następujący sposób:

 String server_name = System.getProperty ("cgi.server_name"); 

Należy pamiętać, że nie przekazuję wszystkich zmiennych środowiskowych CGI do mojego programu Java. Mijam tylko te główne. Pozostawię włączenie pozostałych jako ćwiczenie dla czytelnika.

Poniższy przykład przedstawia plik skryptu systemu Unix o nazwie hello.cgiwywołanie programu Java o nazwie hello. Zwróć uwagę, że parametr -D wiersza polecenia przekazuje zmienne środowiskowe CGI do programu Java:

# !!! Dcgi.script_name = $ SCRIPT_NAME -Dcgi.path_info = $ PATH_INFO witaj 

To rozwiązanie nie działa dobrze na platformach Windows 95 i NT, ponieważ mogą istnieć ograniczenia dotyczące liczby znaków dozwolonych w wierszu poleceń. Alternatywnym podejściem może być po prostu zapisanie każdej ze zmiennych środowiskowych i powiązanych z nimi wartości do pliku tymczasowego (oczywiście z unikalną nazwą). Następnie możesz przekazać nazwę tego pliku do swojego programu Java i poprosić go o odczytanie tego pliku i przeanalizowanie par zmienna środowiskowa / wartość. Nie zapomnij usunąć pliku tymczasowego, gdy skończysz go używać! Ponownie, to ćwiczenie pozostawia się czytelnikowi.

Biblioteka Java CGI

Aby ułatwić żmudne zadanie przetwarzania danych wejściowych CGI, napisałem klasę Java (tak naprawdę bibliotekę funkcji), której możesz użyć do ograniczenia części brudnej roboty. Ta biblioteka próbuje powielić funkcjonalność bardzo popularnej cgi-lib.plbiblioteki Perla . Poniżej udokumentowałem kod przy użyciu komentarzy w stylu javadoc, dzięki czemu można wygenerować dokumentację HTML bezpośrednio z kodu. (Służy javadoc cgi_lib.javado generowania cgi_lib.html).

Oto kod źródłowy i dokumentacja biblioteki.

Pisanie pierwszego programu CGI w języku Java

Oto przykład, który pokazuje, jak cgi_lib.javamożna użyć biblioteki do napisania programu CGI. Napiszemy prosty program, który przetwarza mój formularz „Hello There”. Ten prosty formularz poprosi użytkownika o podanie nazwy i adresu e-mail. Oto formularz ( hello.html), który chcemy przetworzyć:

& ltHTML> & ltHEAD> & ltTITLE & gt Witaj i witaj! & ltBODY> & ltH1 ALIGN = CENTER & gtWitaj i witaj & lthr> & ltFORM METHOD = "POST" ACTION = "/ cgi-bin / hello.cgi"> Jak masz na imię? & ltINPUT TYPE = "text" NAME = "name"> & ltp> Jaki jest Twój adres e-mail? & ltINPUT SIZE = 40 TYPE = "text" NAME = "email"> & ltINPUT TYPE = "wyślij" VALUE = "Prześlij">. & ltP> & lthr>

Napiszmy program w języku Java do przetwarzania formularza „Hello There”.

Najpierw musimy poinformować klienta, że ​​nasz program będzie generował HTML. Header()Metoda cgi_lib.javatworzy ciąg musimy, więc zaczniemy poprzez wywołanie tej metody i wysyłając ciąg do standardowej z użyciem System.out.printlnwywołania systemowego.

// // Wydrukuj wymagany nagłówek CGI. // System.out.println (cgi_lib.Header ());

Po drugie, chcemy przetwarzać dane formularza przesłane do nas przez przeglądarkę. ReadParseMetoda cgi_lib.javawykonuje całą tę pracę za nas i zwraca wynik w instancji hashtable. W takim przypadku Hashtable będzie zawierał dwie wartości klucza po przeanalizowaniu danych formularza. Jedno będzie polem wejściowym „nazwa”, a drugie będzie polem „e-mail”. Wartości skojarzone z każdym z tych kluczy będą takie, jakie użytkownik wpisał w tych polach wejściowych w formularzu „Hello There”.

// // Przetwórz dane formularza do tablicy z haszowaniem. // Hashtable form_data = cgi_lib.ReadParse (System.in);

Now that we've parsed the form data, we can do whatever processing we'd like with the data sent to us. Then we can generate some HTML to send back to the user's browser. In this simple program, we aren't going to do any processing with the data; we're simply going to echo back the information supplied by the user. We are going to use the get method on the Hashtable object to extract the form values into strings that we can use in our program. The following example shows how we would extract the name that the user typed into a String object.

 String name = (String)form_data.get("name"); 

Now, let's put this all together in a simple program. Here is a Java application that we can use to process the "Hello There" form (hello.java):

import java.util.*; import java.io.*; class hello { public static void main( String args[] ) { // // Here is a minimalistic CGI program that uses cgi_lib // // // Print the required CGI header. // System.out.println(cgi_lib.Header()); // // Parse the form data into a Hashtable. // Hashtable form_data = cgi_lib.ReadParse(System.in); // // Create the Top of the returned HTML page // String name = (String)form_data.get("name"); System.out.println(cgi_lib.HtmlTop("Hello There " + name + "!")); System.out.println("&lth1 align=center&gtHello There " + name + "!"); System.out.println("Here are the name/value pairs from the form:"); // // Print the name/value pairs sent from the browser. // System.out.println(cgi_lib.Variables(form_data)); // // Print the Environment variables sent in from the Unix script. // System.out.println("Here are the CGI environment variables/value pairs" + "passed in from the UNIX script:"); System.out.println(cgi_lib.Environment()); // // Create the Bottom of the returned HTML page to close it cleanly. // System.out.println(cgi_lib.HtmlBot()); } } 

Conclusion

With this introduction to CGI programming in Java, you should be on your way to a whole new way of programming the server side of your Web applications. Keep in mind that the CGI protocol provides only one way of communicating between a client browser and a Web server. The World Wide Web Consortium's Jigsaw (see the Resources section below) and others like Sun's Jeeves, are coming up with better solutions, which involve writing Java servlets that you can hang off your Web server. But that is a topic for another day. Have fun!

Pat Durante jest starszym inżynierem oprogramowania w TASC, Inc. w Reading, MA. TASC to firma informatyczna o wartości 100 milionów dolarów, która specjalizuje się w opracowywaniu i integracji zaawansowanych systemów i usług informatycznych. Pat zajmuje się projektowaniem aplikacji obiektowych od czterech lat. Jest liderem Object Oriented Special Interest Group w TASC i współzałożycielem Java Interest Group TASC. Adres witryny internetowej Pata to: //members.aol.com/durante.

Dowiedz się więcej na ten temat

  • Informacje na temat Common Gateway Interface (CGI) można znaleźć pod adresem:

    //hoohoo.ncsa.uiuc.edu/cgi

  • Układ Jigsaw Konsorcjum World Wide Web jest opisany pod adresem:

    //www.w3.org/pub/WWW/Jigsaw

  • Więcej informacji na temat Sun's Jeeves:

    //www.javasoft.com/products/jeeves/index.html

Artykuł „Pisz programy CGI w Javie” został pierwotnie opublikowany przez JavaWorld.