19. Actionの非同期実行

WebWork2にはActionの非同期実行というか、要するに実行中画面を表示する機能があります。

ExecAndWaitAction

10秒のスリープを10回繰り返し、progress(進捗率)を10づつ上げていくだけのActionです。

public class ExecAndWaitAction extends ActionSupport {
    private int progress;
    public String execute() throws Exception {
        for (int i = 0; i < 10; i++) {
            progress = i * 10;
            Thread.sleep(10000);
        }
        progress = 100;
        return SUCCESS;
    }
    public int getProgress() {
        return progress;
    }
}

xwork.xml

interceptorにexecAndWaitを設定し、resultのsuccessに完了画面(wait_done.vm)、waitに実行中画面(wait.vm)を設定。

<action class="ww2.examples.event.ExecAndWaitAction" name="wait">
    <interceptor-ref name="execAndWait" />
    <result type="dispatcher" name="success">/WEB-INF/vm/wait_done.vm</result>
    <result type="dispatcher" name="wait">/WEB-INF/vm/wait.vm</result>
</action>

wait.vm

メッセージと進捗率を表示。5秒経つとリロードします。

<html>
<head>
<META HTTP-EQUIV="Refresh" CONTENT="5" />
<title>処理中画面</title>
</head>
<body>
しばらくお待ちください。($progress%完了)
</body>
</html>

wait_done.vm

ただの完了画面です。

<html>
<head>
<title>完了画面</title>
</head>
<body>
処理が完了しました。
</body>
</html>

結果

wait.actionを実行すると処理中画面(wait.vm)が表示され、リロードした時にActionの処理が終わっていない場合は処理中画面(wait.vm)を表示し、終わっている場合は完了画面(wait_done.vm)を表示します。