[目次] [その4] [その6]

Javaによるオブジェクト指向プログラミング (その5)

前回の練習・宿題について

まず、ウィンドウを閉じる操作がされた際に、プログラムの実行を終了するには、
public void windowClosing(WindowEvent e) {
	System.exit(0);
}
のように、メソッドwindowClosing()を変更すれば良い。

その他のイベントをとらえて表示するには、

public void windowActivated(WindowEvent e) {
	System.err.println(e);
}
のように変更する。これを windowClosed(), windowDeactivated(), windowDeiconified(), windowIconified(), windowOpened() についても行なえば良い。

次にラベルをいくつも並べるというのは、以下のプログラムのように main()メソッドを変更する。

public static void main (String args[]) {
	TestWin f = new TestWin("Test Window");
	GridLayout g = new GridLayout(2, 2);
	f.setLayout(g);
	f.add(new Label("Third"));
	f.add(new Label("Forth"));
	f.add(new Label("Fifth"));
	f.add(new Label("Sixth"));
	f.setLocation(100, 200);
	f.pack();
	f.show();
}
この例ではGridLayoutのインスタンスを縦2、横2の大きさを指定して生成し、 setLayout()している。それからadd() でラベルを追加して いっている。

ボタンを単に追加してみる練習については省略。「終了」ボタンを追加する分は、 まず文字列「Quit」であれば終了するようにメソッド actionPerformed() を次のように変更する。

public void actionPerformed (ActionEvent e) {
	String s = e.getActionCommand();
	if (s.equals("Quit")) {
		System.exit(0);
	} else {
		System.err.println(s);
	}
}
次にmain()メソッドで終了用のボタンを追加するように、例えば次のように 変更する。
public static void main (String args[]) {
	TestWin f = new TestWin("Test Window");
	GridLayout g = new GridLayout(3, 1);
	f.setLayout(g);
	f.add(new Label("This is Label."));
	Button b = new Button("Click Me");
	b.addActionListener(f);
	f.add(b);
	b = new Button("Quit");
	b.addActionListener(f);
	f.add(b);
	f.setLocation(100, 200);
	f.pack();
	f.show();
}
次に TextField を組み込む練習&宿題については次のようになる。
  1. まず、メソッドactionPerformed()については、まず equals()で比較している文字列を"q"に変更する。
  2. メソッドmain()でTextField を以下のように追加する。(ここ では TextFieldを作成する時に桁数のみを指定している。)
    public static void main (String args[]) {
    	TestWin f = new TestWin("Test Window");
    	GridLayout g = new GridLayout(2, 1);
    	f.setLayout(g);
    	f.btn1 = new Button("q");
    	f.btn1.addActionListener(f);
    	f.add(f.btn1);
    	f.txt1 = new TextField(20);
    	f.txt1.addActionListener(f);
    	f.add(f.txt1);
    	f.setLocation(100, 200);
    	f.pack();
    	f.show();
    }
    
  3. 上記のbtn1, txt1はクラス定義冒頭でpublicなフィー ルドとして宣言しておく。また、同様にcalcというフィール ドもpublic として宣言しておき、上のmain()の中で RpnCalcのインスタンスを生成して代入しておく。
  4. actionPerformed()を以下のように修正する。
    public void actionPerformed (ActionEvent e) {
    	String s = e.getActionCommand();
    	if (s.equals("q")) {
    		System.exit(0);
    	}
    	if (e.getSource() == txt1) {
    	    try {
    		calc.push(new Float(txt1.getText()));
    	    } catch (NumberFormatException e) {
    		System.err.println(e);
    	    }
    	}
    }
    
  5. 以下略

サーブレット・プログラミング

今回から WWW のサーバサイド・プログラミングの一種である Java サーブレッ トについて簡単な例題を実行してみる。

avalonではユーザが自分の作成したサーブレットを簡単に実行できる 仕組みを用意している。それを使用する場合は、以下のページを参照して前もっ て(少なくとも前日に)準備すること。

avalon においてサーブレットを実行する方法

また、サーブレット関係ドキュメントは[こちら]に 準備しているので、詳細はそちらを参照すること。なお、今回用いるサーブレッ トの環境は第2.0版のものであり、かなり古い規格ではあるが、一通りの機能を 使ってみることが可能である。

単純なサーブレットの例

以下は、サーブレットの実行環境に付属していたサンプルプログラムである。
     1|	import java.io.*;
     2|	
     3|	import javax.servlet.*;
     4|	import javax.servlet.http.*;
     5|	
     6|	/**
     7|	 * This is a simple example of an HTTP Servlet.  It responds to the GET
     8|	 * and HEAD methods of the HTTP protocol.
     9|	 */
    10|	public class Hello extends HttpServlet
    11|	{ 
    12|	    /**
    13|	     * Handle the GET and HEAD methods by building a simple web page.
    14|	     * HEAD is just like GET, except that the server returns only the
    15|	     * headers (including content length) not the body we write.
    16|	     */
    17|	    public void doGet (HttpServletRequest request,
    18|	                       HttpServletResponse response) 
    19|	        throws ServletException, IOException
    20|	        {
    21|	            PrintWriter out;
    22|	            String title = "Example Apache JServ Servlet";
    23|	
    24|	            // set content type and other response header fields first
    25|	            response.setContentType("text/html");
    26|	
    27|	            // then write the data of the response
    28|	            out = response.getWriter();
    29|	            
    30|	            out.println("<HTML><HEAD><TITLE>");
    31|	            out.println(title);
    32|	            out.println("</TITLE></HEAD><BODY bgcolor=\"#FFFFFF\">");
    33|	            out.println("<H1>" + title + "</H1>");
    34|	            out.println("<H2>Congratulations, ApacheJServ 1.1.2 is working!<br>");
    35|	            out.println("</BODY></HTML>");
    36|	            out.close();
    37|	        }
    38|	}
doGet()メソッドは HTTP の GET メソッドでこのサーブレットが指定 された際に呼び出される。HTTP のリクエストは第1引数に、レスポンス生成用の オブジェクトは第2引数に渡される。

サーブレットはコンパイルしたあとあるタイミングでサーブレットエンジンに読 み込まれた際にインスタンスが生成され、ブラウザからのリクエストに応じてメ ソッドが呼び出される。

練習

このプログラムを入力して、実行せよ。なお、publicクラスとして宣 言しているので、ソースプログラムは「クラス名.java」というファイ ル名にする必要がある。ブラウザで確認できたら、println()の引数の 文字列を変更してみて、再度コンパイルし、ブラウザで再読み込みしてみよ。

日本語を表示する際は、25行目を以下のように変更すること(もし、古いブラウ ザでうまく表示できない場合は、「UTF-8」の部分を 「EUC-JP」もしくは「ISO-2022-JP」にすれば良い)。

response.setContentType("text/html; charset=UTF-8");

宿題

クラスRpnCalcのクラスファイルを上のサーブレットのサンプルと同じ ディレクトリにコピーし、上のdoGetメソッド内でインスタンスを生成 して、例えば「1.2 + 3.4」の計算結果を表示してみよ。なお、計算する値は定 数でプログラム中に記述して良い。
[目次] [その4] [その6]
This page is written by <saka@ulis.ac.jp>.
2003年 1月15日 水曜日 21時14分37秒 JST