サーバーサイドJavaの使用を開始する方法

サーバーサイドJava(SSJ)は、サーブレットまたはサーバーサイドアプレットと呼ばれることもあり、Common Gateway Interface(CGI)と、NetscapeのNSAPIやMicrosoftのISAPIなどの低レベルのサーバーAPIプログラミングの強力なハイブリッドです。

この記事では、Netscapeがサーバー側アプレット(SSA)と呼ぶサーバー側JavaのNetscape実装の概要と手順を説明します。

SSAはCGIスクリプトのように機能します。Webページ(通常はHTML形式)を受信getしてpost要求し、返しますが、SSJはNSAPI / ISAPIのようにサーバーに動的にロードされます。これにより、CGIに期待される起動遅延がなくなります。また、SSJは、データベースへのオープン接続を維持するなど、実行間でその状態の一部を維持できます。

SSAは独自のサンドボックスで実行され、Javaに期待されるセキュリティを提供します。たとえば、アプレットがクラッシュしても、NSAPI / ISAPIプログラミングで発生する可能性があるようにサーバー全体がクラッシュすることはありません。この追加されたセキュリティにより、クライアント側のJavaアプレットがクライアントで実行するためにダウンロードされるのと同じように、サーバーで実行するためにアプレットをアップロードすることもできます。

おそらく、SSAの最も重要な側面は、Javaで記述されているため、本質的にプラットフォームに依存せず、オブジェクト指向であるということです。

歴史

Netscape FastTrack2.0およびEnterprise2.0サーバー、JavaSoftのJava Webサーバー(以前はJeevesと呼ばれていました)、World Wide WebコンソーシアムのJigsaw、WebLogicのT3Server、OracleのWebサーバー、Peak TechnologiesのExpressOなど、サーバー側のJavaをサポートするサーバーが増えています。これらのサーバーはそれぞれ異なるサーバー側JavaAPIを使用するため、開発者は使用するサーバーごとに異なるプログラムを作成する必要があります。

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は2種類のスラッシュを同じように扱います。)可能であれば、デフォルトのappletディレクトリを使用します。デフォルトを使用するのではなくカスタマイズする場合は、サーバールートの下のどこかにディレクトリを選択し、すべてのファイルをデフォルトの場所からカスタムの場所にコピーするようにしてください。変更を保存して適用します。変更が有効になるように、必ずサーバーを停止して再起動してください。

実験する時間です!

この時点で、Netscapeが提供するアプレットを試すことができるはずです。ブラウザで// servername / server-java / FormApplet?abc = xyz&123 = 789を指定します。フォームアプレットによって処理され、HTMLで返される「get」データが表示されます。

サーバーエラーが発生した場合は、サーバーのエラーログ(/ usr / ns-home / httpd-hostname / logs / errorsまたはC:\ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ errors)を確認してください。Javaインタープリターを起動できないと表示されている場合、考えられる原因は、CLASSPATHがNetscapeを混乱させていることです。CLASSPATHのない環境でサーバーを起動してみてください。

試してみるもう1つのアプレットは、// servername / server-java / Connectです。//www.meer.net/barn/index.htmlをロードして表示する必要があります。Connectアプレットは、ページをフェッチするためにソケット接続を確立します。サーバーがファイアウォールの背後にある場合、サーバーエラーが発生する可能性があります。次のステップでは、ファイアウォールがソケットをブロックしたと仮定しましょう。Connectアプレットコードを編集して、別のWebサーバー上の別のページにアクセスします。

Connect.javaファイルは、「Javaアプレットディレクトリ」にあります。(以下にもあります。)最初にnetscape.server.applet。*をインポートします。

インポートnetscape.server.applet。*; 

このパッケージには、サーバー側アプレットを開発するための基本的なクラスが含まれています。このパッケージで最も重要なクラスはHttpApplet、すべてのサーバー側アプレットのスーパークラスです。 Connect(下記)でわかるように、サーバー側アプレットが実装する必要がある唯一のメソッドはrunメソッドです。このメソッドは、アプレットが「ヒット」を受け取るたびに呼び出されます。runConnectのメソッドは、出力をクライアントにリダイレクトする前に、「ホスト」へのソケットを開き、「要求」をフェッチします。 「host」変数を変更して、Webサーバーから見えるマシンを参照するようにします。また、「request」変数を変更して、新しい「ホスト」のページを参照するようにします。

インポートnetscape.server.applet。*;インポートjava.io.PrintStream;インポートjava.io.InputStream;インポートjava.io.OutputStream;インポートjava.io.DataInputStream;インポートjava.net.Socket; class Connect extends HttpApplet {public void run()throws Exception {String host = "www.meer.net"; //このintポートを変更= 80;文字列リクエスト= "GET /barn/index.html HTTP / 1.0 \ n"; //これもSockets = new Socket(host、port); OutputStream os = s.getOutputStream(); PrintStream op = new PrintStream(os); op.println(request); InputStream is = sam(); DataInputStream di = new DataInputStream(is);文字列行; if(returnNormalResponse( "text / html")){PrintStream out = getOutputStream(); out.println( "&lth1&gtData on" + host + "port" + port + ""); out.println( "リクエスト:" + request + "
   
"); while((line = di.readLine())!= null)out.println(line);}}}

「ホスト」と「リクエスト」を変更したら、次のステップはConnectを再コンパイルすることです。

Windowsでは、serv2_0.zipを含むようにクラスパスを設定して標準のjavacコンパイラを使用します。javac -classpath ..\classes\serv2_0.zip Connect.java

Unixでは、NetscapeはJavaアプレットディレクトリの上のディレクトリにJavaコンパイラ(javac)を提供します。このjavacは、実際にjava sun.tools.javac.Mainはコンパイルを実行するために呼び出すスクリプトです。一部のシステムでは、sun.tools.javac.Mainコンパイラはなどの新しい1.1 JDKメソッドを使用します。これは、1.1JDKを使用java.lang.Character.isJavaLetterOrDigit()しない開発者にとってはかなりの問題を引き起こす可能性があります。完全に優れた代替手段は、常に使用している標準のjavacコンパイラを使用することですjavac -classpath ../classes/serv2_0.zip Connect.java。提供されているjavacスクリプトを使用する場合は、「javac」を「../javac。」に置き換えてください。

このコンパイル中に、次のようなエラーが表示される場合があります。

Connect.java:1:パッケージnetscape.server.appletがインポートに見つかりません。インポートnetscape.server.applet。*; ^ 1エラー

このエラーは心配する必要はありません。クラスファイルは正常に作成され、正常に実行されます。importステートメントでワイルドカードを削除すると、このエラーを回避できます。

Unixでは、Netscapeはアプレットのコンパイルを処理するために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 / Connectページをリロードした場合でも、「バーン」ページが表示されます。これは、Javaクラスが開始時にobj.confファイルのinit関数を介してサーバーにロードされるためです。新しい変更をロードするには、サーバーを停止してから再起動する必要があります。一部のシステムでは、サーバーマネージャーを使用して停止と開始を行う必要があります。コマンドラインを再起動すると、後続のアプレット要求で「サーバーエラー」が発生することがあります。サーバーを停止して起動したら、Connectアプレットを再試行してください。Netscapeは、選択したページを表示するために新しいConnectコードをロードしているはずです。

APIについて真剣に考えましょう

おめでとう!これで、最初のサーバー側Javaコードをコンパイルしてテストしました。次に、使用可能ないくつかの方法を示します。

次の方法を使用すると、作業の大部分を実行できます。

PrintStream getOutputStream()はIOExceptionをスローします。 

を返しPrintStreamます。これを使用して、クライアントへの応答を出力できます。を置き換えSystem.outます。

ハッシュテーブルgetFormData()はIOExceptionをスローします。 

HTTPリクエストの名前と値のペアを格納するハッシュテーブルを返します。値の文字列は、URIエンコードされた形式からデコードされます。IOExceptionフォームデータがない場合はをスローします。

String getFormField(String fieldName)はIOExceptionをスローします。 

getFormField1つのフィールドのみを取得するために使用できます。IOExceptionフォームデータがない場合もスローします。

boolean returnNormalResponse(String contentType)はIOExceptionをスローします。 

パラメータで指定したコンテンツタイプを設定してHTTP応答を開始します。これが「get」または「post」リクエストの場合はtrueを返し、「head」リクエストの場合はfalseを返します。

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

HTTP応答を開始して、エラーを報告します。これは、コンテンツタイプ、ステータス(HttpApplet.BAD_REQUEST標準エラーコード400を表すなど)、およびエラーの理由を示すオプションの文字列を取ります。

サーバー側アプレットの開発に使用できる方法は他にもたくさんあります。Netscapeは、サーバーとともにAPIガイドをインストールします。このガイドは、Unixの/usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htmまたはC:\ Program Files \ Netscape \ Server \ bin \ httpd \ admin \ html \にあります。 Windowsではmanual \ pg \ javapi.htm

"こんにちは世界"

それでは、(ご想像のとおり)HelloWorldサーバー側アプレットを作成するために学んだことをすべて使用してみましょう。次のアプレットはWorldtargetフィールドが指定されていない限り、こんにちはと言っています。

インポートnetscape.server.applet.HttpApplet;インポートjava.io.IOException;インポートjava.io.PrintStream; class Hello extends HttpApplet {/ *デフォルトでは、「世界」にhelloと言います* / String helloTarget = "World"; / * run()はリクエストを処理するために呼び出されます* / public void run()throws Exception {/ * getOutputStream()を使用するとクライアントと通信できます* / PrintStream out = getOutputStream(); / * getFormField()を使用して、*「World」以外の誰かに挨拶するかどうかを確認します。 * /文字列formTarget = null; {formTarget = getFormField( "target");を試してください。 if(formTarget!= null){helloTarget = formTarget; }} catch(IOException e){/ *「クエリ文字列の欠落」によって引き起こされた例外は無視します* / if(!e.getMessage()。startsWith( "クエリ文字列の欠落")){handleException(e、out) ;}} / *こんにちはと言ってください* / 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){} //元の例外を出力しようとしますout.print( "&lth1>"); out.print(e); out.print( "\ n"); out.print( "&ltpre>"); e.printStackTrace(out); //代替のPrintStreamを指定する必要がありますout.print( "PrintStream out){try {returnErrorResponse( "text / html"、SERVER_ERROR、 "Exception thrown"); } catch(IOException ioe){} //元の例外を出力しようとしますout.print( "&lth1>"); out.print(e); out.print( "\ n"); out.print( "&ltpre>"); e.printStackTrace(out); //代替のPrintStreamを指定する必要がありますout.print( "PrintStream out){try {returnErrorResponse( "text / html"、SERVER_ERROR、 "Exception thrown"); } catch(IOException ioe){} //元の例外を出力しようとしますout.print( "&lth1>"); out.print(e); out.print( "\ n"); out.print( "&ltpre>"); e.printStackTrace(out); //代替のPrintStreamを指定する必要がありますout.print( "
"); return;}}

このサーバー側アプレットはnetscape.server.applet.HttpAppletからサブクラス化されrun()、Netscapeの下のすべてのサーバー側アプレットと同じようにメソッドをオーバーライドします。を呼び出すとgetOutputStream、出力ストリームをすばやく取得します。これを使用して「Hello」を出力します(または失敗の理由を出力するために使用します)。getFormField使用する代替ターゲットがあるかどうかを確認するために呼び出し、通常の「text / html」応答を返し、最後に「Hello」を印刷する実際の作業を実行します。returnNormalResponse()呼び出しからの戻り値をチェックし、falseを返しても何もしないことに注意してください。これを行わないと、headリクエストに対してもデータが返されます。