Как да започнем със сървърната Java

Сървърната Java (SSJ), понякога наричана сървлети или сървърни аплети, е мощен хибрид на Common Gateway Interface (CGI) и програмиране на API на сървъри от по-ниско ниво - като NSAPI от Netscape и ISAPI от Microsoft.

Тази статия предоставя въведение и инструкции стъпка по стъпка за внедряването на Netscape на сървърна Java, която Netscape нарича сървърни аплети (SSA).

SSA могат да действат като CGI скрипт. Той получава getи postиска и връща уеб страница (обикновено под формата на 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, Web сървър на Oracle и 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. Трябва да видите данните „get“, обработени и върнати в HTML от аплета Form.

Ако получите грешка в сървъра, проверете регистрационния файл за грешки на сървъра ( / usr / ns-home / httpd-hostname / logs / errors или 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 за достъп до различна страница на различен уеб сървър.

Файлът Connect.java е достъпен в "директорията на аплета Java." (Той също е намерен по-долу.) Той първо импортира netscape.server.applet. *.

импортиране на netscape.server.applet. *; 

Този пакет съдържа основните класове за разработване на сървърни аплети. Най-важният клас в този пакет е HttpAppletсуперкласът за всички сървърни аплети. Както можете да видите в Connect (по-долу), единственият метод, който сървърният аплет трябва да внедри, е runметодът. Този метод се извиква всеки път, когато аплетът получи „хит“. В runметода за свързване открива гнездо на "домакин" и извлича "искане" преди да пренасочите изхода към клиента. Искаме да променим променливата "хост", така че да препраща към машина, видима от нашия уеб сървър. Също така ще искаме да променим променливата „request“, така че тя да препраща към страница на новия „хост“.

импортиране на netscape.server.applet. *; импортиране на java.io.PrintStream; импортиране на java.io.InputStream; импортиране на java.io.OutputStream; импортиране на java.io.DataInputStream; импортиране на java.net.Socket; class Connect разширява HttpApplet {public void run () хвърля изключение {String host = "www.meer.net"; // променяме този int порт = 80; Заявка за низ = "GET /barn/index.html HTTP / 1.0 \ n"; // това също Socket s = нов Socket (хост, порт); 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 на" + хост + "порт" + порт + ""); out.println ("заявка:" + заявка + "
   
"); while ((line = di.readLine ())! = null) out.println (line);}}}

След като направите промените „хост“ и „заявка“, следващата стъпка е да рекомпилирате Connect.

Под Windows използвайте стандартния си компилатор на javac с набора от класове, за да включите serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

Под Unix Netscape предоставя Java компилатор (javac) в директорията над директорията на аплета Java. Този javac всъщност е скрипт, който призовава java sun.tools.javac.Mainда извърши компилирането. В някои системи sun.tools.javac.Mainкомпилаторът използва нови 1.1 JDK методи като java.lang.Character.isJavaLetterOrDigit(), които могат да създадат доста проблеми за разработчиците без 1.1 JDK. Съвършено добра алтернатива е да използвате стандартния компилатор на javac, който винаги сте използвали javac -classpath ../classes/serv2_0.zip Connect.java,. Ако искате да използвате предоставения javac скрипт, просто заменете " javac" с " ../javac."

По време на тази компилация може да видите грешка, която казва:

Connect.java:1: Пакетът netscape.server.applet не е намерен при импортиране. импортиране на netscape.server.applet. *; ^ 1 грешка

Тази грешка не е причина за безпокойство. Файлът на класа се създава нормално и ще работи добре. Можете да избегнете тази грешка, ако премахнете заместващи символи във вашите инструкции за импортиране.

Под Unix Netscape предоставя makefile в директорията на аплета на Java за обработка на компилация на аплети. За съжаление, makefile използва заместващия знак '%', който е разширение 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 / страницата за свързване точно сега, пак ще видите страницата "Barn". Това е така, защото Java класовете се зареждат в сървъра по време на стартиране чрез init функция във файла obj.conf. За да заредите новите промени, трябва да спрете сървъра и след това да го стартирате отново. На някои системи трябва да използвате диспечера на сървърите, за да направите спиране и стартиране. Рестартирането на командния ред понякога води до „Грешка в сървъра“ за последващи заявки за аплети. След като спрете и стартирате сървъра, опитайте отново аплета Connect. Netscape трябваше да зареди новия код за свързване, за да покаже избраната от вас страница.

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("
"); връщане;}}

Този подклас на аплетите от страна на сървъра от netscape.server.applet.HttpApplet и замества run()метода точно както всички сървърни аплети под Netscape. Той бързо получава изходния си поток с извикване getOutputStream, което ще използва за отпечатване на „Hello“ (или за отпечатване на причината за неуспех). Той призовава getFormFieldда провери дали има алтернативна цел, която да се използва, след което връща нормален отговор „text / html“ и накрая извършва действителната работа по отпечатването на „Hello“. Забележете, че проверява връщаната стойност от returnNormalResponse()повикването и не прави нищо, ако върне false. Ако не направите това, ще върнете данни дори за headзаявки.