# サンプルの説明

localhost上での実行のしかた
デバッグモードでの起動
Webアプリケーションの作り方

## localhost上での実行のしかた

- JDK1.3以上をインストールします。
  クラスパスの設定や、インストールが正しく行われているか必要最低限の動作確認をしてください。
  java.sun.com(J2SE)
- Tomcatをインストールします。
  あらかじめ、Tomcatのサンプルを動かして、正しくインストールされていることを 確認します。
  私はTomcat4.1(tomcat-4.1.24-LE-jdk14.exe)で動作確認しています。
  Apache Tomcatホームページ
- Tomcatにサンプルをコピーする。
  ディレクトリ kandata-home, kandata-hello, kandata-roomreservation を、 ディレクトリをそのまま`%TOMCAT_HOME%/webapps` にコピーしてください。 ディレクトリ構成は、以下のようになっていることを確認します。(kandata-helloの場合)

      %TOMCAT_HOME%/webapps/kandata-hello/WEB-INF/
      %TOMCAT_HOME%/webapps/kandata-hello/WEB-INF/classes/...
      %TOMCAT_HOME%/webapps/kandata-hello/WEB-INF/client_resources/
      %TOMCAT_HOME%/webapps/kandata-hello/WEB-INF/server_resources/

- Tomcatを起動します。
  コピー前に起動していた場合は、念のためtomcatを再起動させてください。
- Webブラウザでサンプルのページに飛びます。
  ローカルで動かしている場合は以下のアドレスになります。(kandata-helloの場合)
  http://localhost:8080/kandata-home/index.html
  あとは、そのページの指示に従ってください。

  ## デバッグモードでの起動

  本来はクライアントとサーバは別プロセスなのですが、同一プロセスで実行します。 JBuilder,Eclipseなどのデバッグ機能（ブレークポイントやウォッチなど）が利用できるため、 デバッグが容易になります。
- Tomcatが起動している場合、Tomcatを停止します。
  Tomcatは必要ありません。
- デバッグモードで起動します。
  java -cp kandata_client.jar kandata.DebugConnector hello.server.HelloServer Antが使える人は以下で起動できます。
  `ant -f hello-build.xml debug`

  ## Webアプリケーションの作り方

  サンプルの会議室予約システムを元に説明します。
- まず、コアの部分の設計をしっかりします。
  サーバ側のデータ構造、クライアント側の大雑把な画面設計、 そしてお互いを結ぶインターフェースを考えます。
  会議室予約システムの場合：
  サーバ側のデータを設計します。 会議室の情報を持つクラス Roomと 予約のクラス `Reservation` です。 これらはサーバとクライアントの両方で扱うため、`roomreservation.common` のパッケージにします。 それ以外は、`roomreservation.client` か `roomreservation.server` のどちらかのパッケージになります。 また、このオブジェクトをコマンドの引数や戻り値として使用するため、 `Serializable`マーカーインターフェースを実装します。
- 次にサーバ・クライアント間のインターフェースを決めます。
  会議室予約システムの場合：
  クライアントが必要な機能は、以下の４つです。
  - 部屋の一覧取得():Roomのリスト
  - 最新の予約状況の一覧取得(日付):Reservationのリスト
  - 予約する(:Reservation):boolean
  - 予約をキャンセルする(:Reservatoin):void
  これを元にコマンド名、引数、戻り値を決定します。
  - 部屋の一覧取得():Roomのリスト

    コマンド | "getRoomList"
    引数 | なし
    戻り値 | Roomのリスト

  - 最新の予約状況の一覧取得(日付):Reservationのリスト

    コマンド | "getReservatoinList"
    引数 | date:String // "20030731"の形式
    戻り値 | Reservationのリスト // 会議室、開始時間の順にソートされている

    ...(以下省略)
  ここまで決まれば、クライアントとサーバを別々に開発を進めることができます。
- サーバ側の開発
  サーバ側は、Serverインターフェースを実装したクラスを作ります。 そして、そのクラスのinvoke()メソッドの中で、コマンドにより処理を振り分けます。 引数をJavaのオブジェクトに戻し、処理を呼び出した後、結果を返します。
- クライアント側の開発
  クライアント側は、Clientインターフェースを実装したクラスを作ります。 そして、そのクラスのinit()メソッドから、クライアントGUIを起動させます。 そのとき、Connectorを引数に渡します。 通常の処理は普通のGUIの作り方と同じです。 サーバを呼ぶときは、connectorのinvoke()メソッドにあらかじめ決めておいた、 コマンド、引数を渡し、結果をキャストして受け取ります。
- デバッグモードによる動作確認
  ある程度できてきたら、DebugConnectorを使って動作確認しましょう。 もしあなたの開発環境がログ出力やブレークポイント、ウォッチなどの機能があれば それらを使ってデバッグすることができます。
- 本番環境に近い環境での動作確認
  DebugConnectorが動くからといって、本番でもキチンと動くとは限りません。 ファイルのパスがその開発マシン固有の値になっていたり、リソースがクライアント側 なのかサーバ側なのか、間違えて作っているかもしれません。 それに複数クライアントから処理しても大丈夫かどうかも確かめなければなりません。 応答時間も確認する必要があります。 必ず本番環境（またはそれに近い環境）でも動作確認しましょう。

  戻る