Apcoordinator ユーザーズガイド
目次 前ページ次ページ

第3部 Webアプリケーションの開発> 第15章 UJIタグを使ったプログラミング

15.6 ウィンドウの制御

ウィンドウ制御機能を使うと、サブウィンドウを利用したアプリケーションの作成が容易になります。例えば、以下のようなアプリケーションが実現できます。

サブウィンドウを利用したアプリケーション

以降の説明では、「メインウィンドウ」「サブウィンドウ」という用語を次の意味で使用します。

・メインウィンドウ
アプリケーションの実行を開始した時にユーザが使用したブラウザのウィンドウを指します。アプリケーションにはメインウィンドウが1つだけ存在します。
・サブウィンドウ
アプリケーションの実行中に開いたり閉じたりするウィンドウです。複数のサブウィンドウが使用できます。

ウィンドウの表示を制御するには、以下のクラスとUJIタグを使用します。

・com.fujitsu.uji.http.Windowクラス
ビジネスクラスでWindowクラスのopenメソッドやcloseメソッドを使うことによって、ウィンドウの表示を制御できます。ウィンドウ1個にWindowのオブジェクト1個が対応します。
・com.fujitsu.uji.http.WindowControllerクラス
Windowクラスのオブジェクトを管理するクラスです。サブウィンドウを新規作成したり、指定した名前のウィンドウに対応するWindowクラスのオブジェクトを取得したりするために使用します。
・uji:windowControlタグ
Windowクラスに対する操作に応じて、ウィンドウを制御するためのFORMタグとJavaScriptを生成します。uji:windowControlタグは制御ページに記述します。

■JSPの作成

サブウィンドウを利用したアプリケーションでは画面を次のように作成します。

制御ページと入出力ページの作成

ウィンドウ制御機能を使用する場合、画面の更新を行うためにはリクエストを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)
    }
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが開きます。
・サブウィンドウを閉じる
サブウィンドウを閉じるには、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)
    }
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが閉じます。
サブウィンドウ上のボタンによって、そのサブウィンドウ自身を閉じる場合は、上記(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)
    }
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、メインウィンドウの表示が更新されます。

ビジネスクラス作成時は、以下の点に注意してください。

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タグを記述します。 正当性は各ウィンドウごとに検査されます。それぞれのウィンドウにおいて、最後に表示された画面からのリクエストが「正当な」リクエストとして扱われます。

■ウィンドウ制御機能使用時の注意事項

ウィンドウ制御機能を使用する場合は、以下の注意事項があります。
目次 前ページ次ページ

All Rights Reserved, Copyright © 富士通株式会社 2000-2005