JavaでCGIプログラムを書く

Common Gateway Interface(CGI)は、Webサーバーを介してWebブラウザーを実行しているクライアントと対話できるプログラムを作成するための標準です。これらのプログラムを使用すると、Web開発者はブラウザを介して動的な情報(通常はHTML形式)を配信できます。CGIプログラムは、Javaを含め、Webサーバーで実行できる任意の言語で記述できます。CGIプログラムは通常、検索エンジン、ゲストブックアプリケーション、データベースクエリエンジン、インタラクティブユーザーフォーラム、およびその他のインタラクティブアプリケーションをWebサイトに追加するために使用されます。

非常に基本的な用語では、CGIプログラムは、送信された情報を解釈し、何らかの方法で情報を処理し、クライアントに返送される応答を生成する必要があります。

CGIプログラムへの入力のほとんどは、環境変数を介してプログラムに渡されます。この記事では、これらの環境変数をJavaCGIプログラムに送信する方法を示します。残りの入力(存在する場合)は、プログラムで直接読み取ることができる標準入力としてCGIプログラムに渡されます。

処理は、ファイルに情報を追加するのと同じくらい単純な場合もあれば、データベースからデータを要求するのと同じくらい複雑な場合もあります。

CGIプログラムは無数のドキュメントタイプを返す可能性があるため、CGIプログラムは、生成された情報をクライアントが解釈する方法を認識できるように、出力に短いヘッダー(ASCIIテキスト)を配置する必要があります。最も一般的には、CGIプログラムはHTMLを生成します。以下に、HTMLの適切なヘッダーを生成する関数を含む関数のライブラリを示します。ヘッダーに続いて、CGIプログラムは出力の本文をネイティブ形式で生成するだけです。

CGI環境をJavaプログラムに渡す

問題を理解すれば、JavaでCGIプログラムを作成するのはかなり簡単です。何よりもまず、Javaプログラムの実行を別のスクリプト内にラップする必要があります。したがって、Webサーバーで呼び出される実際のスクリプトは、UnixシェルスクリプトまたはWindowsバッチファイル(または同等のもの)であり、CGI環境変数をJavaプログラムに渡すだけです。

Javaは環境変数に直接アクセスするメソッドを提供しなくなったため(このSystem.getenv()メソッドはJDKの最新リリースでは無効になっています)、Javaインタープリターの-Dコマンドラインパラメーターを使用して各CGI環境変数をJavaプログラムに渡すことを提案します。 。以下に-Dパラメータの使用方法を示します。

以下に提供する関数のライブラリは、上記のアプローチを使用したことを前提としています。System.getProperty()メソッドを使用して、これらのコマンドラインパラメータにアクセスします。プログラムでCGI環境変数のいずれかを使用する必要がある場合は、同じ方法でそれらにアクセスできます。たとえば、SERVER_NAME環境変数にアクセスする場合は、次のようにアクセスできます。

 文字列server_name = System.getProperty( "cgi.server_name"); 

すべてのCGI環境変数をJavaプログラムに渡しいないことに注意してください。私は主要なものだけを通過しています。読者の練習問題として、他の人を含めることはお任せします。

次の例は、と呼ばれるhello.cgiJavaプログラムを呼び出すと呼ばれるUnixスクリプトファイルを示していますhello。-Dコマンドラインパラメータは、CGI環境変数をJavaプログラムに渡すことに注意してください。

#!/ bin / sh java -Dcgi.content_type = $ CONTENT_TYPE -Dcgi.content_length = $ CONTENT_LENGTH -Dcgi.request_method = $ REQUEST_METHOD -Dcgi.query_string = $ QUERY_STRING -Dcgi.server_name = $ SERVER_NAME -Dcgi.server_port = $ SERVER_PORT- Dcgi.script_name = $ SCRIPT_NAME -Dcgi.path_info = $ PATH_INFO hello 

このソリューションは、コマンドラインで許可される文字数に制限がある可能性があるため、Windows95およびNTプラットフォームではうまく機能しません。別のアプローチは、各環境変数とそれに関連する値を一時ファイルに書き込むことです(もちろん、一意のファイル名を使用します)。次に、このファイルの名前をJavaプログラムに渡して、そのファイルを読み取らせ、環境変数と値のペアを解析することができます。使い終わったら、一時ファイルを削除することを忘れないでください!繰り返しますが、この演習は読者に任されています。

JavaCGIライブラリ

CGI入力を処理するという面倒な作業を簡単にするために、私はJavaクラス(実際には関数のライブラリ)を作成しました。これを利用して、汚い作業の一部を削減できます。このライブラリは、非常に人気のあるPerlcgi-lib.plライブラリの機能を複製しようとします。以下のコードは、javadocスタイルのコメントを使用して文書化したため、コードから直接HTML文書を生成できます。(javadoc cgi_lib.java生成に使用しますcgi_lib.html。)

ライブラリのソースコードとドキュメントは次のとおりです。

最初のJavaCGIプログラムの作成

これは、cgi_lib.javaライブラリを使用してCGIプログラムを作成する方法を示す例です。「HelloThere」フォームを処理する簡単なプログラムを作成します。この単純なフォームは、ユーザーに名前と電子メールアドレスの入力を求めます。hello.html処理するフォーム()は次のとおりです。

&ltHTML>&ltHEAD>&ltTITLE&gtこんにちは、ようこそ!&ltBODY>&ltH1 ALIGN = CENTER&gtHello and Welcome&lthr>&ltFORM METHOD = "POST" ACTION = "/ cgi-bin / hello.cgi">あなたの名前は何ですか?&ltINPUT TYPE = "text" NAME = "name">&ltp>あなたのメールアドレスは何ですか?&ltINPUT SIZE = 40 TYPE = "text" NAME = "email">&ltINPUT TYPE = "submit" VALUE = "Submit">。&ltP>&lthr>

「HelloThere」フォームを処理するJavaプログラムを書いてみましょう。

まず、プログラムがHTMLを生成することをクライアントに通知する必要があります。のHeader()メソッドcgi_lib.javaは必要な文字列を作成するので、まずそのメソッドをSystem.out.println呼び出し、システムコールを使用して文字列を標準出力に送信します。

////必要なCGIヘッダーを出力します。// System.out.println(cgi_lib.Header());

次に、ブラウザから送信されたフォームデータを処理します。のReadParseメソッドは、cgi_lib.javaすべての作業を実行し、ハッシュテーブルのインスタンスで結果を返します。この場合、フォームデータを解析した後、ハッシュテーブルには2つのキー値が含まれます。1つは「名前」入力フィールドになり、もう1つは「電子メール」入力フィールドになります。これらの各キーに関連付けられている値は、ユーザーが「HelloThere」フォームの入力フィールドに入力した値になります。

////フォームデータをハッシュテーブルに解析します。//ハッシュテーブルform_data = cgi_lib.ReadParse(System.in);

フォームデータを解析したので、送信されたデータを使用して、必要な処理を実行できます。次に、ユーザーのブラウザに送り返すHTMLを生成できます。この単純なプログラムでは、データを処理することはありません。ユーザーから提供された情報をエコーバックするだけです。私たちは、使用しようとしているget私たちは私たちのプログラムで使用できる文字列の中にフォームの値を抽出するために、Hashtableオブジェクトのメソッドを。次の例は、ユーザーがStringオブジェクトに入力した名前を抽出する方法を示しています。

 文字列名=(String)form_data.get( "name"); 

それでは、これをすべて簡単なプログラムにまとめましょう。これは、「HelloThere」フォーム(hello.java)を処理するために使用できるJavaアプリケーションです。

インポートjava.util。*;インポートjava.io. *; class hello {public static void main(String args []){// // cgi_libを使用する最小限のCGIプログラムです//////必要なCGIヘッダーを出力します。 // System.out.println(cgi_lib.Header()); ////フォームデータをハッシュテーブルに解析します。 //ハッシュテーブルform_data = cgi_lib.ReadParse(System.in); ////返されたHTMLページのトップを作成します// 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( "フォームの名前と値のペアは次のとおりです:"); ////ブラウザから送信された名前と値のペアを出力します。 // System.out.println(cgi_lib.Variables(form_data));// // Unixスクリプトから送信された環境変数を出力します。 // System.out.println( "これがCGI環境変数/値のペアです" + "UNIXスクリプトから渡されます:"); System.out.println(cgi_lib.Environment()); // //返されたHTMLページの下部を作成して、きれいに閉じます。 // System.out.println(cgi_lib.HtmlBot()); }}

結論

このJavaでのCGIプログラミングの紹介により、Webアプリケーションのサーバー側をプログラミングするまったく新しい方法に進むことができます。CGIプロトコルは、クライアントブラウザとWebサーバー間の通信方法を1つしか提供しないことに注意してください。World Wide Web ConsortiumのJigsaw(以下の「参考文献」セクションを参照)やSun's Jeevesのような他の企業は、Webサーバーに接続できるJavaサーブレットの作成を含むより優れたソリューションを考案しています。しかし、それは別の日のトピックです。楽しんで!

Pat Duranteは、マサチューセッツ州レディングにあるTASC、Inc。のシニアソフトウェアエンジニアです。TASCは、高度な情報システムとサービスの開発と統合を専門とする0億の応用情報技術企業です。Patは、オブジェクト指向アプリケーションを4年間エンジニアリングしてきました。彼はTASCのオブジェクト指向特別興味グループのリーダーであり、TASCのJavaインタレストグループの共同創設者です。PatのWebサイトアドレスは//members.aol.com/duranteです。

このトピックの詳細

  • Common Gateway Interface(CGI)に関する情報は、次の場所にあります。

    //hoohoo.ncsa.uiuc.edu/cgi

  • World Wide Web Consortiumのジグソーパズルについては、次の場所で説明されています。

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

  • Sun's Jeevesの詳細については、以下を参照してください。

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

このストーリー「JavaでCGIプログラムを書く」は、もともとJavaWorldによって公開されました。