| Apcoordinator ユーザーズガイド | 
	
		| 目次    | 
15.6 ウィンドウの制御
ウィンドウ制御機能を使うと、サブウィンドウを利用したアプリケーションの作成が容易になります。例えば、以下のようなアプリケーションが実現できます。
 
以降の説明では、「メインウィンドウ」「サブウィンドウ」という用語を次の意味で使用します。
 メインウィンドウ メインウィンドウ
- アプリケーションの実行を開始した時にユーザが使用したブラウザのウィンドウを指します。アプリケーションにはメインウィンドウが1つだけ存在します。 
 サブウィンドウ サブウィンドウ
- アプリケーションの実行中に開いたり閉じたりするウィンドウです。複数のサブウィンドウが使用できます。 
ウィンドウの表示を制御するには、以下のクラスとUJIタグを使用します。
 com.fujitsu.uji.http.Windowクラス com.fujitsu.uji.http.Windowクラス
- 
  ビジネスクラスでWindowクラスのopenメソッドやcloseメソッドを使うことによって、ウィンドウの表示を制御できます。ウィンドウ1個にWindowのオブジェクト1個が対応します。
 com.fujitsu.uji.http.WindowControllerクラス com.fujitsu.uji.http.WindowControllerクラス
- 
  Windowクラスのオブジェクトを管理するクラスです。サブウィンドウを新規作成したり、指定した名前のウィンドウに対応するWindowクラスのオブジェクトを取得したりするために使用します。
 uji:windowControlタグ uji:windowControlタグ
- 
  Windowクラスに対する操作に応じて、ウィンドウを制御するためのFORMタグとJavaScriptを生成します。uji:windowControlタグは制御ページに記述します。 
■JSPの作成
サブウィンドウを利用したアプリケーションでは画面を次のように作成します。
- 各サブウィンドウにそれぞれ異なるウィンドウ名をつけます。メインウィンドウのウィンドウ名は固定で「main」です。
- 各ウィンドウにそれぞれ制御ページを作成します。
制御ページには、uji:windowControlタグを1個記述します。記述位置は、uji:includeタグより後、</BODY>タグより前です。
uji:includeタグのpane属性で指定する領域名は、全制御ページで異なるように指定します。
- 
入出力ページにフォームを作成する場合は、HTMLのFORMタグの代わりに、uji:formタグを使用します。
 
ウィンドウ制御機能を使用する場合、画面の更新を行うためにはリクエストをJSP(制御ページ)で受け取るようにアプリケーションを作成してください。
リクエストをサーブレットで受け取り、レスポンスとして画面(JSP)を返した場合、
ウィンドウ制御機能は使用できません。
■表示の制御
ビジネスクラスでは、WindowクラスとWindowControllerクラスを使用して、次のようにプログラムを作成します。
 サブウィンドウを開く サブウィンドウを開く
- 
サブウィンドウを開くには、Windowクラスのopenメソッドを使用します。以下は、メインウィンドウ上のボタンが押されてた時にサブウィンドウを開く場合の記述例です。
    
    
    | 
    import com.fujitsu.uji.http.Window;
    import com.fujitsu.uji.http.WindowController;
    import com.fujitsu.uji.http.HttpDispatchContext;
    ...
    public void someHandler(DispatchContext context, MyDataBean dataBean) {
        WindowController wCtrl = 
            ((HttpDispatchContext)context).getWindowController();    // (1)
        Window subWin = wCtrl.createWindow("subWindow");             // (2)
        subWin.open("sub.jsp","resizable=yes,width=300,height=300"); // (3)
        context.setResponseBean("subBody",new SubDataBean(),true);   // (4)
        context.setResponseBean("mainBody",dataBean,true);           // (5)
    }
 |  
 
 
  - (1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
  
- (2) WindowControllerのcreateWindowメソッドで、新しいサブウィンドウに対応するWindowオブジェクトを作成します。createWindowの引数にはサブウィンドウ名を指定します。
  
- (3) Windowクラスのopenメソッドでサブウィンドウを開きます。このとき、サブウィンドウで使用する制御ページとウィンドウスタイルを指定します。ウィンドウスタイルは、JavaScriptのWindowオブジェクトのopenメソッドで使用される形式で記述します。
  
- (4) setResponseBeanメソッドを使って、サブウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引数にはtrueを指定し、リクエスト毎にデータBeanが領域に再設定されるように指示します。
  
- (5) setResponseBeanメソッドを使って、メインウィンドウで使用する領域にデータBeanを割り当てます。(4)と同様に、setResponseBeanの第3引数にはtrueを指定してください。
  
 以上のプログラムにより、
  ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが開きます。
 サブウィンドウを閉じる サブウィンドウを閉じる
- 
サブウィンドウを閉じるには、Windowクラスのcloseメソッドを使用します。以下は、メインウィンドウ上のボタンが押された時にサブウィンドウを閉じる例です。
    
    
    | 
    import com.fujitsu.uji.http.Window;
    import com.fujitsu.uji.http.WindowController;
    import com.fujitsu.uji.http.HttpDispatchContext;
    ...
    public void someHandler(DispatchContext context, MyDataBean dataBean) {
        WindowController wCtrl = 
            ((HttpDispatchContext)context).getWindowController();    // (1)
        Window subWin = wCtrl.getWindow("subWindow");                // (2)
        subWin.close();                                              // (3)
        context.setResponseBean("mainBody",dataBean,true);           // (4)
    }
 |  
 
 
  - (1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
  
- (2) WindowControllerのgetWindowメソッドで、サブウィンドウの名前を指定して対応するWindowオブジェクトを取得します。
  
- (3) Windowクラスのcloseメソッドでサブウィンドウを閉じます。
  
- (4) setResponseBeanメソッドを使って、メインウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引数にはtrueを指定してください。
  
 以上のプログラムにより、
  ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが閉じます。
 サブウィンドウ上のボタンによって、そのサブウィンドウ自身を閉じる場合は、上記(4)は不要です。
 別のウィンドウの表示を更新する 別のウィンドウの表示を更新する
- 
画面上のボタンが押された時、そのボタンがあったウィンドウとは別のウィンドウを更新するには、Windowクラスのupdateメソッドを使用します。以下は、サブウィンドウ上のボタンが押されたときにメインウィンドウの表示を更新する例です。
    
    
    | 
    import com.fujitsu.uji.http.Window;
    import com.fujitsu.uji.http.WindowController;
    import com.fujitsu.uji.http.HttpDispatchContext;
    ...
    public void someHandler(DispatchContext context, MyDataBean dataBean) {
        WindowController wCtrl = 
            ((HttpDispatchContext)context).getWindowController();    // (1)
        Window mainWin = wCtrl.getWindow(Window.MAIN_WINDOW);        // (2)
        mainWin.update();                                            // (3)
        context.setResponseBean("mainBody",new MainDataBean(),true); // (4)
        context.setResponseBean("subBody",dataBean,true);            // (5)
    }
 |  
 
 
  - (1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
  
- (2) WindowControllerのgetWindowメソッドで、メインウィンドウの名前を指定して対応するWindowオブジェクトを取得します。Window.MAIN_WINDOW変数は"main"(メインウィンドウの名前)と定義されています。
  
- (3) Windowクラスのupdateメソッドでメインウィンドウの表示を更新します。
  
- (4) setResponseBeanメソッドを使って、メインウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引数にはtrueを指定してください。
  
- (5) setResponseBeanメソッドを使って、サブウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引数にはtrueを指定してください。
  
 以上のプログラムにより、
  ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、メインウィンドウの表示が更新されます。
 
ビジネスクラス作成時は、以下の点に注意してください。
- サブウィンドウの表示中に呼び出されるメソッドでは、setResponseBeanメソッドを呼び出す際に、その第3引数にtrueを指定してください。
Windowクラスのオブジェクトは、セションが終了するまで有効です。したがって、これらをビジネスクラスの変数に一旦保存しておき、後でビジネスクラスが呼び出された時に利用することができます。以下の記述例を参照してください。
    
    
    | 
    import com.fujitsu.uji.http.Window;
    import com.fujitsu.uji.http.WindowController;
    import com.fujitsu.uji.http.HttpDispatchContext;
    ...
    // サブウィンドウのWindowオブジェクトを保存する変数
    Window subWin = null;
    public boolean init() {
       // このビジネスクラスをセションスコープに指定する
       return true;
    }
    // 初回アクセス時に呼び出されるメソッド
    public void startup(DispatchContext context) {
        WindowController wCtrl = 
            ((HttpDispatchContext)context).getWindowController();
        // サブウィンドウのWindowオブジェクトを作成して変数に保存
        subWin = wCtrl.createWindow("subWindow");
        ...
    }
    // サブウィンドウを開くメソッド
    public void openSubWindow(DispatchContext context, MyDataBean dataBean) {
        subWin.open("sub.jsp","resizable=yes,width=300,height=300");
        context.setResponseBean("subBody",new SubDataBean(),true);
        ...        
    }
    // サブウィンドウを閉じるメソッド
    public void closeSubWindow(DispatchContext context, MyDataBean dataBean) {
        subWin.close();
        ...        
    }
 | 
■リクエストの正当性の検査
サブウィンドウを使用したアプリケーションでも、HttpControlStateProfileクラスとuji:controlStateタグを使用することにより、リクエストの正当性を検査することができます。
リクエストの正当性の検査については、高度なセション管理を参照してください。
サブウィンドウを使用したアプリケーションの場合は、
ウィンドウに表示されるフォームそれぞれにuji:controlStateタグを記述します。
正当性は各ウィンドウごとに検査されます。それぞれのウィンドウにおいて、最後に表示された画面からのリクエストが「正当な」リクエストとして扱われます。
■ウィンドウ制御機能使用時の注意事項
ウィンドウ制御機能を使用する場合は、以下の注意事項があります。
- ウィンドウ制御機能を使用した場合、ブラウザにおけるウィンドウ名(JavaScriptのwindow.nameで保持される名前)はApcoordinatorが設定します。Apcoordinatorがブラウザに設定するウィンドウ名は、com.fujitsu.uji.http.WindowクラスのgetIdメソッドで取得できます。
- ブラウザの×ボタンによってすでに閉じられたウィンドウに対してWindowクラスのcloseメソッドを実行すると、小さいウィンドウが一瞬表示される場合があります。
- 
ブラウザの×ボタンによってすでに閉じられたウィンドウに対してWindowクラスのupdateメソッドを使用すると、ウィンドウが開きます。このとき、ウィンドウスタイルは以下のように設定されます。
  
    - ブラウザとしてMicrosoft Internet Explorerを使用している場合、Windowクラスのopenメソッド使用時に指定したウィンドウスタイルとなります。
        ただし、対象のウィンドウがメインウィンドウであり、Windowクラスのopenメソッドがメインウィンドウに対してまだ使用されていない場合は、ブラウザのデフォルトのウィンドウスタイルとなります。
    
- ブラウザとしてNetscapeまたはNetscape Communicatorを使用している場合、ブラウザのデフォルトのウィンドウスタイルとなります。
  
 
All Rights Reserved, Copyright © 富士通株式会社 2000-2005