のように入力して起動させることは、この講座のセクション5 アプレットとアプリケーション(段階1)のA Javaのアプリケーションとは何かで触れました。しかし、インターネットを利用する一般のユーザーの方がある特定のサーバー上のアプリケーションを、遠く離れたそれぞれの人のブラウザ上からコマンドラインを使って起動させることはできません。そこで、遠く離れた場所からアプリケーションを起動させる方法としてサーブレットを使うということになる訳です。
サーブレットは、それぞれの別の場所のブラウザからサーブレットが置かれている場所を指定して、全く別の場所にあるサーバーコンピュータ上のプログラムを起動させることができます。そして、そのサーバー上で複雑な処理をさせ、再び指示を発した遠く離れたブラウザにその結果を戻したり、或いはサーバー上に様々な
処理の結果を残すことができます。
さて、アプレットでGUIにパネルを配置し、そのパネルの中にボタンを一つ表示させるにはどのように書けばよいのでしょうか。もう既に説明しましたが、アプレットで書くと次のようになります。
public class Frametest extends Applet
{
Button b1;
Panel p1;
public void init( )
{
setBackground(Color.yellow);
p1 = new Panel( );
b1 = new Button("ボタン1");
p1.add(b1);
add(p1);
}
}
しかし、ここで紹介するアプレットはJDK1.4のバージョンを使いコンパイルしているので、ブラウザにJDK1.4のアプレットのインタプリタがプラグインされていないと見ることができません。そこでJDK1.4のコンパイラをプラグインしていない人のためにjpg形式の画像をここにリンクして、実際の様子を表示しておきます。

2) 実際にアプリケーションで部品を表示する
次に実際にインスタンスの作り方を考えます。上に示したアプレットと全く同じGUIをアプリケーションでプログラムすると次のとおりになります。
public class Frametest1 extends Frame ・・・・・A
{
Button b1;
Panel p1;
Frametest1( ) ・・・・・B
{
p1 = new Panel( );
b1 = new Button("ボタン1");
p1.add(b1);
add(p1,"North"); ・・・・・C
setBackground(Color.yellow);
setTitle("フレームのテスト"); ・・・・・D
setSize(300, 100); ・・・・・E
}
public static void main(String arg[ ]) ・・・・・F
{
Frametest1 ftest1 = new Frametest1( ); ・・・・・G
ftest.show( ); ・・・・・H
}
}

この画像はjpg形式のものでプログラムの実行結果をお見せするためのものですから、その点は勘違いしないようにしてください。
このプログラムはフレームと、そこに配置された部品を表示するだけのもので、プログラムを閉じることすらできません。しかし、アプリケーションとしてFrameクラスのftest1というフレームを表示することができます。とじることができませんから、プログラムを閉じるときにはMS-DOSのコンソールをアクティブにしてCtrlキーを押しながら、アルファベットの文字キーのCキーを押してください。そうすればプログラムを終了させることができます。
さて、アプリケーションとはなんとも不便なものと思ってもらっては困ります。後はアプレットのときに使った文法に従えばどんなことでもさせることができます。
このプログラムを口頭で説明するとすれば「Frameクラスを継承したFrametest1クラスのインスタンスFrametest1( )を作り、main( )メソッドを使いFrametest1クラスのオブジェクトftest1をshow( )メソッドで呼び出す」ということになると思います。
次にこのプログラムを具体的に説明すると以下のとおりになります。
@行目でButtonとかPanel等の部品を取り扱うためのawtパッケージというものをimportします。これについては、後でもう少し説明しますが、基本的にはアプレットの考え方と全く同じです。
A行でここで作るFrametest1クラスにFrameクラスを継承して、Frameクラスの機能をそっくり引き継ぎます。この継承の考え方はJavaの最も基本となる考え方ですから、もしよく分からなければこの講座のセクション19 Javaのオブジェクト指向を考える(段階14)を徹底的に見直してください。
B行でFrameクラスの機能を引き継いだFrametest1クラスのインスタンス(実体とか実例)をFrametest1( )と定めます。そして{ }の中にそのインスタンスの具体的な構造を記します。
C行は、Frameクラスの場合はデフォルトのレイアウトはBorderLayoutなので、アプレットと同じ位置にパネルを配置するにはこのようにしてやります。このようなJavaのレイアウトについては、この講座のセクション8 アプレットのレイアウトを考える(段階4)の@ 部品のレイアウトを工夫する。で詳しく説明してありますので、それを参照してください。
D行でフレームにタイトルを入れることができます。
E行でフレームのサイズを決めます。
このDとEについては、アプレットではHTMLファイルの方で指定しますが、アプリケーションではHTMLファイルは使いませんので、プログラムの中で決めることになります。
F行はアプリケーションを実行するときのいつものやり方です。
G行で、Frametest1のオブジェクトftest1を作り、
H行で、show( )メソッドで実際に表示します。
次に同じプログラムをアプレットとアプリケーションで分かり易くするため、HTMLファイルで作ったフレームを使って比較してみます。
この二つのコードを比較すると、アプレットとアプリケーションの違いがよく分かることと思います。
このFrametest1クラスとftest1というフレームをアプリケーションで表示させる話は以上ですが、それにしてもGUIでこのクラスを終了できないのは不便極まりないと思います。そこでこのプログラムを若干改良し、GUI上でButtonをクリックすれば閉じるようにしてみます。そして始めはアプリケーションとして実行できるように考えますが、それができたらサーブレット上で実行させるにはどうすればよいかという方向に発展させたいと思います。
FrameにButtonを配置し、クリックするとFrameが閉じるという考え方は、この講座ではセクション7 四則の演算をする(段階3)B 入力の窓を持った計算ソフト(整数)のところでふれた内容と基本的には同じです。必要な部品は、Buttonクラスを用いてクリック用のボタンを作ることと、そのボタンをクリックしたときにプログラムを閉じるというeventを実行させることが必要になります。このとき用いる部品であるButton等々は、JavaのGUIのツールキットであるAWT(Abstract Windows Toolkit)で提供されています。これを直訳すれば、抽象的窓口表示用道具セットということになりますが、このAWTにはJavaで使うGUIの様々な部品のクラスがパッケージとして組み込まれています。従ってJavaのGUIの部品クラスを使用するときは、アプレットであれアプリケーションであれ、さらにはサーブレットであっても全てプログラムの冒頭に
public class Frametest2 extends Frame implements ActionListener ・・・・・@
{
Button b1;
Panel p1;
Frametest2( )
{
p1 = new Panel( );
b1 = new Button("閉じる"); ・・・・・A
b1.addActionListener(this); ・・・・・B
p1.add(b1);
add(p1,"North");
setBackground(Color.yellow);
setTitle("フレームのテスト");
setSize(300, 100);
}
public void actionPerformed(ActionEvent ae) ・・・・・C
{
if(ae.getSource( ) == b1) ・・・・・D
{
System.exit(0); ・・・・・E
}
}
public static void main(String arg[ ])
{
Frametest2 ftest2 = new Frametest2( );
ftest2.show( );
}
}
このプログラムをいつものとおりjavacでコンパイルし、javaで実行するとアプリケーションのFrametest1と見た目は全く同じ実行結果になります。しかし、実際にやってみれば分かるでしょうが、閉じるボタンをクリックすればこのFrametest2クラスは終了し、閉じるようになっています。是非皆さんが自身のコンピュータを使って、ここでお話したことを実際にやってみて試してください。
さて、いよいよアプリケーションをサーブレットプログラムに組み込み、サーバー上で実行させるという試みのところまでやってきました。今まではアプリケーションとして取り扱ってきたプログラムであるFrametest2.classのフレームを、クライアントからの指示に基づき、サーバー上で実行してみることにします。
3) サーブレット上でFrametest2.classのフレームを表示させる。
今までのアプレットやアプリケーションは、処理を要求するクライアントと、その要求を実行する実行環境が同一のパソコン等にありました。しかしサーブレットでは、処理を要求するクライアントと、その要求を実行する実行環境が全く別のところにあります。これを分かり易く図示すると次のようになります。

b) アプリケーションの場合

c) サーブレットによるアプリケーションの実行の場合

c)のサーブレットによるアプリケーションの実行を見ても分かるように、サーブレットを利用すれば、Javaのアプリケーションをサーバー上で実行することができます。そのための手段としては、先ずクライアント側からサーバーに対して何らかのパラメータを送ってやり、サーブレットプログラムを起動してやります。その時、そのサーブレットプログラムの中に必要なアプリケーションを組み込んでおいてやればよい訳です。
この方法は最も基本的な方法ですが、クライアント(ブラウザ)とサーバー上のサーブレットに組み込まれたアプリケーションプログラムの実行が可能です。
この一連の処理の実行環境としては、クライアント側にはパラメータを渡せるようにしたHTMLのドキュメントに<Form>タグを使って、例えばテキストフィールドを準備します。そして、サーバー側にはセクション18 Javaのサーバー機能とサーブレット(段階13)の A 最も易しいカウンタプログラム 3)JSDKを利用するで説明した方法で、あなたのパソコンにサーブレットランナー(servletrunner)を実行しておきます。その他の、これから作成するサーブレットプログラムのコンパイルやコンパイル後のクラスファイルの置き場所、HTMLドキュメント内で呼び出すサーブレットクラスの場所の指定等は、3) JSDKを利用するで説明した方法と全く同様です。
★ サーブレット起動用のFormを作る
それでは、サーバー上に置かれているサーブレット起動用のHTMLドキュメントを考えてみます。このドキュメントは、インターネットに接続しているサーバーであればどこに置かれていても構いません。HTMLドキュメントの中に、今、自分が呼び出したいサーブレットクラスのインターネット上のアドレスをしっかりと指定してやればよいということです。(・・・これはCGIではどうなんでしょうか。私はCGIは詳しくないのでよく分からないのですが、CGIでも利用するCGIの置き場所さえしてやれば、呼び出し用のHTMLドキュメントはどのサーバーに置こうと構わないんでしょうか?・・・多分構わないのでしょうが、誰か詳しい方がいたらお教えください。E-mail:kogasaki@mb.infoweb.ne.jp)
しかし、サーブレットがCGIとはっきり違うところは、そのサーブレットが置かれているクラスは常時動作しているということです。そうした意味ではこれから利用する上でサーブレットは非常に便利です。
ではとりあえず、次にサーブレット起動用のHTMLドキュメントをFrametest3.htmlという名前で作ってみます。特に注意することは、文字コードをcharset=iso-2022-jpと指定することと、このHTMLドキュメント自体をJISコードで作成するという点です。これは、前にも説明していますが、サーブレットエンジンにJSDK2.0を使っているため、JISコードで構成する必要があるためです。
<Font Size=4>次のフォームにあなたの名前を入力してみて!!</Font><P>
<form method="POST" action="http://127.0.0.1:8080/servlet/Frametest3">
あなたの名前(アルファベットで入力してください。):<input type="TEXT" name="your"><P>
<input type="submit" value="入力OK!"> <input type="reset" value="リセット"></form></center>
</body>
</html>
皆さんは、サーブレットランナーを使いバーチャルサーバーを使っていますが、このフォームは、私のapacheサーバー上のサーブレットのデーモン(常に動作しているサーバー用プログラム)Jservでパラメータを受け取りますのでactionの指定先action="htto://www.e-asu.com/servlets/Frametest3としています。この点だけは違っていますが、後は全て同じです。
★ フレームを実行するサーブレットプログラム
そしてフレームを実行する肝心のサーブレットプログラムのコードは、一例として次のように書くことができます。このプログラムは、テキストフィールドにあなたの名前でも何でも構いません。入力してボタン入力OK!をクリックし、パラメーターがサーバー上のFrametest3.classに届くと、このFrametest3.classクラスがJserv上で実行され、サーバー上にフレームを表示させます。このフレームは、サーブレットランナーを使って実行しているバーチャルサーバー上では同一のパソコン等で直接見ることができますか、通常のインターネット上では、クライアント側からは直接確認することはできません。しかし、クライアントのブラウザからどんなに遠く離れた場所にあるサーバーでも、サーブレットの実行環境上にこのクラスファイルが置かれていれば、フレームを確実に表示させることができます。
public class Frametest3 extends HttpServlet
{
String namae, your;
Frametest2 frt2;
/*public void init(ServletConfig conf) throws ServletException ・・・・・@
{
}*/ ・・・・・A
public void doPost( HttpServletRequest req, HttpServletResponse res )throws ServletException, IOException
{
frt2 = new Frametest2( ); ・・・・・B
frt2.show( ); ・・・・・C
res.setContentType("text/html;charset=ISO-2022-JP"); ・・・・・D
PrintWriter pw = res.getWriter( );
pw.println("
class Frametest2 extends Frame implements ActionListener ・・・・・F
{
Panel p1;
Button b1;
Frametest2( ) ・・・・・G
{
p1 = new Panel( );
b1 = new Button("Frameを終了");
b1.addActionListener(this);
p1.add(b1);
add(p1, "South");
setTitle("フレームのテスト");
setSize(300, 200);
} ・・・・・H
public void actionPerformed(ActionEvent ae) ・・・・・I
{
if(ae.getSource( ) == b1)
{
dispose( ); ・・・・・J
}
}
}
電話及びFAX:047-362-1143(斉藤信之)
電話・FAXでの問合せに関するお願い…問合せはなるべくE-Mailを使うようにお願いします。
状況によりE-Mailではうまく問合せができないとき等で電話やファックスを使用して問合せる時は、P.M.8時から11時迄にお願いします。
住所:〒271-0068 千葉県松戸市古ヶ崎 2-3231-7